xref: /vim-8.2.3635/runtime/ftplugin/cobol.vim (revision 3d1cde8a)
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