Mercurial > vim
annotate runtime/ftplugin/cobol.vim @ 34277:0386bb1f6e2f
Added tag v9.1.0076 for changeset 6d04d3e04acadbc8f68b30f8345c632de447f9e1
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 04 Feb 2024 10:45:06 +0100 |
parents | 8ae680be2a51 |
children |
rev | line source |
---|---|
1121 | 1 " Vim filetype plugin file |
2 " Language: cobol | |
16086 | 3 " Maintainer: Ankit Jain <ajatkj@yahoo.co.in> |
4 " (formerly Tim Pope <vimNOSPAM@tpope.info>) | |
21825 | 5 " Last Update: By Ankit Jain (add gtk support) on 15.08.2020 |
34134
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
6 " 2024 Jan 14 by Vim Project (browsefilter) |
1121 | 7 |
8 " Insert mode mappings: <C-T> <C-D> <Tab> | |
9 " Normal mode mappings: < > << >> [[ ]] [] ][ | |
10 " Visual mode mappings: < > | |
11 | |
12 if exists("b:did_ftplugin") | |
13 finish | |
14 endif | |
15 let b:did_ftplugin = 1 | |
16 | |
17 let s:cpo_save = &cpo | |
18 set cpo&vim | |
19 | |
20 setlocal commentstring=\ \ \ \ \ \ *%s | |
21 setlocal comments=:* | |
22 setlocal fo+=croqlt | |
23 setlocal expandtab | |
24 setlocal textwidth=72 | |
25 | |
26 " matchit support | |
27 if exists("loaded_matchit") | |
28 let s:ordot = '\|\ze\.\%( \@=\|$\)' | |
29 let b:match_ignorecase=1 | |
30 "let b:match_skip = 'getline(".") =~ "^.\\{6\\}[*/C]"' | |
31 let b:match_words= | |
32 \ '\$if\>:$else\>:\$endif\>,' . | |
33 \ '[$-]\@<!\<if\>:\<\%(then\|else\)\>:\<end-if\>'.s:ordot.',' . | |
34 \ '-\@<!\<perform\s\+\%(\d\+\s\+times\|until\|varying\|with\s\+test\)\>:\<end-perform\>'.s:ordot . ',' . | |
35 \ '-\@<!\<\%(search\|evaluate\)\>:\<\%(when\)\>:\<end-\%(search\|evaluate\)\>' .s:ordot . ',' . | |
36 \ '-\@<!\<\%(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 . ',' . | |
37 \ '-\@<!\<\%(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 . ',' . | |
38 \ '-\@<!\<\%(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 | |
39 endif | |
40 | |
21825 | 41 " add gtk support |
42 if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter") | |
34134
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
43 let b:browsefilter = "COBOL Source Files (*.cbl, *.cob)\t*.cbl;*.cob;*.lib\n" |
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
44 if has("win32") |
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
45 let b:browsefilter .= "All Files (*.*)\t*\n" |
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
46 else |
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
47 let b:browsefilter .= "All Files (*)\t*\n" |
8ae680be2a51
runtime(ftplugin): Use "*" browsefilter pattern to match "All Files"
Christian Brabandt <cb@256bit.org>
parents:
21825
diff
changeset
|
48 endif |
1121 | 49 endif |
50 | |
51 let b:undo_ftplugin = "setlocal com< cms< fo< et< tw<" . | |
52 \ " | unlet! b:browsefilter b:match_words b:match_ignorecase b:match_skip" | |
53 if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps") | |
54 let b:undo_ftplugin = b:undo_ftplugin . | |
55 \ " | sil! exe 'nunmap <buffer> <'" . | |
56 \ " | sil! exe 'nunmap <buffer> >'" . | |
57 \ " | sil! exe 'nunmap <buffer> <<'" . | |
58 \ " | sil! exe 'nunmap <buffer> >>'" . | |
59 \ " | sil! exe 'vunmap <buffer> <'" . | |
60 \ " | sil! exe 'vunmap <buffer> >'" . | |
61 \ " | sil! exe 'iunmap <buffer> <C-D>'" . | |
62 \ " | sil! exe 'iunmap <buffer> <C-T>'" . | |
63 \ " | sil! exe 'iunmap <buffer> <Tab>'" . | |
64 \ " | sil! exe 'nunmap <buffer> <Plug>Traditional'" . | |
65 \ " | sil! exe 'nunmap <buffer> <Plug>Comment'" . | |
66 \ " | sil! exe 'nunmap <buffer> <Plug>DeComment'" . | |
67 \ " | sil! exe 'vunmap <buffer> <Plug>VisualTraditional'" . | |
68 \ " | sil! exe 'vunmap <buffer> <Plug>VisualComment'" . | |
69 \ " | sil! exe 'iunmap <buffer> <Plug>VisualDeComment'" . | |
70 \ " | sil! exe 'unmap <buffer> [['" . | |
71 \ " | sil! exe 'unmap <buffer> ]]'" . | |
72 \ " | sil! exe 'unmap <buffer> []'" . | |
73 \ " | sil! exe 'unmap <buffer> ]['" | |
74 endif | |
75 | |
76 if !exists("g:no_plugin_maps") && !exists("g:no_cobol_maps") | |
77 if version >= 700 | |
78 nnoremap <silent> <buffer> > :set opfunc=<SID>IncreaseFunc<CR>g@ | |
79 nnoremap <silent> <buffer> < :set opfunc=<SID>DecreaseFunc<CR>g@ | |
80 endif | |
81 nnoremap <silent> <buffer> >> :call CobolIndentBlock(1)<CR> | |
82 nnoremap <silent> <buffer> << :call CobolIndentBlock(-1)<CR> | |
83 vnoremap <silent> <buffer> > :call CobolIndentBlock(v:count1)<CR> | |
84 vnoremap <silent> <buffer> < :call CobolIndentBlock(-v:count1)<CR> | |
85 inoremap <silent> <buffer> <C-T> <C-R>=<SID>IncreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR> | |
86 inoremap <silent> <buffer> <C-D> <C-R>=<SID>DecreaseIndent()<CR><C-R>=<SID>RestoreShiftwidth()<CR> | |
87 if !maparg("<Tab>","i") | |
88 inoremap <silent> <buffer> <Tab> <C-R>=<SID>Tab()<CR><C-R>=<SID>RestoreShiftwidth()<CR> | |
89 endif | |
90 noremap <silent> <buffer> [[ m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\s*\.','bW')<CR> | |
91 noremap <silent> <buffer> ]] m':call search('\c^\%(\s*\<Bar>.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\<Bar>section\)\.','W')<CR> | |
92 noremap <silent> <buffer> [] m':call <SID>toend('b')<CR> | |
93 noremap <silent> <buffer> ][ m':call <SID>toend('')<CR> | |
94 " For EnhancedCommentify | |
95 noremap <silent> <buffer> <Plug>Traditional :call <SID>Comment('t')<CR> | |
96 noremap <silent> <buffer> <Plug>Comment :call <SID>Comment('c')<CR> | |
97 noremap <silent> <buffer> <Plug>DeComment :call <SID>Comment('u')<CR> | |
98 noremap <silent> <buffer> <Plug>VisualTraditional :'<,'>call <SID>Comment('t')<CR> | |
99 noremap <silent> <buffer> <Plug>VisualComment :'<,'>call <SID>Comment('c')<CR> | |
100 noremap <silent> <buffer> <Plug>VisualDeComment :'<,'>call <SID>Comment('u')<CR> | |
101 endif | |
102 | |
103 let &cpo = s:cpo_save | |
104 unlet s:cpo_save | |
105 | |
106 if exists("g:did_cobol_ftplugin_functions") | |
107 finish | |
108 endif | |
109 let g:did_cobol_ftplugin_functions = 1 | |
110 | |
111 function! s:repeat(str,count) | |
112 let i = 0 | |
113 let ret = "" | |
114 while i < a:count | |
115 let ret = ret . a:str | |
116 let i = i + 1 | |
117 endwhile | |
118 return ret | |
119 endfunction | |
120 | |
121 function! s:increase(...) | |
122 let lnum = '.' | |
5618 | 123 let sw = shiftwidth() |
1121 | 124 let i = a:0 ? a:1 : indent(lnum) |
125 if i >= 11 | |
126 return sw - (i - 11) % sw | |
127 elseif i >= 7 | |
128 return 11-i | |
129 elseif i == 6 | |
130 return 1 | |
131 else | |
132 return 6-i | |
133 endif | |
134 endfunction | |
135 | |
136 function! s:decrease(...) | |
137 let lnum = '.' | |
5618 | 138 let sw = shiftwidth() |
1121 | 139 let i = indent(a:0 ? a:1 : lnum) |
140 if i >= 11 + sw | |
141 return 1 + (i + 12) % sw | |
142 elseif i > 11 | |
143 return i-11 | |
144 elseif i > 7 | |
145 return i-7 | |
146 elseif i == 7 | |
147 return 1 | |
148 else | |
149 return i | |
150 endif | |
151 endfunction | |
152 | |
153 function! CobolIndentBlock(shift) | |
154 let head = strpart(getline('.'),0,7) | |
155 let tail = strpart(getline('.'),7) | |
156 let indent = match(tail,'[^ ]') | |
5618 | 157 let sw = shiftwidth() |
1121 | 158 let shift = a:shift |
159 if shift > 0 | |
160 if indent < 4 | |
161 let tail = s:repeat(" ",4-indent).tail | |
162 let shift = shift - 1 | |
163 endif | |
164 let tail = s:repeat(" ",shift*sw).tail | |
165 let shift = 0 | |
166 elseif shift < 0 | |
167 if (indent-4) > -shift * sw | |
168 let tail = strpart(tail,-shift * sw) | |
169 elseif (indent-4) > (-shift-1) * sw | |
170 let tail = strpart(tail,indent - 4) | |
171 else | |
172 let tail = strpart(tail,indent) | |
173 endif | |
174 endif | |
175 call setline('.',head.tail) | |
176 endfunction | |
177 | |
178 function! s:IncreaseFunc(type) | |
179 '[,']call CobolIndentBlock(1) | |
180 endfunction | |
181 | |
182 function! s:DecreaseFunc(type) | |
183 '[,']call CobolIndentBlock(-1) | |
184 endfunction | |
185 | |
186 function! s:IncreaseIndent() | |
187 let c = "\<C-T>" | |
188 if exists("*InsertCtrlTWrapper") | |
189 let key = InsertCtrlTWrapper() | |
190 if key != c | |
191 return key | |
192 endif | |
193 endif | |
194 let interval = s:increase() | |
195 let b:cobol_shiftwidth = &shiftwidth | |
196 let &shiftwidth = 1 | |
197 let lastchar = strpart(getline('.'),col('.')-2,1) | |
198 if lastchar == '0' || lastchar == '^' | |
199 return "\<BS>".lastchar.c | |
200 else | |
201 return s:repeat(c,interval) | |
202 endif | |
203 endfunction | |
204 | |
205 function! s:DecreaseIndent() | |
206 let c = "\<C-D>" | |
207 if exists("*InsertCtrlDWrapper") | |
208 " I hack Ctrl-D to delete when not at the end of the line. | |
209 let key = InsertCtrlDWrapper() | |
210 if key != c | |
211 return key | |
212 endif | |
213 endif | |
214 let interval = s:decrease() | |
215 let b:cobol_shiftwidth = &shiftwidth | |
216 let &shiftwidth = 1 | |
217 return s:repeat(c,interval) | |
218 endfunction | |
219 | |
220 function! s:RestoreShiftwidth() | |
221 if exists("b:cobol_shiftwidth") | |
222 let &shiftwidth=b:cobol_shiftwidth | |
223 unlet b:cobol_shiftwidth | |
224 endif | |
225 return "" | |
226 endfunction | |
227 | |
228 function! s:Tab() | |
229 if (strpart(getline('.'),0,col('.')-1) =~ '^\s*$' && &sta) | |
230 return s:IncreaseIndent() | |
5618 | 231 " &softtabstop < 0: &softtabstop follows &shiftwidth |
232 elseif (&sts < 0 || &sts == shiftwidth()) && &sts != 8 && &et | |
1121 | 233 return s:repeat(" ",s:increase(col('.')-1)) |
234 else | |
235 return "\<Tab>" | |
236 endif | |
237 endfunction | |
238 | |
239 function! s:Comment(arg) | |
240 " For EnhancedCommentify | |
241 let line = getline('.') | |
242 if (line =~ '^.\{6\}[*/C]' || a:arg == 'c') && a:arg != 'u' | |
243 let line = substitute(line,'^.\{6\}\zs.',' ','') | |
244 else | |
245 let line = substitute(line,'^.\{6\}\zs.','*','') | |
246 endif | |
247 call setline('.',line) | |
248 endfunction | |
249 | |
250 function! s:toend(direction) | |
251 let ignore = '^\(\s*\|.\{6\}\)\%([*/]\|\s*$\)' | |
252 let keep = line('.') | |
253 keepjumps + | |
254 while line('.') < line('$') && getline('.') =~ ignore | |
255 keepjumps + | |
256 endwhile | |
257 let res = search('\c^\%(\s*\|.\{6\}\s\+\)\zs[A-Za-z0-9-]\+\s\+\%(division\|section\)\s*\.',a:direction.'W') | |
258 if a:direction != 'b' && !res | |
259 let res = line('$') | |
260 keepjumps $ | |
261 elseif res | |
262 keepjumps - | |
263 endif | |
264 if res | |
265 while line('.') > 1 && getline('.') =~ ignore | |
266 keepjumps - | |
267 endwhile | |
268 if line('.') == 1 && getline('.') =~ ignore | |
269 exe "keepjumps ".keep | |
270 endif | |
271 else | |
272 exe "keepjumps ".keep | |
273 endif | |
274 endfunction |