xref: /vim-8.2.3635/runtime/menu.vim (revision 325b7a2f)
1" Vim support file to define the default menus
2" You can also use this as a start for your own set of menus.
3"
4" Maintainer:	Bram Moolenaar <[email protected]>
5" Last Change:	2004 May 26
6
7" Note that ":an" (short for ":anoremenu") is often used to make a menu work
8" in all modes and avoid side effects from mappings defined by the user.
9
10" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
11" <CR> would not be recognized.  See ":help 'cpoptions'".
12let s:cpo_save = &cpo
13set cpo&vim
14
15" Avoid installing the menus twice
16if !exists("did_install_default_menus")
17let did_install_default_menus = 1
18
19
20if exists("v:lang") || &langmenu != ""
21  " Try to find a menu translation file for the current language.
22  if &langmenu != ""
23    if &langmenu =~ "none"
24      let s:lang = ""
25    else
26      let s:lang = &langmenu
27    endif
28  else
29    let s:lang = v:lang
30  endif
31  " A language name must be at least two characters, don't accept "C"
32  if strlen(s:lang) > 1
33    " When the language does not include the charset add 'encoding'
34    if s:lang =~ '^\a\a$\|^\a\a_\a\a$'
35      let s:lang = s:lang . '.' . &enc
36    endif
37
38    " We always use a lowercase name.
39    " Change "iso-8859" to "iso_8859" and "iso8859" to "iso_8859", some
40    " systems appear to use this.
41    " Change spaces to underscores.
42    let s:lang = substitute(tolower(s:lang), '\.iso-', ".iso_", "")
43    let s:lang = substitute(s:lang, '\.iso8859', ".iso_8859", "")
44    let s:lang = substitute(s:lang, " ", "_", "g")
45    " Remove "@euro", otherwise "LC_ALL=de_DE@euro gvim" will show English menus
46    let s:lang = substitute(s:lang, "@euro", "", "")
47    " Change "iso_8859-1" and "iso_8859-15" to "latin1", we always use the
48    " same menu file for them.
49    let s:lang = substitute(s:lang, 'iso_8859-15\=$', "latin1", "")
50    menutrans clear
51    exe "runtime! lang/menu_" . s:lang . ".vim"
52
53    if !exists("did_menu_trans")
54      " There is no exact match, try matching with a wildcard added
55      " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE).
56      let s:lang = substitute(s:lang, '\.[^.]*', "", "")
57      exe "runtime! lang/menu_" . s:lang . "*.vim"
58
59      if !exists("did_menu_trans") && strlen($LANG) > 1
60	" On windows locale names are complicated, try using $LANG, it might
61	" have been set by set_init_1().
62	exe "runtime! lang/menu_" . tolower($LANG) . "*.vim"
63      endif
64    endif
65  endif
66endif
67
68
69" Help menu
70an 9999.10 &Help.&Overview<Tab><F1>	:help<CR>
71an 9999.20 &Help.&User\ Manual		:help usr_toc<CR>
72an 9999.30 &Help.&How-to\ links		:help how-to<CR>
73an <silent> 9999.40 &Help.&Find\.\.\.	:call <SID>Helpfind()<CR>
74an 9999.45 &Help.-sep1-			<Nop>
75an 9999.50 &Help.&Credits		:help credits<CR>
76an 9999.60 &Help.Co&pying		:help copying<CR>
77an 9999.70 &Help.&Sponsor/Register	:help sponsor<CR>
78an 9999.70 &Help.O&rphans		:help kcc<CR>
79an 9999.75 &Help.-sep2-			<Nop>
80an 9999.80 &Help.&Version		:version<CR>
81an 9999.90 &Help.&About			:intro<CR>
82
83fun! s:Helpfind()
84  if !exists("g:menutrans_help_dialog")
85    let g:menutrans_help_dialog = "Enter a command or word to find help on:\n\nPrepend i_ for Input mode commands (e.g.: i_CTRL-X)\nPrepend c_ for command-line editing commands (e.g.: c_<Del>)\nPrepend ' for an option name (e.g.: 'shiftwidth')"
86  endif
87  let h = inputdialog(g:menutrans_help_dialog)
88  if h != ""
89    let v:errmsg = ""
90    silent! exe "help " . h
91    if v:errmsg != ""
92      echo v:errmsg
93    endif
94  endif
95endfun
96
97" File menu
98an 10.310 &File.&Open\.\.\.<Tab>:e		:browse confirm e<CR>
99an 10.320 &File.Sp&lit-Open\.\.\.<Tab>:sp	:browse sp<CR>
100an 10.325 &File.&New<Tab>:enew			:confirm enew<CR>
101an <silent> 10.330 &File.&Close<Tab>:close
102	\ :if winheight(2) < 0 <Bar>
103	\   confirm enew <Bar>
104	\ else <Bar>
105	\   confirm close <Bar>
106	\ endif<CR>
107an 10.335 &File.-SEP1-				<Nop>
108an <silent> 10.340 &File.&Save<Tab>:w		:if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
109an 10.350 &File.Save\ &As\.\.\.<Tab>:sav	:browse confirm saveas<CR>
110
111if has("diff")
112  an 10.400 &File.-SEP2-			<Nop>
113  an 10.410 &File.Split\ &Diff\ with\.\.\.	:browse vert diffsplit<CR>
114  an 10.420 &File.Split\ Patched\ &By\.\.\.	:browse vert diffpatch<CR>
115endif
116
117if has("printer")
118  an 10.500 &File.-SEP3-			<Nop>
119  an 10.510 &File.&Print			:hardcopy<CR>
120  vunmenu   &File.&Print
121  vnoremenu &File.&Print			:hardcopy<CR>
122elseif has("unix")
123  an 10.500 &File.-SEP3-			<Nop>
124  an 10.510 &File.&Print			:w !lpr<CR>
125  vunmenu   &File.&Print
126  vnoremenu &File.&Print			:w !lpr<CR>
127endif
128an 10.600 &File.-SEP4-				<Nop>
129an 10.610 &File.Sa&ve-Exit<Tab>:wqa		:confirm wqa<CR>
130an 10.620 &File.E&xit<Tab>:qa			:confirm qa<CR>
131
132" Pasting blockwise and linewise selections is not possible in Insert and
133" Visual mode without the +virtualedit feature.  They are pasted as if they
134" were characterwise instead.  Add to that some tricks to leave the cursor in
135" the right position, also for "gi".
136" Note: the same stuff appears in mswin.vim.
137if has("virtualedit")
138  nnoremap <silent> <script> <SID>Paste :call <SID>Paste()<CR>
139  func! <SID>Paste()
140    let ove = &ve
141    set ve=all
142    normal `^
143    if @+ != ''
144      normal "+gP
145    endif
146    let c = col(".")
147    normal i
148    if col(".") < c	" compensate for i<ESC> moving the cursor left
149      normal l
150    endif
151    let &ve = ove
152  endfunc
153else
154  nnoremap <silent> <script> <SID>Paste "=@+.'xy'<CR>gPFx"_2x
155endif
156
157" Use maps for items that are present both in Edit, Popup and Toolbar menu.
158if has("virtualedit")
159  vnoremap <script> <SID>vPaste	"-c<Esc><SID>Paste
160  inoremap <script> <SID>iPaste	<Esc><SID>Pastegi
161else
162  vnoremap <script> <SID>vPaste	"-c<Esc>gix<Esc><SID>Paste"_x
163  inoremap <script> <SID>iPaste	x<Esc><SID>Paste"_s
164endif
165
166func! <SID>SelectAll()
167  exe "norm gg" . (&slm == "" ? "VG" : "gH\<C-O>G")
168endfunc
169
170
171" Edit menu
172an 20.310 &Edit.&Undo<Tab>u			u
173an 20.320 &Edit.&Redo<Tab>^R			<C-R>
174an 20.330 &Edit.Rep&eat<Tab>\.			.
175
176an 20.335 &Edit.-SEP1-				<Nop>
177vnoremenu 20.340 &Edit.Cu&t<Tab>"+x		"+x
178vnoremenu 20.350 &Edit.&Copy<Tab>"+y		"+y
179cnoremenu 20.350 &Edit.&Copy<Tab>"+y		<C-Y>
180nnoremenu 20.360 &Edit.&Paste<Tab>"+gP		"+gP
181cnoremenu	 &Edit.&Paste<Tab>"+gP		<C-R>+
182vnoremenu <script> &Edit.&Paste<Tab>"+gP	<SID>vPaste
183inoremenu <script> &Edit.&Paste<Tab>"+gP	<SID>iPaste
184nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p	[p
185inoremenu	 &Edit.Put\ &Before<Tab>[p	<C-O>[p
186nnoremenu 20.380 &Edit.Put\ &After<Tab>]p	]p
187inoremenu	 &Edit.Put\ &After<Tab>]p	<C-O>]p
188if has("win32") || has("win16")
189  vnoremenu 20.390 &Edit.&Delete<Tab>x		x
190endif
191noremenu  <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	:<C-U>call <SID>SelectAll()<CR>
192inoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	<C-O>:call <SID>SelectAll()<CR>
193cnoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	<C-U>call <SID>SelectAll()<CR>
194
195an 20.405	 &Edit.-SEP2-				<Nop>
196if has("win32")  || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
197  an 20.410	 &Edit.&Find\.\.\.			:promptfind<CR>
198  vunmenu	 &Edit.&Find\.\.\.
199  vnoremenu	 &Edit.&Find\.\.\.			y:promptfind <C-R>"<CR>
200  an 20.420	 &Edit.Find\ and\ Rep&lace\.\.\.	:promptrepl<CR>
201  vunmenu	 &Edit.Find\ and\ Rep&lace\.\.\.
202  vnoremenu	 &Edit.Find\ and\ Rep&lace\.\.\.	y:promptrepl <C-R>"<CR>
203else
204  an 20.410	 &Edit.&Find<Tab>/			/
205  an 20.420	 &Edit.Find\ and\ Rep&lace<Tab>:%s	:%s/
206  vunmenu	 &Edit.Find\ and\ Rep&lace<Tab>:%s
207  vnoremenu	 &Edit.Find\ and\ Rep&lace<Tab>:s	:s/
208endif
209
210an 20.425	 &Edit.-SEP3-				<Nop>
211an 20.430	 &Edit.Settings\ &Window		:options<CR>
212
213" Edit/Global Settings
214an 20.440.100 &Edit.&Global\ Settings.Toggle\ Pattern\ &Highlight<Tab>:set\ hls!	:set hls! hls?<CR>
215an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Ignore-case<Tab>:set\ ic!	:set ic! ic?<CR>
216an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Showmatch<Tab>:set\ sm!	:set sm! sm?<CR>
217
218an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 1\  :set so=1<CR>
219an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 2\  :set so=2<CR>
220an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 3\  :set so=3<CR>
221an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 4\  :set so=4<CR>
222an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 5\  :set so=5<CR>
223an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 7\  :set so=7<CR>
224an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 10\  :set so=10<CR>
225an 20.440.120 &Edit.&Global\ Settings.&Context\ lines.\ 100\  :set so=100<CR>
226
227an 20.440.130.40 &Edit.&Global\ Settings.&Virtual\ Edit.Never :set ve=<CR>
228an 20.440.130.50 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ Selection :set ve=block<CR>
229an 20.440.130.60 &Edit.&Global\ Settings.&Virtual\ Edit.Insert\ mode :set ve=insert<CR>
230an 20.440.130.70 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ and\ Insert :set ve=block,insert<CR>
231an 20.440.130.80 &Edit.&Global\ Settings.&Virtual\ Edit.Always :set ve=all<CR>
232an 20.440.140 &Edit.&Global\ Settings.Toggle\ Insert\ &Mode<Tab>:set\ im!	:set im!<CR>
233an 20.440.145 &Edit.&Global\ Settings.Toggle\ Vi\ C&ompatible<Tab>:set\ cp!	:set cp!<CR>
234an <silent> 20.440.150 &Edit.&Global\ Settings.Search\ &Path\.\.\.  :call <SID>SearchP()<CR>
235an <silent> 20.440.160 &Edit.&Global\ Settings.Ta&g\ Files\.\.\.  :call <SID>TagFiles()<CR>
236"
237" GUI options
238an 20.440.300 &Edit.&Global\ Settings.-SEP1-				<Nop>
239an <silent> 20.440.310 &Edit.&Global\ Settings.Toggle\ &Toolbar		:call <SID>ToggleGuiOption("T")<CR>
240an <silent> 20.440.320 &Edit.&Global\ Settings.Toggle\ &Bottom\ Scrollbar :call <SID>ToggleGuiOption("b")<CR>
241an <silent> 20.440.330 &Edit.&Global\ Settings.Toggle\ &Left\ Scrollbar	:call <SID>ToggleGuiOption("l")<CR>
242an <silent> 20.440.340 &Edit.&Global\ Settings.Toggle\ &Right\ Scrollbar :call <SID>ToggleGuiOption("r")<CR>
243
244fun! s:SearchP()
245  if !exists("g:menutrans_path_dialog")
246    let g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
247  endif
248  let n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
249  if n != ""
250    let &path = substitute(n, ' ', '\\ ', 'g')
251  endif
252endfun
253
254fun! s:TagFiles()
255  if !exists("g:menutrans_tags_dialog")
256    let g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
257  endif
258  let n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
259  if n != ""
260    let &tags = substitute(n, ' ', '\\ ', 'g')
261  endif
262endfun
263
264fun! s:ToggleGuiOption(option)
265    " If a:option is already set in guioptions, then we want to remove it
266    if match(&guioptions, "\\C" . a:option) > -1
267	exec "set go-=" . a:option
268    else
269	exec "set go+=" . a:option
270    endif
271endfun
272
273" Edit/File Settings
274
275" Boolean options
276an 20.440.100 &Edit.F&ile\ Settings.Toggle\ Line\ &Numbering<Tab>:set\ nu!	:set nu! nu?<CR>
277an 20.440.110 &Edit.F&ile\ Settings.Toggle\ &List\ Mode<Tab>:set\ list!	:set list! list?<CR>
278an 20.440.120 &Edit.F&ile\ Settings.Toggle\ Line\ &Wrap<Tab>:set\ wrap!	:set wrap! wrap?<CR>
279an 20.440.130 &Edit.F&ile\ Settings.Toggle\ W&rap\ at\ word<Tab>:set\ lbr!	:set lbr! lbr?<CR>
280an 20.440.160 &Edit.F&ile\ Settings.Toggle\ &expand-tab<Tab>:set\ et!	:set et! et?<CR>
281an 20.440.170 &Edit.F&ile\ Settings.Toggle\ &auto-indent<Tab>:set\ ai!	:set ai! ai?<CR>
282an 20.440.180 &Edit.F&ile\ Settings.Toggle\ &C-indenting<Tab>:set\ cin!	:set cin! cin?<CR>
283
284" other options
285an 20.440.600 &Edit.F&ile\ Settings.-SEP2-		<Nop>
286an 20.440.610.20 &Edit.F&ile\ Settings.&Shiftwidth.2	:set sw=2 sw?<CR>
287an 20.440.610.30 &Edit.F&ile\ Settings.&Shiftwidth.3	:set sw=3 sw?<CR>
288an 20.440.610.40 &Edit.F&ile\ Settings.&Shiftwidth.4	:set sw=4 sw?<CR>
289an 20.440.610.50 &Edit.F&ile\ Settings.&Shiftwidth.5	:set sw=5 sw?<CR>
290an 20.440.610.60 &Edit.F&ile\ Settings.&Shiftwidth.6	:set sw=6 sw?<CR>
291an 20.440.610.80 &Edit.F&ile\ Settings.&Shiftwidth.8	:set sw=8 sw?<CR>
292
293an 20.440.620.20 &Edit.F&ile\ Settings.Soft\ &Tabstop.2	:set sts=2 sts?<CR>
294an 20.440.620.30 &Edit.F&ile\ Settings.Soft\ &Tabstop.3	:set sts=3 sts?<CR>
295an 20.440.620.40 &Edit.F&ile\ Settings.Soft\ &Tabstop.4	:set sts=4 sts?<CR>
296an 20.440.620.50 &Edit.F&ile\ Settings.Soft\ &Tabstop.5	:set sts=5 sts?<CR>
297an 20.440.620.60 &Edit.F&ile\ Settings.Soft\ &Tabstop.6	:set sts=6 sts?<CR>
298an 20.440.620.80 &Edit.F&ile\ Settings.Soft\ &Tabstop.8	:set sts=8 sts?<CR>
299
300an <silent> 20.440.630 &Edit.F&ile\ Settings.Te&xt\ Width\.\.\.  :call <SID>TextWidth()<CR>
301an <silent> 20.440.640 &Edit.F&ile\ Settings.&File\ Format\.\.\.  :call <SID>FileFormat()<CR>
302fun! s:TextWidth()
303  if !exists("g:menutrans_textwidth_dialog")
304    let g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
305  endif
306  let n = inputdialog(g:menutrans_textwidth_dialog, &tw)
307  if n != ""
308    " remove leading zeros to avoid it being used as an octal number
309    let &tw = substitute(n, "^0*", "", "")
310  endif
311endfun
312
313fun! s:FileFormat()
314  if !exists("g:menutrans_fileformat_dialog")
315    let g:menutrans_fileformat_dialog = "Select format for writing the file"
316  endif
317  if !exists("g:menutrans_fileformat_choices")
318    let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
319  endif
320  if &ff == "dos"
321    let def = 2
322  elseif &ff == "mac"
323    let def = 3
324  else
325    let def = 1
326  endif
327  let n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def, "Question")
328  if n == 1
329    set ff=unix
330  elseif n == 2
331    set ff=dos
332  elseif n == 3
333    set ff=mac
334  endif
335endfun
336
337" Setup the Edit.Color Scheme submenu
338let s:n = globpath(&runtimepath, "colors/*.vim")
339let s:idx = 100
340while strlen(s:n) > 0
341  let s:i = stridx(s:n, "\n")
342  if s:i < 0
343    let s:name = s:n
344    let s:n = ""
345  else
346    let s:name = strpart(s:n, 0, s:i)
347    let s:n = strpart(s:n, s:i + 1, 19999)
348  endif
349  " Ignore case for VMS and windows
350  let s:name = substitute(s:name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
351  exe "an 20.450." . s:idx . ' &Edit.C&olor\ Scheme.' . s:name . " :colors " . s:name . "<CR>"
352  unlet s:name
353  unlet s:i
354  let s:idx = s:idx + 10
355endwhile
356unlet s:n
357unlet s:idx
358
359" Setup the Edit.Keymap submenu
360if has("keymap")
361  let s:n = globpath(&runtimepath, "keymap/*.vim")
362  if s:n != ""
363    let s:idx = 100
364    an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
365    while strlen(s:n) > 0
366      let s:i = stridx(s:n, "\n")
367      if s:i < 0
368	let s:name = s:n
369	let s:n = ""
370      else
371	let s:name = strpart(s:n, 0, s:i)
372	let s:n = strpart(s:n, s:i + 1, 19999)
373      endif
374      " Ignore case for VMS and windows
375      let s:name = substitute(s:name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
376      exe "an 20.460." . s:idx . ' &Edit.&Keymap.' . s:name . " :set keymap=" . s:name . "<CR>"
377      unlet s:name
378      unlet s:i
379      let s:idx = s:idx + 10
380    endwhile
381    unlet s:idx
382  endif
383  unlet s:n
384endif
385if has("win32") || has("win16") || has("gui_gtk") || has("gui_kde") || has("gui_photon")
386  an 20.470 &Edit.Select\ Fo&nt\.\.\.	:set guifont=*<CR>
387endif
388
389" Programming menu
390if !exists("g:ctags_command")
391  if has("vms")
392    let g:ctags_command = "mc vim:ctags ."
393  else
394    let g:ctags_command = "ctags -R ."
395  endif
396endif
397
398an 40.300 &Tools.&Jump\ to\ this\ tag<Tab>g^]	g<C-]>
399vunmenu &Tools.&Jump\ to\ this\ tag<Tab>g^]
400vnoremenu &Tools.&Jump\ to\ this\ tag<Tab>g^]	g<C-]>
401an 40.310 &Tools.Jump\ &back<Tab>^T		<C-T>
402an 40.320 &Tools.Build\ &Tags\ File		:exe "!" . g:ctags_command<CR>
403
404" Tools.Fold Menu
405if has("folding")
406  an 40.330 &Tools.-SEP1-						<Nop>
407  " open close folds
408  an 40.340.110 &Tools.&Folding.&Enable/Disable\ folds<Tab>zi		zi
409  an 40.340.120 &Tools.&Folding.&View\ Cursor\ Line<Tab>zv		zv
410  an 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ only<Tab>zMzx	zMzx
411  an 40.340.130 &Tools.&Folding.C&lose\ more\ folds<Tab>zm		zm
412  an 40.340.140 &Tools.&Folding.&Close\ all\ folds<Tab>zM		zM
413  an 40.340.150 &Tools.&Folding.O&pen\ more\ folds<Tab>zr		zr
414  an 40.340.160 &Tools.&Folding.&Open\ all\ folds<Tab>zR		zR
415  " fold method
416  an 40.340.200 &Tools.&Folding.-SEP1-			<Nop>
417  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.M&anual	:set fdm=manual<CR>
418  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.I&ndent	:set fdm=indent<CR>
419  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.E&xpression :set fdm=expr<CR>
420  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.S&yntax	:set fdm=syntax<CR>
421  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.&Diff	:set fdm=diff<CR>
422  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.Ma&rker	:set fdm=marker<CR>
423  " create and delete folds
424  vnoremenu 40.340.220 &Tools.&Folding.Create\ &Fold<Tab>zf	zf
425  an 40.340.230 &Tools.&Folding.&Delete\ Fold<Tab>zd		zd
426  an 40.340.240 &Tools.&Folding.Delete\ &All\ Folds<Tab>zD	zD
427  " moving around in folds
428  an 40.340.300 &Tools.&Folding.-SEP2-				<Nop>
429  an 40.340.310.10 &Tools.&Folding.Fold\ col&umn\ width.\ &0\ 	:set fdc=0<CR>
430  an 40.340.310.20 &Tools.&Folding.Fold\ col&umn\ width.\ &2\ 	:set fdc=2<CR>
431  an 40.340.310.30 &Tools.&Folding.Fold\ col&umn\ width.\ &3\ 	:set fdc=3<CR>
432  an 40.340.310.40 &Tools.&Folding.Fold\ col&umn\ width.\ &4\ 	:set fdc=4<CR>
433  an 40.340.310.50 &Tools.&Folding.Fold\ col&umn\ width.\ &5\ 	:set fdc=5<CR>
434  an 40.340.310.60 &Tools.&Folding.Fold\ col&umn\ width.\ &6\ 	:set fdc=6<CR>
435  an 40.340.310.70 &Tools.&Folding.Fold\ col&umn\ width.\ &7\ 	:set fdc=7<CR>
436  an 40.340.310.80 &Tools.&Folding.Fold\ col&umn\ width.\ &8\ 	:set fdc=8<CR>
437endif  " has folding
438
439if has("diff")
440  an 40.350.100 &Tools.&Diff.&Update		:diffupdate<CR>
441  an 40.350.110 &Tools.&Diff.&Get\ Block	:diffget<CR>
442  vunmenu &Tools.&Diff.&Get\ Block
443  vnoremenu &Tools.&Diff.&Get\ Block		:diffget<CR>
444  an 40.350.120 &Tools.&Diff.&Put\ Block	:diffput<CR>
445  vunmenu &Tools.&Diff.&Put\ Block
446  vnoremenu &Tools.&Diff.&Put\ Block		:diffput<CR>
447endif
448
449an 40.358 &Tools.-SEP2-					<Nop>
450an 40.360 &Tools.&Make<Tab>:make			:make<CR>
451an 40.370 &Tools.&List\ Errors<Tab>:cl			:cl<CR>
452an 40.380 &Tools.L&ist\ Messages<Tab>:cl!		:cl!<CR>
453an 40.390 &Tools.&Next\ Error<Tab>:cn			:cn<CR>
454an 40.400 &Tools.&Previous\ Error<Tab>:cp		:cp<CR>
455an 40.410 &Tools.&Older\ List<Tab>:cold			:colder<CR>
456an 40.420 &Tools.N&ewer\ List<Tab>:cnew			:cnewer<CR>
457an 40.430.50 &Tools.Error\ &Window.&Update<Tab>:cwin	:cwin<CR>
458an 40.430.60 &Tools.Error\ &Window.&Open<Tab>:copen	:copen<CR>
459an 40.430.70 &Tools.Error\ &Window.&Close<Tab>:cclose	:cclose<CR>
460
461an 40.520 &Tools.-SEP3-					<Nop>
462an <silent> 40.530 &Tools.&Convert\ to\ HEX<Tab>:%!xxd
463	\ :call <SID>XxdConv()<CR>
464an <silent> 40.540 &Tools.Conve&rt\ back<Tab>:%!xxd\ -r
465	\ :call <SID>XxdBack()<CR>
466
467" Use a function to do the conversion, so that it also works with 'insertmode'
468" set.
469func! s:XxdConv()
470  let mod = &mod
471  if has("vms")
472    %!mc vim:xxd
473  else
474    call s:XxdFind()
475    exe '%!"' . g:xxdprogram . '"'
476  endif
477  if getline(1) =~ "^0000000:"		" only if it worked
478    set ft=xxd
479  endif
480  let &mod = mod
481endfun
482
483func! s:XxdBack()
484  let mod = &mod
485  if has("vms")
486    %!mc vim:xxd -r
487  else
488    call s:XxdFind()
489    exe '%!"' . g:xxdprogram . '" -r'
490  endif
491  set ft=
492  doautocmd filetypedetect BufReadPost
493  let &mod = mod
494endfun
495
496func! s:XxdFind()
497  if !exists("g:xxdprogram")
498    " On the PC xxd may not be in the path but in the install directory
499    if (has("win32") || has("dos32")) && !executable("xxd")
500      let g:xxdprogram = $VIMRUNTIME . (&shellslash ? '/' : '\') . "xxd.exe"
501    else
502      let g:xxdprogram = "xxd"
503    endif
504  endif
505endfun
506
507" Setup the Tools.Compiler submenu
508let s:n = globpath(&runtimepath, "compiler/*.vim")
509let s:idx = 100
510while strlen(s:n) > 0
511  let s:i = stridx(s:n, "\n")
512  if s:i < 0
513    let s:name = s:n
514    let s:n = ""
515  else
516    let s:name = strpart(s:n, 0, s:i)
517    let s:n = strpart(s:n, s:i + 1, 19999)
518  endif
519  " Ignore case for VMS and windows
520  let s:name = substitute(s:name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
521  exe "an 30.440." . s:idx . ' &Tools.&Set\ Compiler.' . s:name . " :compiler " . s:name . "<CR>"
522  unlet s:name
523  unlet s:i
524  let s:idx = s:idx + 10
525endwhile
526unlet s:n
527unlet s:idx
528
529if !exists("no_buffers_menu")
530
531" Buffer list menu -- Setup functions & actions
532
533" wait with building the menu until after loading 'session' files. Makes
534" startup faster.
535let s:bmenu_wait = 1
536
537if !exists("bmenu_priority")
538  let bmenu_priority = 60
539endif
540
541func! s:BMAdd()
542  if s:bmenu_wait == 0
543    " when adding too many buffers, redraw in short format
544    if s:bmenu_count == &menuitems && s:bmenu_short == 0
545      call s:BMShow()
546    else
547      call <SID>BMFilename(expand("<afile>"), expand("<abuf>"))
548      let s:bmenu_count = s:bmenu_count + 1
549    endif
550  endif
551endfunc
552
553func! s:BMRemove()
554  if s:bmenu_wait == 0
555    let name = expand("<afile>")
556    if isdirectory(name)
557      return
558    endif
559    let munge = <SID>BMMunge(name, expand("<abuf>"))
560
561    if s:bmenu_short == 0
562      exe 'silent! aun &Buffers.' . munge
563    else
564      exe 'silent! aun &Buffers.' . <SID>BMHash2(munge) . munge
565    endif
566    let s:bmenu_count = s:bmenu_count - 1
567  endif
568endfunc
569
570" Create the buffer menu (delete an existing one first).
571func! s:BMShow(...)
572  let s:bmenu_wait = 1
573  let s:bmenu_short = 1
574  let s:bmenu_count = 0
575  "
576  " get new priority, if exists
577  if a:0 == 1
578    let g:bmenu_priority = a:1
579  endif
580
581  " remove old menu, if exists; keep one entry to avoid a torn off menu to
582  " disappear.
583  silent! unmenu &Buffers
584  exe 'noremenu ' . g:bmenu_priority . ".1 &Buffers.Dummy l"
585  silent! unmenu! &Buffers
586
587  " create new menu; set 'cpo' to include the <CR>
588  let cpo_save = &cpo
589  set cpo&vim
590  exe 'an <silent> ' . g:bmenu_priority . ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
591  exe 'an ' . g:bmenu_priority . ".4 &Buffers.&Delete :confirm bd<CR>"
592  exe 'an ' . g:bmenu_priority . ".6 &Buffers.&Alternate :confirm b #<CR>"
593  exe 'an ' . g:bmenu_priority . ".7 &Buffers.&Next :confirm bnext<CR>"
594  exe 'an ' . g:bmenu_priority . ".8 &Buffers.&Previous :confirm bprev<CR>"
595  exe 'an ' . g:bmenu_priority . ".9 &Buffers.-SEP- :"
596  let &cpo = cpo_save
597  unmenu &Buffers.Dummy
598
599  " figure out how many buffers there are
600  let buf = 1
601  while buf <= bufnr('$')
602    if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
603					    \ && !getbufvar(buf, "&bufsecret")
604      let s:bmenu_count = s:bmenu_count + 1
605    endif
606    let buf = buf + 1
607  endwhile
608  if s:bmenu_count <= &menuitems
609    let s:bmenu_short = 0
610  endif
611
612  " iterate through buffer list, adding each buffer to the menu:
613  let buf = 1
614  while buf <= bufnr('$')
615    if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
616					    \ && !getbufvar(buf, "&bufsecret")
617      call <SID>BMFilename(bufname(buf), buf)
618    endif
619    let buf = buf + 1
620  endwhile
621  let s:bmenu_wait = 0
622  aug buffer_list
623  au!
624  au BufCreate,BufFilePost * call <SID>BMAdd()
625  au BufDelete,BufFilePre * call <SID>BMRemove()
626  aug END
627endfunc
628
629func! s:BMHash(name)
630  " Make name all upper case, so that chars are between 32 and 96
631  let nm = substitute(a:name, ".*", '\U\0', "")
632  if has("ebcdic")
633    " HACK: Replace all non alphabetics with 'Z'
634    "       Just to make it work for now.
635    let nm = substitute(nm, "[^A-Z]", 'Z', "g")
636    let sp = char2nr('A') - 1
637  else
638    let sp = char2nr(' ')
639  endif
640  " convert first six chars into a number for sorting:
641  return (char2nr(nm[0]) - sp) * 0x800000 + (char2nr(nm[1]) - sp) * 0x20000 + (char2nr(nm[2]) - sp) * 0x1000 + (char2nr(nm[3]) - sp) * 0x80 + (char2nr(nm[4]) - sp) * 0x20 + (char2nr(nm[5]) - sp)
642endfunc
643
644func! s:BMHash2(name)
645  let nm = substitute(a:name, ".", '\L\0', "")
646  " Not exactly right for EBCDIC...
647  if nm[0] < 'a' || nm[0] > 'z'
648    return '&others.'
649  elseif nm[0] <= 'd'
650    return '&abcd.'
651  elseif nm[0] <= 'h'
652    return '&efgh.'
653  elseif nm[0] <= 'l'
654    return '&ijkl.'
655  elseif nm[0] <= 'p'
656    return '&mnop.'
657  elseif nm[0] <= 't'
658    return '&qrst.'
659  else
660    return '&u-z.'
661  endif
662endfunc
663
664" insert a buffer name into the buffer menu:
665func! s:BMFilename(name, num)
666  if isdirectory(a:name)
667    return
668  endif
669  let munge = <SID>BMMunge(a:name, a:num)
670  let hash = <SID>BMHash(munge)
671  if s:bmenu_short == 0
672    let name = 'an ' . g:bmenu_priority . '.' . hash . ' &Buffers.' . munge
673  else
674    let name = 'an ' . g:bmenu_priority . '.' . hash . '.' . hash . ' &Buffers.' . <SID>BMHash2(munge) . munge
675  endif
676  " set 'cpo' to include the <CR>
677  let cpo_save = &cpo
678  set cpo&vim
679  exe name . ' :confirm b' . a:num . '<CR>'
680  let &cpo = cpo_save
681endfunc
682
683" Truncate a long path to fit it in a menu item.
684if !exists("g:bmenu_max_pathlen")
685  let g:bmenu_max_pathlen = 35
686endif
687func! s:BMTruncName(fname)
688  let name = a:fname
689  if g:bmenu_max_pathlen < 5
690    let name = ""
691  else
692    let len = strlen(name)
693    if len > g:bmenu_max_pathlen
694      let amountl = (g:bmenu_max_pathlen / 2) - 2
695      let amountr = g:bmenu_max_pathlen - amountl - 3
696      let pattern = '^\(.\{,' . amountl . '}\).\{-}\(.\{,' . amountr . '}\)$'
697      let left = substitute(name, pattern, '\1', '')
698      let right = substitute(name, pattern, '\2', '')
699      if strlen(left) + strlen(right) < len
700	let name = left . '...' . right
701      endif
702    endif
703  endif
704  return name
705endfunc
706
707func! s:BMMunge(fname, bnum)
708  let name = a:fname
709  if name == ''
710    if !exists("g:menutrans_no_file")
711      let g:menutrans_no_file = "[No file]"
712    endif
713    let name = g:menutrans_no_file
714  else
715    let name = fnamemodify(name, ':p:~')
716  endif
717  " detach file name and separate it out:
718  let name2 = fnamemodify(name, ':t')
719  if a:bnum >= 0
720    let name2 = name2 . ' (' . a:bnum . ')'
721  endif
722  let name = name2 . "\t" . <SID>BMTruncName(fnamemodify(name,':h'))
723  let name = escape(name, "\\. \t|")
724  let name = substitute(name, "&", "&&", "g")
725  let name = substitute(name, "\n", "^@", "g")
726  return name
727endfunc
728
729" When just starting Vim, load the buffer menu later
730if has("vim_starting")
731  augroup LoadBufferMenu
732    au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
733    au  VimEnter * au! LoadBufferMenu
734  augroup END
735else
736  call <SID>BMShow()
737endif
738
739endif " !exists("no_buffers_menu")
740
741" Window menu
742an 70.300 &Window.&New<Tab>^Wn			<C-W>n
743an 70.310 &Window.S&plit<Tab>^Ws		<C-W>s
744an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^	<C-W><C-^>
745an 70.330 &Window.Split\ &Vertically<Tab>^Wv	<C-W>v
746if has("vertsplit")
747  an <silent> 70.332 &Window.Split\ File\ E&xplorer	:call MenuExplOpen()<CR>
748  if !exists("*MenuExplOpen")
749    fun MenuExplOpen()
750      if @% == ""
751	20vsp .
752      else
753	exe "20vsp " . expand("%:p:h")
754      endif
755    endfun
756  endif
757endif
758an 70.335 &Window.-SEP1-				<Nop>
759an 70.340 &Window.&Close<Tab>^Wc			:confirm close<CR>
760an 70.345 &Window.Close\ &Other(s)<Tab>^Wo		:confirm only<CR>
761an 70.350 &Window.-SEP2-				<Nop>
762an 70.355 &Window.Move\ &To.&Top<Tab>^WK		<C-W>K
763an 70.355 &Window.Move\ &To.&Bottom<Tab>^WJ		<C-W>J
764an 70.355 &Window.Move\ &To.&Left\ side<Tab>^WH		<C-W>H
765an 70.355 &Window.Move\ &To.&Right\ side<Tab>^WL	<C-W>L
766an 70.360 &Window.Rotate\ &Up<Tab>^WR			<C-W>R
767an 70.362 &Window.Rotate\ &Down<Tab>^Wr			<C-W>r
768an 70.365 &Window.-SEP3-				<Nop>
769an 70.370 &Window.&Equal\ Size<Tab>^W=			<C-W>=
770an 70.380 &Window.&Max\ Height<Tab>^W_			<C-W>_
771an 70.390 &Window.M&in\ Height<Tab>^W1_			<C-W>1_
772an 70.400 &Window.Max\ &Width<Tab>^W\|			<C-W>\|
773an 70.410 &Window.Min\ Widt&h<Tab>^W1\|			<C-W>1\|
774
775" The popup menu
776an 1.10 PopUp.&Undo			u
777an 1.15 PopUp.-SEP1-			<Nop>
778vnoremenu 1.20 PopUp.Cu&t		"+x
779vnoremenu 1.30 PopUp.&Copy		"+y
780cnoremenu 1.30 PopUp.&Copy		<C-Y>
781nnoremenu 1.40 PopUp.&Paste		"+gP
782cnoremenu 1.40 PopUp.&Paste		<C-R>+
783vnoremenu <script> 1.40 PopUp.&Paste	<SID>vPaste
784inoremenu <script> 1.40 PopUp.&Paste	<SID>iPaste
785vnoremenu 1.50 PopUp.&Delete		x
786an 1.55 PopUp.-SEP2-			<Nop>
787vnoremenu 1.60 PopUp.Select\ Blockwise	<C-V>
788an 1.70 PopUp.Select\ &Word		vaw
789an 1.80 PopUp.Select\ &Line		V
790an 1.90 PopUp.Select\ &Block		<C-V>
791noremenu  <script> <silent> 1.100 PopUp.Select\ &All	:<C-U>call <SID>SelectAll()<CR>
792inoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-O>:call <SID>SelectAll()<CR>
793cnoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-U>call <SID>SelectAll()<CR>
794
795
796" The GUI toolbar (for MS-Windows and GTK)
797if has("toolbar")
798  an 1.10 ToolBar.Open			:browse confirm e<CR>
799  an <silent> 1.20 ToolBar.Save		:if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
800  an 1.30 ToolBar.SaveAll		:browse confirm wa<CR>
801
802  if has("printer")
803    an 1.40   ToolBar.Print		:hardcopy<CR>
804    vunmenu   ToolBar.Print
805    vnoremenu ToolBar.Print		:hardcopy<CR>
806  elseif has("unix")
807    an 1.40   ToolBar.Print		:w !lpr<CR>
808    vunmenu   ToolBar.Print
809    vnoremenu ToolBar.Print		:w !lpr<CR>
810  endif
811
812  an 1.45 ToolBar.-sep1-		<Nop>
813  an 1.50 ToolBar.Undo			u
814  an 1.60 ToolBar.Redo			<C-R>
815
816  an 1.65 ToolBar.-sep2-		<Nop>
817  vnoremenu 1.70 ToolBar.Cut		"+x
818  vnoremenu 1.80 ToolBar.Copy		"+y
819  cnoremenu 1.80 ToolBar.Copy		<C-Y>
820  nnoremenu 1.90 ToolBar.Paste		"+gP
821  cnoremenu	 ToolBar.Paste		<C-R>+
822  vnoremenu <script>	 ToolBar.Paste	<SID>vPaste
823  inoremenu <script>	 ToolBar.Paste	<SID>iPaste
824
825  if !has("gui_athena")
826    an 1.95   ToolBar.-sep3-		<Nop>
827    an 1.100  ToolBar.Find		:promptfind<CR>
828    vunmenu   ToolBar.Find
829    vnoremenu ToolBar.Find		y:promptfind <C-R>"<CR>
830    an 1.110  ToolBar.FindNext		n
831    an 1.120  ToolBar.FindPrev		N
832    an 1.130  ToolBar.Replace		:promptrepl<CR>
833    vunmenu   ToolBar.Replace
834    vnoremenu ToolBar.Replace		y:promptrepl <C-R>"<CR>
835  endif
836
837if 0	" disabled; These are in the Windows menu
838  an 1.135 ToolBar.-sep4-		<Nop>
839  an 1.140 ToolBar.New			<C-W>n
840  an 1.150 ToolBar.WinSplit		<C-W>s
841  an 1.160 ToolBar.WinMax		:resize 200<CR>
842  an 1.170 ToolBar.WinMin		:resize 1<CR>
843  an 1.180 ToolBar.WinVSplit		<C-W>v
844  an 1.190 ToolBar.WinMaxWidth		<C-W>500>
845  an 1.200 ToolBar.WinMinWidth		<C-W>1\|
846  an 1.210 ToolBar.WinClose		:close<CR>
847endif
848
849  an 1.215 ToolBar.-sep5-		<Nop>
850  an <silent> 1.220 ToolBar.LoadSesn	:call <SID>LoadVimSesn()<CR>
851  an <silent> 1.230 ToolBar.SaveSesn	:call <SID>SaveVimSesn()<CR>
852  an 1.240 ToolBar.RunScript		:browse so<CR>
853
854  an 1.245 ToolBar.-sep6-		<Nop>
855  an 1.250 ToolBar.Make			:make<CR>
856  an 1.270 ToolBar.RunCtags		:exe "!" . g:ctags_command<CR>
857  an 1.280 ToolBar.TagJump		g<C-]>
858
859  an 1.295 ToolBar.-sep7-		<Nop>
860  an 1.300 ToolBar.Help			:help<CR>
861  an <silent> 1.310 ToolBar.FindHelp	:call <SID>Helpfind()<CR>
862
863" Only set the tooltips here if not done in a language menu file
864if exists("*Do_toolbar_tmenu")
865  call Do_toolbar_tmenu()
866else
867  let did_toolbar_tmenu = 1
868  tmenu ToolBar.Open		Open file
869  tmenu ToolBar.Save		Save current file
870  tmenu ToolBar.SaveAll		Save all files
871  tmenu ToolBar.Print		Print
872  tmenu ToolBar.Undo		Undo
873  tmenu ToolBar.Redo		Redo
874  tmenu ToolBar.Cut		Cut to clipboard
875  tmenu ToolBar.Copy		Copy to clipboard
876  tmenu ToolBar.Paste		Paste from Clipboard
877  if !has("gui_athena")
878    tmenu ToolBar.Find		Find...
879    tmenu ToolBar.FindNext	Find Next
880    tmenu ToolBar.FindPrev	Find Previous
881    tmenu ToolBar.Replace		Find / Replace...
882  endif
883 if 0	" disabled; These are in the Windows menu
884  tmenu ToolBar.New		New Window
885  tmenu ToolBar.WinSplit	Split Window
886  tmenu ToolBar.WinMax		Maximise Window
887  tmenu ToolBar.WinMin		Minimise Window
888  tmenu ToolBar.WinVSplit	Split Window Vertically
889  tmenu ToolBar.WinMaxWidth	Maximise Window Width
890  tmenu ToolBar.WinMinWidth	Minimise Window Width
891  tmenu ToolBar.WinClose	Close Window
892 endif
893  tmenu ToolBar.LoadSesn	Load session
894  tmenu ToolBar.SaveSesn	Save current session
895  tmenu ToolBar.RunScript	Run a Vim Script
896  tmenu ToolBar.Make		Make current project
897  tmenu ToolBar.RunCtags	Build tags in current directory tree
898  tmenu ToolBar.TagJump		Jump to tag under cursor
899  tmenu ToolBar.Help		Vim Help
900  tmenu ToolBar.FindHelp	Search Vim Help
901endif
902
903" Select a session to load; default to current session name if present
904fun! s:LoadVimSesn()
905  if strlen(v:this_session) > 0
906    let name = v:this_session
907  else
908    let name = "Session.vim"
909  endif
910  execute "browse so " . name
911endfun
912
913" Select a session to save; default to current session name if present
914fun! s:SaveVimSesn()
915  if strlen(v:this_session) == 0
916    let v:this_session = "Session.vim"
917  endif
918  execute "browse mksession! " . v:this_session
919endfun
920
921endif
922
923endif " !exists("did_install_default_menus")
924
925" Define these items always, so that syntax can be switched on when it wasn't.
926" But skip them when the Syntax menu was disabled by the user.
927if !exists("did_install_syntax_menu")
928  an 50.212 &Syntax.&Manual		:syn manual<CR>
929  an 50.214 &Syntax.A&utomatic		:syn on<CR>
930  an <silent> 50.216 &Syntax.on/off\ for\ &This\ file :call <SID>SynOnOff()<CR>
931  if !exists("*s:SynOnOff")
932    fun s:SynOnOff()
933      if has("syntax_items")
934	syn clear
935      else
936	if !exists("g:syntax_on")
937	  syn manual
938	endif
939	set syn=ON
940      endif
941    endfun
942  endif
943endif
944
945
946" Install the Syntax menu only when filetype.vim has been loaded or when
947" manual syntax highlighting is enabled.
948" Avoid installing the Syntax menu twice.
949if (exists("did_load_filetypes") || exists("syntax_on"))
950	\ && !exists("did_install_syntax_menu")
951  let did_install_syntax_menu = 1
952
953" Skip setting up the individual syntax selection menus unless
954" do_syntax_sel_menu is defined (it takes quite a bit of time).
955if exists("do_syntax_sel_menu")
956  runtime! synmenu.vim
957else
958  an 50.10 &Syntax.&Show\ filetypes\ in\ menu	:let do_syntax_sel_menu = 1<Bar>runtime! synmenu.vim<Bar>aunmenu &Syntax.&Show\ filetypes\ in\ menu<CR>
959  an 50.195 &Syntax.-SEP1-		<Nop>
960endif
961
962an 50.210 &Syntax.&Off			:syn off<CR>
963an 50.700 &Syntax.-SEP3-		<Nop>
964an 50.710 &Syntax.Co&lor\ test		:sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
965an 50.720 &Syntax.&Highlight\ test	:runtime syntax/hitest.vim<CR>
966an 50.730 &Syntax.&Convert\ to\ HTML	:runtime syntax/2html.vim<CR>
967
968endif " !exists("did_install_syntax_menu")
969
970" Restore the previous value of 'cpoptions'.
971let &cpo = s:cpo_save
972unlet s:cpo_save
973
974" vim: set sw=2 :
975