19964e468SBram Moolenaar" Vim filetype plugin file 29964e468SBram Moolenaar" Language: cobol 363b74a83SBram Moolenaar" Maintainer: Ankit Jain <[email protected]> 463b74a83SBram Moolenaar" (formerly Tim Pope <[email protected]>) 5*3d1cde8aSBram Moolenaar" Last Update: By Ankit Jain (add gtk support) on 15.08.2020 69964e468SBram Moolenaar 79964e468SBram Moolenaar" Insert mode mappings: <C-T> <C-D> <Tab> 89964e468SBram Moolenaar" Normal mode mappings: < > << >> [[ ]] [] ][ 99964e468SBram Moolenaar" Visual mode mappings: < > 109964e468SBram Moolenaar 119964e468SBram Moolenaarif exists("b:did_ftplugin") 129964e468SBram Moolenaar finish 139964e468SBram Moolenaarendif 149964e468SBram Moolenaarlet b:did_ftplugin = 1 159964e468SBram Moolenaar 169964e468SBram Moolenaarlet s:cpo_save = &cpo 179964e468SBram Moolenaarset cpo&vim 189964e468SBram Moolenaar 199964e468SBram Moolenaarsetlocal commentstring=\ \ \ \ \ \ *%s 209964e468SBram Moolenaarsetlocal comments=:* 219964e468SBram Moolenaarsetlocal fo+=croqlt 229964e468SBram Moolenaarsetlocal expandtab 239964e468SBram Moolenaarsetlocal textwidth=72 249964e468SBram Moolenaar 259964e468SBram Moolenaar" matchit support 269964e468SBram Moolenaarif exists("loaded_matchit") 279964e468SBram Moolenaar let s:ordot = '\|\ze\.\%( \@=\|$\)' 289964e468SBram Moolenaar let b:match_ignorecase=1 299964e468SBram Moolenaar "let b:match_skip = 'getline(".") =~ "^.\\{6\\}[*/C]"' 309964e468SBram Moolenaar let b:match_words= 319964e468SBram Moolenaar \ '\$if\>:$else\>:\$endif\>,' . 329964e468SBram Moolenaar \ '[$-]\@<!\<if\>:\<\%(then\|else\)\>:\<end-if\>'.s:ordot.',' . 339964e468SBram Moolenaar \ '-\@<!\<perform\s\+\%(\d\+\s\+times\|until\|varying\|with\s\+test\)\>:\<end-perform\>'.s:ordot . ',' . 349964e468SBram Moolenaar \ '-\@<!\<\%(search\|evaluate\)\>:\<\%(when\)\>:\<end-\%(search\|evaluate\)\>' .s:ordot . ',' . 359964e468SBram Moolenaar \ '-\@<!\<\%(add\|compute\|divide\|multiply\|subtract\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+size\s\+error\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+size\s\+error\>:\<end-\%(add\|compute\|divide\|multiply\|subtract\)\>' .s:ordot . ',' . 369964e468SBram Moolenaar \ '-\@<!\<\%(string\|unstring\|accept\|display\|call\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=on\s\+\%(overflow\|exception\)\>:\<end-\%(string\|unstring\|accept\|display\|call\)\>' .s:ordot . ',' . 379964e468SBram Moolenaar \ '-\@<!\<\%(delete\|rewrite\|start\|write\|read\)\>\%(.*\(\%$\|\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>\)\)\@=:\%(\<not\s\+\)\@<!\<\%(not\s\+\)\=\%(invalid\s\+key\|at\s\+end\|no\s\+data\|at\s\+end-of-page\)\>:\<end-\%(delete\|rewrite\|start\|write\|read\)\>' .s:ordot 389964e468SBram Moolenaarendif 399964e468SBram Moolenaar 40*3d1cde8aSBram Moolenaar" add gtk support 41*3d1cde8aSBram Moolenaarif (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") 429964e468SBram Moolenaar let b:browsefilter = "COBOL Source Files (*.cbl, *.cob)\t*.cbl;*.cob;*.lib\n". 439964e468SBram Moolenaar \ "All Files (*.*)\t*.*\n" 449964e468SBram Moolenaarendif 459964e468SBram Moolenaar 469964e468SBram Moolenaarlet b:undo_ftplugin = "setlocal com< cms< fo< et< tw<" . 479964e468SBram Moolenaar \ " | unlet! b:browsefilter b:match_words b:match_ignorecase b:match_skip" 489964e468SBram Moolenaarif !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps") 499964e468SBram Moolenaar let b:undo_ftplugin = b:undo_ftplugin . 509964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> <'" . 519964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> >'" . 529964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> <<'" . 539964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> >>'" . 549964e468SBram Moolenaar \ " | sil! exe 'vunmap <buffer> <'" . 559964e468SBram Moolenaar \ " | sil! exe 'vunmap <buffer> >'" . 569964e468SBram Moolenaar \ " | sil! exe 'iunmap <buffer> <C-D>'" . 579964e468SBram Moolenaar \ " | sil! exe 'iunmap <buffer> <C-T>'" . 589964e468SBram Moolenaar \ " | sil! exe 'iunmap <buffer> <Tab>'" . 599964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> <Plug>Traditional'" . 609964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> <Plug>Comment'" . 619964e468SBram Moolenaar \ " | sil! exe 'nunmap <buffer> <Plug>DeComment'" . 629964e468SBram Moolenaar \ " | sil! exe 'vunmap <buffer> <Plug>VisualTraditional'" . 639964e468SBram Moolenaar \ " | sil! exe 'vunmap <buffer> <Plug>VisualComment'" . 649964e468SBram Moolenaar \ " | sil! exe 'iunmap <buffer> <Plug>VisualDeComment'" . 659964e468SBram Moolenaar \ " | sil! exe 'unmap <buffer> [['" . 669964e468SBram Moolenaar \ " | sil! exe 'unmap <buffer> ]]'" . 679964e468SBram Moolenaar \ " | sil! exe 'unmap <buffer> []'" . 689964e468SBram Moolenaar \ " | sil! exe 'unmap <buffer> ]['" 699964e468SBram Moolenaarendif 709964e468SBram Moolenaar 719964e468SBram Moolenaarif !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps") 729964e468SBram Moolenaar if version >= 700 739964e468SBram Moolenaar nnoremap <silent> <buffer> > :set opfunc=<SID>IncreaseFunc<CR>g@ 749964e468SBram Moolenaar nnoremap <silent> <buffer> < :set opfunc=<SID>DecreaseFunc<CR>g@ 759964e468SBram Moolenaar endif 769964e468SBram Moolenaar nnoremap <silent> <buffer> >> :call CobolIndentBlock(1)<CR> 779964e468SBram Moolenaar nnoremap <silent> <buffer> << :call CobolIndentBlock(-1)<CR> 789964e468SBram Moolenaar vnoremap <silent> <buffer> > :call CobolIndentBlock(v:count1)<CR> 799964e468SBram Moolenaar vnoremap <silent> <buffer> < :call CobolIndentBlock(-v:count1)<CR> 809964e468SBram Moolenaar inoremap <silent> <buffer> <C-T> <C-R>=<SID>IncreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR> 819964e468SBram Moolenaar inoremap <silent> <buffer> <C-D> <C-R>=<SID>DecreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR> 829964e468SBram Moolenaar if !maparg("<Tab>","i") 839964e468SBram Moolenaar inoremap <silent> <buffer> <Tab> <C-R>=<SID>Tab()<CR><C-R>=<SID>RestoreShiftwidth()<CR> 849964e468SBram Moolenaar endif 859964e468SBram Moolenaar noremap <silent> <buffer> [[ m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\s*\.','bW')<CR> 869964e468SBram Moolenaar noremap <silent> <buffer> ]] m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\.','W')<CR> 879964e468SBram Moolenaar noremap <silent> <buffer> [] m':call <SID>toend('b')<CR> 889964e468SBram Moolenaar noremap <silent> <buffer> ][ m':call <SID>toend('')<CR> 899964e468SBram Moolenaar " For EnhancedCommentify 909964e468SBram Moolenaar noremap <silent> <buffer> <Plug>Traditional :call <SID>Comment('t')<CR> 919964e468SBram Moolenaar noremap <silent> <buffer> <Plug>Comment :call <SID>Comment('c')<CR> 929964e468SBram Moolenaar noremap <silent> <buffer> <Plug>DeComment :call <SID>Comment('u')<CR> 939964e468SBram Moolenaar noremap <silent> <buffer> <Plug>VisualTraditional :'<,'>call <SID>Comment('t')<CR> 949964e468SBram Moolenaar noremap <silent> <buffer> <Plug>VisualComment :'<,'>call <SID>Comment('c')<CR> 959964e468SBram Moolenaar noremap <silent> <buffer> <Plug>VisualDeComment :'<,'>call <SID>Comment('u')<CR> 969964e468SBram Moolenaarendif 979964e468SBram Moolenaar 989964e468SBram Moolenaarlet &cpo = s:cpo_save 999964e468SBram Moolenaarunlet s:cpo_save 1009964e468SBram Moolenaar 1019964e468SBram Moolenaarif exists("g:did_cobol_ftplugin_functions") 1029964e468SBram Moolenaar finish 1039964e468SBram Moolenaarendif 1049964e468SBram Moolenaarlet g:did_cobol_ftplugin_functions = 1 1059964e468SBram Moolenaar 1069964e468SBram Moolenaarfunction! s:repeat(str,count) 1079964e468SBram Moolenaar let i = 0 1089964e468SBram Moolenaar let ret = "" 1099964e468SBram Moolenaar while i < a:count 1109964e468SBram Moolenaar let ret = ret . a:str 1119964e468SBram Moolenaar let i = i + 1 1129964e468SBram Moolenaar endwhile 1139964e468SBram Moolenaar return ret 1149964e468SBram Moolenaarendfunction 1159964e468SBram Moolenaar 1169964e468SBram Moolenaarfunction! s:increase(...) 1179964e468SBram Moolenaar let lnum = '.' 1188d043171SBram Moolenaar let sw = shiftwidth() 1199964e468SBram Moolenaar let i = a:0 ? a:1 : indent(lnum) 1209964e468SBram Moolenaar if i >= 11 1219964e468SBram Moolenaar return sw - (i - 11) % sw 1229964e468SBram Moolenaar elseif i >= 7 1239964e468SBram Moolenaar return 11-i 1249964e468SBram Moolenaar elseif i == 6 1259964e468SBram Moolenaar return 1 1269964e468SBram Moolenaar else 1279964e468SBram Moolenaar return 6-i 1289964e468SBram Moolenaar endif 1299964e468SBram Moolenaarendfunction 1309964e468SBram Moolenaar 1319964e468SBram Moolenaarfunction! s:decrease(...) 1329964e468SBram Moolenaar let lnum = '.' 1338d043171SBram Moolenaar let sw = shiftwidth() 1349964e468SBram Moolenaar let i = indent(a:0 ? a:1 : lnum) 1359964e468SBram Moolenaar if i >= 11 + sw 1369964e468SBram Moolenaar return 1 + (i + 12) % sw 1379964e468SBram Moolenaar elseif i > 11 1389964e468SBram Moolenaar return i-11 1399964e468SBram Moolenaar elseif i > 7 1409964e468SBram Moolenaar return i-7 1419964e468SBram Moolenaar elseif i == 7 1429964e468SBram Moolenaar return 1 1439964e468SBram Moolenaar else 1449964e468SBram Moolenaar return i 1459964e468SBram Moolenaar endif 1469964e468SBram Moolenaarendfunction 1479964e468SBram Moolenaar 1489964e468SBram Moolenaarfunction! CobolIndentBlock(shift) 1499964e468SBram Moolenaar let head = strpart(getline('.'),0,7) 1509964e468SBram Moolenaar let tail = strpart(getline('.'),7) 1519964e468SBram Moolenaar let indent = match(tail,'[^ ]') 1528d043171SBram Moolenaar let sw = shiftwidth() 1539964e468SBram Moolenaar let shift = a:shift 1549964e468SBram Moolenaar if shift > 0 1559964e468SBram Moolenaar if indent < 4 1569964e468SBram Moolenaar let tail = s:repeat(" ",4-indent).tail 1579964e468SBram Moolenaar let shift = shift - 1 1589964e468SBram Moolenaar endif 1599964e468SBram Moolenaar let tail = s:repeat(" ",shift*sw).tail 1609964e468SBram Moolenaar let shift = 0 1619964e468SBram Moolenaar elseif shift < 0 1629964e468SBram Moolenaar if (indent-4) > -shift * sw 1639964e468SBram Moolenaar let tail = strpart(tail,-shift * sw) 1649964e468SBram Moolenaar elseif (indent-4) > (-shift-1) * sw 1659964e468SBram Moolenaar let tail = strpart(tail,indent - 4) 1669964e468SBram Moolenaar else 1679964e468SBram Moolenaar let tail = strpart(tail,indent) 1689964e468SBram Moolenaar endif 1699964e468SBram Moolenaar endif 1709964e468SBram Moolenaar call setline('.',head.tail) 1719964e468SBram Moolenaarendfunction 1729964e468SBram Moolenaar 1739964e468SBram Moolenaarfunction! s:IncreaseFunc(type) 1749964e468SBram Moolenaar '[,']call CobolIndentBlock(1) 1759964e468SBram Moolenaarendfunction 1769964e468SBram Moolenaar 1779964e468SBram Moolenaarfunction! s:DecreaseFunc(type) 1789964e468SBram Moolenaar '[,']call CobolIndentBlock(-1) 1799964e468SBram Moolenaarendfunction 1809964e468SBram Moolenaar 1819964e468SBram Moolenaarfunction! s:IncreaseIndent() 1829964e468SBram Moolenaar let c = "\<C-T>" 1839964e468SBram Moolenaar if exists("*InsertCtrlTWrapper") 1849964e468SBram Moolenaar let key = InsertCtrlTWrapper() 1859964e468SBram Moolenaar if key != c 1869964e468SBram Moolenaar return key 1879964e468SBram Moolenaar endif 1889964e468SBram Moolenaar endif 1899964e468SBram Moolenaar let interval = s:increase() 1909964e468SBram Moolenaar let b:cobol_shiftwidth = &shiftwidth 1919964e468SBram Moolenaar let &shiftwidth = 1 1929964e468SBram Moolenaar let lastchar = strpart(getline('.'),col('.')-2,1) 1939964e468SBram Moolenaar if lastchar == '0' || lastchar == '^' 1949964e468SBram Moolenaar return "\<BS>".lastchar.c 1959964e468SBram Moolenaar else 1969964e468SBram Moolenaar return s:repeat(c,interval) 1979964e468SBram Moolenaar endif 1989964e468SBram Moolenaarendfunction 1999964e468SBram Moolenaar 2009964e468SBram Moolenaarfunction! s:DecreaseIndent() 2019964e468SBram Moolenaar let c = "\<C-D>" 2029964e468SBram Moolenaar if exists("*InsertCtrlDWrapper") 2039964e468SBram Moolenaar " I hack Ctrl-D to delete when not at the end of the line. 2049964e468SBram Moolenaar let key = InsertCtrlDWrapper() 2059964e468SBram Moolenaar if key != c 2069964e468SBram Moolenaar return key 2079964e468SBram Moolenaar endif 2089964e468SBram Moolenaar endif 2099964e468SBram Moolenaar let interval = s:decrease() 2109964e468SBram Moolenaar let b:cobol_shiftwidth = &shiftwidth 2119964e468SBram Moolenaar let &shiftwidth = 1 2129964e468SBram Moolenaar return s:repeat(c,interval) 2139964e468SBram Moolenaarendfunction 2149964e468SBram Moolenaar 2159964e468SBram Moolenaarfunction! s:RestoreShiftwidth() 2169964e468SBram Moolenaar if exists("b:cobol_shiftwidth") 2179964e468SBram Moolenaar let &shiftwidth=b:cobol_shiftwidth 2189964e468SBram Moolenaar unlet b:cobol_shiftwidth 2199964e468SBram Moolenaar endif 2209964e468SBram Moolenaar return "" 2219964e468SBram Moolenaarendfunction 2229964e468SBram Moolenaar 2239964e468SBram Moolenaarfunction! s:Tab() 2249964e468SBram Moolenaar if (strpart(getline('.'),0,col('.')-1) =~ '^\s*$' && &sta) 2259964e468SBram Moolenaar return s:IncreaseIndent() 2268d043171SBram Moolenaar " &softtabstop < 0: &softtabstop follows &shiftwidth 2278d043171SBram Moolenaar elseif (&sts < 0 || &sts == shiftwidth()) && &sts != 8 && &et 2289964e468SBram Moolenaar return s:repeat(" ",s:increase(col('.')-1)) 2299964e468SBram Moolenaar else 2309964e468SBram Moolenaar return "\<Tab>" 2319964e468SBram Moolenaar endif 2329964e468SBram Moolenaarendfunction 2339964e468SBram Moolenaar 2349964e468SBram Moolenaarfunction! s:Comment(arg) 2359964e468SBram Moolenaar " For EnhancedCommentify 2369964e468SBram Moolenaar let line = getline('.') 2379964e468SBram Moolenaar if (line =~ '^.\{6\}[*/C]' || a:arg == 'c') && a:arg != 'u' 2389964e468SBram Moolenaar let line = substitute(line,'^.\{6\}\zs.',' ','') 2399964e468SBram Moolenaar else 2409964e468SBram Moolenaar let line = substitute(line,'^.\{6\}\zs.','*','') 2419964e468SBram Moolenaar endif 2429964e468SBram Moolenaar call setline('.',line) 2439964e468SBram Moolenaarendfunction 2449964e468SBram Moolenaar 2459964e468SBram Moolenaarfunction! s:toend(direction) 2469964e468SBram Moolenaar let ignore = '^\(\s*\|.\{6\}\)\%([*/]\|\s*$\)' 2479964e468SBram Moolenaar let keep = line('.') 2489964e468SBram Moolenaar keepjumps + 2499964e468SBram Moolenaar while line('.') < line('$') && getline('.') =~ ignore 2509964e468SBram Moolenaar keepjumps + 2519964e468SBram Moolenaar endwhile 2529964e468SBram Moolenaar let res = search('\c^\%(\s*\|.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\|section\)\s*\.',a:direction.'W') 2539964e468SBram Moolenaar if a:direction != 'b' && !res 2549964e468SBram Moolenaar let res = line('$') 2559964e468SBram Moolenaar keepjumps $ 2569964e468SBram Moolenaar elseif res 2579964e468SBram Moolenaar keepjumps - 2589964e468SBram Moolenaar endif 2599964e468SBram Moolenaar if res 2609964e468SBram Moolenaar while line('.') > 1 && getline('.') =~ ignore 2619964e468SBram Moolenaar keepjumps - 2629964e468SBram Moolenaar endwhile 2639964e468SBram Moolenaar if line('.') == 1 && getline('.') =~ ignore 2649964e468SBram Moolenaar exe "keepjumps ".keep 2659964e468SBram Moolenaar endif 2669964e468SBram Moolenaar else 2679964e468SBram Moolenaar exe "keepjumps ".keep 2689964e468SBram Moolenaar endif 2699964e468SBram Moolenaarendfunction 270