xref: /vim-8.2.3635/runtime/menu.vim (revision 98be7fec)
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:	2020 Mar 19
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  " Also skip "en_US" to avoid picking up "en_gb" translations.
33  if strlen(s:lang) > 1 && s:lang !~? '^en_us'
34    " When the language does not include the charset add 'encoding'
35    if s:lang =~ '^\a\a$\|^\a\a_\a\a$'
36      let s:lang = s:lang . '.' . &enc
37    endif
38
39    " We always use a lowercase name.
40    " Change "iso-8859" to "iso_8859" and "iso8859" to "iso_8859", some
41    " systems appear to use this.
42    " Change spaces to underscores.
43    let s:lang = substitute(tolower(s:lang), '\.iso-', ".iso_", "")
44    let s:lang = substitute(s:lang, '\.iso8859', ".iso_8859", "")
45    let s:lang = substitute(s:lang, " ", "_", "g")
46    " Remove "@euro", otherwise "LC_ALL=de_DE@euro gvim" will show English menus
47    let s:lang = substitute(s:lang, "@euro", "", "")
48    " Change "iso_8859-1" and "iso_8859-15" to "latin1", we always use the
49    " same menu file for them.
50    let s:lang = substitute(s:lang, 'iso_8859-15\=$', "latin1", "")
51    menutrans clear
52    exe "runtime! lang/menu_" . s:lang . ".vim"
53
54    if !exists("did_menu_trans")
55      " There is no exact match, try matching with a wildcard added
56      " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE).
57      let s:lang = substitute(s:lang, '\.[^.]*', "", "")
58      exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim"
59
60      if !exists("did_menu_trans") && s:lang =~ '_'
61	" If the language includes a region try matching without that region.
62	" (e.g. find menu_de.vim if s:lang == de_DE).
63	let langonly = substitute(s:lang, '_.*', "", "")
64	exe "runtime! lang/menu_" . langonly . "[^a-z]*vim"
65      endif
66
67      if !exists("did_menu_trans") && strlen($LANG) > 1 && s:lang !~ '^en_us'
68	" On windows locale names are complicated, try using $LANG, it might
69	" have been set by set_init_1().  But don't do this for "en" or "en_us".
70	" But don't match "slovak" when $LANG is "sl".
71	exe "runtime! lang/menu_" . tolower($LANG) . "[^a-z]*vim"
72      endif
73    endif
74  endif
75endif
76
77
78" Help menu
79an 9999.10 &Help.&Overview<Tab><F1>	:help<CR>
80an 9999.20 &Help.&User\ Manual		:help usr_toc<CR>
81an 9999.30 &Help.&How-To\ Links		:help how-to<CR>
82an <silent> 9999.40 &Help.&Find\.\.\.	:call <SID>Helpfind()<CR>
83an 9999.45 &Help.-sep1-			<Nop>
84an 9999.50 &Help.&Credits		:help credits<CR>
85an 9999.60 &Help.Co&pying		:help copying<CR>
86an 9999.70 &Help.&Sponsor/Register	:help sponsor<CR>
87an 9999.70 &Help.O&rphans		:help kcc<CR>
88an 9999.75 &Help.-sep2-			<Nop>
89an 9999.80 &Help.&Version		:version<CR>
90an 9999.90 &Help.&About			:intro<CR>
91
92fun! s:Helpfind()
93  if !exists("g:menutrans_help_dialog")
94    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')"
95  endif
96  let h = inputdialog(g:menutrans_help_dialog)
97  if h != ""
98    let v:errmsg = ""
99    silent! exe "help " . h
100    if v:errmsg != ""
101      echo v:errmsg
102    endif
103  endif
104endfun
105
106" File menu
107an 10.310 &File.&Open\.\.\.<Tab>:e		:browse confirm e<CR>
108an 10.320 &File.Sp&lit-Open\.\.\.<Tab>:sp	:browse sp<CR>
109an 10.320 &File.Open\ Tab\.\.\.<Tab>:tabnew	:browse tabnew<CR>
110an 10.325 &File.&New<Tab>:enew			:confirm enew<CR>
111an <silent> 10.330 &File.&Close<Tab>:close
112	\ :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
113	\   confirm enew <Bar>
114	\ else <Bar>
115	\   confirm close <Bar>
116	\ endif<CR>
117an 10.335 &File.-SEP1-				<Nop>
118an <silent> 10.340 &File.&Save<Tab>:w		:if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
119an 10.350 &File.Save\ &As\.\.\.<Tab>:sav	:browse confirm saveas<CR>
120
121if has("diff")
122  an 10.400 &File.-SEP2-			<Nop>
123  an 10.410 &File.Split\ &Diff\ With\.\.\.	:browse vert diffsplit<CR>
124  an 10.420 &File.Split\ Patched\ &By\.\.\.	:browse vert diffpatch<CR>
125endif
126
127if has("printer")
128  an 10.500 &File.-SEP3-			<Nop>
129  an 10.510 &File.&Print			:hardcopy<CR>
130  vunmenu   &File.&Print
131  vnoremenu &File.&Print			:hardcopy<CR>
132elseif has("unix")
133  an 10.500 &File.-SEP3-			<Nop>
134  an 10.510 &File.&Print			:w !lpr<CR>
135  vunmenu   &File.&Print
136  vnoremenu &File.&Print			:w !lpr<CR>
137endif
138an 10.600 &File.-SEP4-				<Nop>
139an 10.610 &File.Sa&ve-Exit<Tab>:wqa		:confirm wqa<CR>
140an 10.620 &File.E&xit<Tab>:qa			:confirm qa<CR>
141
142func s:SelectAll()
143  exe "norm! gg" . (&slm == "" ? "VG" : "gH\<C-O>G")
144endfunc
145
146func s:FnameEscape(fname)
147  if exists('*fnameescape')
148    return fnameescape(a:fname)
149  endif
150  return escape(a:fname, " \t\n*?[{`$\\%#'\"|!<")
151endfunc
152
153" Edit menu
154an 20.310 &Edit.&Undo<Tab>u			u
155an 20.320 &Edit.&Redo<Tab>^R			<C-R>
156an 20.330 &Edit.Rep&eat<Tab>\.			.
157
158an 20.335 &Edit.-SEP1-				<Nop>
159vnoremenu 20.340 &Edit.Cu&t<Tab>"+x		"+x
160vnoremenu 20.350 &Edit.&Copy<Tab>"+y		"+y
161cnoremenu 20.350 &Edit.&Copy<Tab>"+y		<C-Y>
162if exists(':tlmenu')
163  tlnoremenu 20.350 &Edit.&Copy<Tab>"+y 	<C-W>:<C-Y><CR>
164endif
165nnoremenu 20.360 &Edit.&Paste<Tab>"+gP		"+gP
166cnoremenu	 &Edit.&Paste<Tab>"+gP		<C-R>+
167if exists(':tlmenu')
168  tlnoremenu	 &Edit.&Paste<Tab>"+gP		<C-W>"+
169endif
170exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP	' . paste#paste_cmd['v']
171exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP	' . paste#paste_cmd['i']
172nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p	[p
173inoremenu	 &Edit.Put\ &Before<Tab>[p	<C-O>[p
174nnoremenu 20.380 &Edit.Put\ &After<Tab>]p	]p
175inoremenu	 &Edit.Put\ &After<Tab>]p	<C-O>]p
176if has("win32")
177  vnoremenu 20.390 &Edit.&Delete<Tab>x		x
178endif
179noremenu  <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	:<C-U>call <SID>SelectAll()<CR>
180inoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	<C-O>:call <SID>SelectAll()<CR>
181cnoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG	<C-U>call <SID>SelectAll()<CR>
182
183an 20.405	 &Edit.-SEP2-				<Nop>
184if has("win32") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
185  an 20.410	 &Edit.&Find\.\.\.			:promptfind<CR>
186  vunmenu	 &Edit.&Find\.\.\.
187  vnoremenu <silent>	 &Edit.&Find\.\.\.		y:promptfind <C-R>=<SID>FixFText()<CR><CR>
188  an 20.420	 &Edit.Find\ and\ Rep&lace\.\.\.	:promptrepl<CR>
189  vunmenu	 &Edit.Find\ and\ Rep&lace\.\.\.
190  vnoremenu <silent>	 &Edit.Find\ and\ Rep&lace\.\.\. y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
191else
192  an 20.410	 &Edit.&Find<Tab>/			/
193  an 20.420	 &Edit.Find\ and\ Rep&lace<Tab>:%s	:%s/
194  vunmenu	 &Edit.Find\ and\ Rep&lace<Tab>:%s
195  vnoremenu	 &Edit.Find\ and\ Rep&lace<Tab>:s	:s/
196endif
197
198an 20.425	 &Edit.-SEP3-				<Nop>
199an 20.430	 &Edit.Settings\ &Window		:options<CR>
200an 20.435	 &Edit.Startup\ &Settings		:call <SID>EditVimrc()<CR>
201
202fun! s:EditVimrc()
203  if $MYVIMRC != ''
204    let fname = $MYVIMRC
205  elseif has("win32")
206    if $HOME != ''
207      let fname = $HOME . "/_vimrc"
208    else
209      let fname = $VIM . "/_vimrc"
210    endif
211  elseif has("amiga")
212    let fname = "s:.vimrc"
213  else
214    let fname = $HOME . "/.vimrc"
215  endif
216  let fname = s:FnameEscape(fname)
217  if &mod
218    exe "split " . fname
219  else
220    exe "edit " . fname
221  endif
222endfun
223
224fun! s:FixFText()
225  " Fix text in nameless register to be used with :promptfind.
226  return substitute(@", "[\r\n]", '\\n', 'g')
227endfun
228
229" Edit/Global Settings
230an 20.440.100 &Edit.&Global\ Settings.Toggle\ Pattern\ &Highlight<Tab>:set\ hls!	:set hls! hls?<CR>
231an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Ignoring\ Case<Tab>:set\ ic!	:set ic! ic?<CR>
232an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm!	:set sm! sm?<CR>
233
234an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 1\  :set so=1<CR>
235an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 2\  :set so=2<CR>
236an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 3\  :set so=3<CR>
237an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 4\  :set so=4<CR>
238an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 5\  :set so=5<CR>
239an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 7\  :set so=7<CR>
240an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 10\  :set so=10<CR>
241an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 100\  :set so=100<CR>
242
243an 20.440.130.40 &Edit.&Global\ Settings.&Virtual\ Edit.Never :set ve=<CR>
244an 20.440.130.50 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ Selection :set ve=block<CR>
245an 20.440.130.60 &Edit.&Global\ Settings.&Virtual\ Edit.Insert\ Mode :set ve=insert<CR>
246an 20.440.130.70 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ and\ Insert :set ve=block,insert<CR>
247an 20.440.130.80 &Edit.&Global\ Settings.&Virtual\ Edit.Always :set ve=all<CR>
248an 20.440.140 &Edit.&Global\ Settings.Toggle\ Insert\ &Mode<Tab>:set\ im!	:set im!<CR>
249an 20.440.145 &Edit.&Global\ Settings.Toggle\ Vi\ C&ompatibility<Tab>:set\ cp!	:set cp!<CR>
250an <silent> 20.440.150 &Edit.&Global\ Settings.Search\ &Path\.\.\.  :call <SID>SearchP()<CR>
251an <silent> 20.440.160 &Edit.&Global\ Settings.Ta&g\ Files\.\.\.  :call <SID>TagFiles()<CR>
252"
253" GUI options
254an 20.440.300 &Edit.&Global\ Settings.-SEP1-				<Nop>
255an <silent> 20.440.310 &Edit.&Global\ Settings.Toggle\ &Toolbar		:call <SID>ToggleGuiOption("T")<CR>
256an <silent> 20.440.320 &Edit.&Global\ Settings.Toggle\ &Bottom\ Scrollbar :call <SID>ToggleGuiOption("b")<CR>
257an <silent> 20.440.330 &Edit.&Global\ Settings.Toggle\ &Left\ Scrollbar	:call <SID>ToggleGuiOption("l")<CR>
258an <silent> 20.440.340 &Edit.&Global\ Settings.Toggle\ &Right\ Scrollbar :call <SID>ToggleGuiOption("r")<CR>
259
260fun! s:SearchP()
261  if !exists("g:menutrans_path_dialog")
262    let g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
263  endif
264  let n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
265  if n != ""
266    let &path = substitute(n, ' ', '\\ ', 'g')
267  endif
268endfun
269
270fun! s:TagFiles()
271  if !exists("g:menutrans_tags_dialog")
272    let g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
273  endif
274  let n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
275  if n != ""
276    let &tags = substitute(n, ' ', '\\ ', 'g')
277  endif
278endfun
279
280fun! s:ToggleGuiOption(option)
281    " If a:option is already set in guioptions, then we want to remove it
282    if match(&guioptions, "\\C" . a:option) > -1
283	exec "set go-=" . a:option
284    else
285	exec "set go+=" . a:option
286    endif
287endfun
288
289" Edit/File Settings
290
291" Boolean options
292an 20.440.100 &Edit.F&ile\ Settings.Toggle\ Line\ &Numbering<Tab>:set\ nu!	:set nu! nu?<CR>
293an 20.440.105 &Edit.F&ile\ Settings.Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu!	:set rnu! rnu?<CR>
294an 20.440.110 &Edit.F&ile\ Settings.Toggle\ &List\ Mode<Tab>:set\ list!	:set list! list?<CR>
295an 20.440.120 &Edit.F&ile\ Settings.Toggle\ Line\ &Wrapping<Tab>:set\ wrap!	:set wrap! wrap?<CR>
296an 20.440.130 &Edit.F&ile\ Settings.Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr!	:set lbr! lbr?<CR>
297an 20.440.160 &Edit.F&ile\ Settings.Toggle\ Tab\ &Expanding<Tab>:set\ et!	:set et! et?<CR>
298an 20.440.170 &Edit.F&ile\ Settings.Toggle\ &Auto\ Indenting<Tab>:set\ ai!	:set ai! ai?<CR>
299an 20.440.180 &Edit.F&ile\ Settings.Toggle\ &C-Style\ Indenting<Tab>:set\ cin!	:set cin! cin?<CR>
300
301" other options
302an 20.440.600 &Edit.F&ile\ Settings.-SEP2-		<Nop>
303an 20.440.610.20 &Edit.F&ile\ Settings.&Shiftwidth.2	:set sw=2 sw?<CR>
304an 20.440.610.30 &Edit.F&ile\ Settings.&Shiftwidth.3	:set sw=3 sw?<CR>
305an 20.440.610.40 &Edit.F&ile\ Settings.&Shiftwidth.4	:set sw=4 sw?<CR>
306an 20.440.610.50 &Edit.F&ile\ Settings.&Shiftwidth.5	:set sw=5 sw?<CR>
307an 20.440.610.60 &Edit.F&ile\ Settings.&Shiftwidth.6	:set sw=6 sw?<CR>
308an 20.440.610.80 &Edit.F&ile\ Settings.&Shiftwidth.8	:set sw=8 sw?<CR>
309
310an 20.440.620.20 &Edit.F&ile\ Settings.Soft\ &Tabstop.2	:set sts=2 sts?<CR>
311an 20.440.620.30 &Edit.F&ile\ Settings.Soft\ &Tabstop.3	:set sts=3 sts?<CR>
312an 20.440.620.40 &Edit.F&ile\ Settings.Soft\ &Tabstop.4	:set sts=4 sts?<CR>
313an 20.440.620.50 &Edit.F&ile\ Settings.Soft\ &Tabstop.5	:set sts=5 sts?<CR>
314an 20.440.620.60 &Edit.F&ile\ Settings.Soft\ &Tabstop.6	:set sts=6 sts?<CR>
315an 20.440.620.80 &Edit.F&ile\ Settings.Soft\ &Tabstop.8	:set sts=8 sts?<CR>
316
317an <silent> 20.440.630 &Edit.F&ile\ Settings.Te&xt\ Width\.\.\.  :call <SID>TextWidth()<CR>
318an <silent> 20.440.640 &Edit.F&ile\ Settings.&File\ Format\.\.\.  :call <SID>FileFormat()<CR>
319fun! s:TextWidth()
320  if !exists("g:menutrans_textwidth_dialog")
321    let g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
322  endif
323  let n = inputdialog(g:menutrans_textwidth_dialog, &tw)
324  if n != ""
325    " Remove leading zeros to avoid it being used as an octal number.
326    " But keep a zero by itself.
327    let tw = substitute(n, "^0*", "", "")
328    let &tw = tw == '' ? 0 : tw
329  endif
330endfun
331
332fun! s:FileFormat()
333  if !exists("g:menutrans_fileformat_dialog")
334    let g:menutrans_fileformat_dialog = "Select format for writing the file"
335  endif
336  if !exists("g:menutrans_fileformat_choices")
337    let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
338  endif
339  if &ff == "dos"
340    let def = 2
341  elseif &ff == "mac"
342    let def = 3
343  else
344    let def = 1
345  endif
346  let n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def, "Question")
347  if n == 1
348    set ff=unix
349  elseif n == 2
350    set ff=dos
351  elseif n == 3
352    set ff=mac
353  endif
354endfun
355
356let s:did_setup_color_schemes = 0
357
358" Setup the Edit.Color Scheme submenu
359func s:SetupColorSchemes() abort
360  if s:did_setup_color_schemes
361    return
362  endif
363  let s:did_setup_color_schemes = 1
364
365  let n = globpath(&runtimepath, "colors/*.vim", 1, 1)
366  let n += globpath(&packpath, "pack/*/start/*/colors/*.vim", 1, 1)
367  let n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
368
369  " Ignore case for VMS and windows, sort on name
370  let names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
371
372  " define all the submenu entries
373  let idx = 100
374  for name in names
375    exe "an 20.450." . idx . ' &Edit.C&olor\ Scheme.' . name . " :colors " . name . "<CR>"
376    let idx = idx + 10
377  endfor
378  silent! aunmenu &Edit.Show\ C&olor\ Schemes\ in\ Menu
379endfun
380if exists("do_no_lazyload_menus")
381  call s:SetupColorSchemes()
382else
383  an <silent> 20.450 &Edit.Show\ C&olor\ Schemes\ in\ Menu :call <SID>SetupColorSchemes()<CR>
384endif
385
386
387" Setup the Edit.Keymap submenu
388if has("keymap")
389  let s:did_setup_keymaps = 0
390
391  func s:SetupKeymaps() abort
392    if s:did_setup_keymaps
393      return
394    endif
395    let s:did_setup_keymaps = 1
396
397    let n = globpath(&runtimepath, "keymap/*.vim", 1, 1)
398    if !empty(n)
399      let idx = 100
400      an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
401      for name in n
402	" Ignore case for VMS and windows
403	let name = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
404	exe "an 20.460." . idx . ' &Edit.&Keymap.' . name . " :set keymap=" . name . "<CR>"
405	let idx = idx + 10
406      endfor
407    endif
408    silent! aunmenu &Edit.Show\ &Keymaps\ in\ Menu
409  endfun
410  if exists("do_no_lazyload_menus")
411    call s:SetupKeymaps()
412  else
413    an <silent> 20.460 &Edit.Show\ &Keymaps\ in\ Menu :call <SID>SetupKeymaps()<CR>
414  endif
415endif
416if has("win32") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
417  an 20.470 &Edit.Select\ Fo&nt\.\.\.	:set guifont=*<CR>
418endif
419
420" Programming menu
421if !exists("g:ctags_command")
422  if has("vms")
423    let g:ctags_command = "mc vim:ctags *.*"
424  else
425    let g:ctags_command = "ctags -R ."
426  endif
427endif
428
429an 40.300 &Tools.&Jump\ to\ This\ Tag<Tab>g^]	g<C-]>
430vunmenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]
431vnoremenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]	g<C-]>
432an 40.310 &Tools.Jump\ &Back<Tab>^T		<C-T>
433an 40.320 &Tools.Build\ &Tags\ File		:exe "!" . g:ctags_command<CR>
434
435if has("folding") || has("spell")
436  an 40.330 &Tools.-SEP1-						<Nop>
437endif
438
439" Tools.Spelling Menu
440if has("spell")
441  an 40.335.110 &Tools.&Spelling.&Spell\ Check\ On		:set spell<CR>
442  an 40.335.120 &Tools.&Spelling.Spell\ Check\ &Off		:set nospell<CR>
443  an 40.335.130 &Tools.&Spelling.To\ &Next\ Error<Tab>]s	]s
444  an 40.335.130 &Tools.&Spelling.To\ &Previous\ Error<Tab>[s	[s
445  an 40.335.140 &Tools.&Spelling.Suggest\ &Corrections<Tab>z=	z=
446  an 40.335.150 &Tools.&Spelling.&Repeat\ Correction<Tab>:spellrepall	:spellrepall<CR>
447  an 40.335.200 &Tools.&Spelling.-SEP1-				<Nop>
448  an 40.335.210 &Tools.&Spelling.Set\ Language\ to\ "en"	:set spl=en spell<CR>
449  an 40.335.220 &Tools.&Spelling.Set\ Language\ to\ "en_au"	:set spl=en_au spell<CR>
450  an 40.335.230 &Tools.&Spelling.Set\ Language\ to\ "en_ca"	:set spl=en_ca spell<CR>
451  an 40.335.240 &Tools.&Spelling.Set\ Language\ to\ "en_gb"	:set spl=en_gb spell<CR>
452  an 40.335.250 &Tools.&Spelling.Set\ Language\ to\ "en_nz"	:set spl=en_nz spell<CR>
453  an 40.335.260 &Tools.&Spelling.Set\ Language\ to\ "en_us"	:set spl=en_us spell<CR>
454  an <silent> 40.335.270 &Tools.&Spelling.&Find\ More\ Languages	:call <SID>SpellLang()<CR>
455
456  let s:undo_spellang = ['aun &Tools.&Spelling.&Find\ More\ Languages']
457  func s:SpellLang()
458    for cmd in s:undo_spellang
459      exe "silent! " . cmd
460    endfor
461    let s:undo_spellang = []
462
463    if &enc == "iso-8859-15"
464      let enc = "latin1"
465    else
466      let enc = &enc
467    endif
468
469    if !exists("g:menutrans_set_lang_to")
470      let g:menutrans_set_lang_to = 'Set Language to'
471    endif
472
473    let found = 0
474    let s = globpath(&runtimepath, "spell/*." . enc . ".spl", 1, 1)
475    if !empty(s)
476      let n = 300
477      for f in s
478	let nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
479	if nm != "en" && nm !~ '/'
480          let _nm = nm
481	  let found += 1
482	  let menuname = '&Tools.&Spelling.' . escape(g:menutrans_set_lang_to, "\\. \t|") . '\ "' . nm . '"'
483	  exe 'an 40.335.' . n . ' ' . menuname . ' :set spl=' . nm . ' spell<CR>'
484	  let s:undo_spellang += ['aun ' . menuname]
485	endif
486	let n += 10
487      endfor
488    endif
489    if found == 0
490      echomsg "Could not find other spell files"
491    elseif found == 1
492      echomsg "Found spell file " . _nm
493    else
494      echomsg "Found " . found . " more spell files"
495    endif
496    " Need to redo this when 'encoding' is changed.
497    augroup spellmenu
498    au! EncodingChanged * call <SID>SpellLang()
499    augroup END
500  endfun
501
502endif
503
504" Tools.Fold Menu
505if has("folding")
506  " open close folds
507  an 40.340.110 &Tools.&Folding.&Enable/Disable\ Folds<Tab>zi		zi
508  an 40.340.120 &Tools.&Folding.&View\ Cursor\ Line<Tab>zv		zv
509  an 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx	zMzx
510  inoremenu 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx  <C-O>zM<C-O>zx
511  an 40.340.130 &Tools.&Folding.C&lose\ More\ Folds<Tab>zm		zm
512  an 40.340.140 &Tools.&Folding.&Close\ All\ Folds<Tab>zM		zM
513  an 40.340.150 &Tools.&Folding.O&pen\ More\ Folds<Tab>zr		zr
514  an 40.340.160 &Tools.&Folding.&Open\ All\ Folds<Tab>zR		zR
515  " fold method
516  an 40.340.200 &Tools.&Folding.-SEP1-			<Nop>
517  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.M&anual	:set fdm=manual<CR>
518  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.I&ndent	:set fdm=indent<CR>
519  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.E&xpression :set fdm=expr<CR>
520  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.S&yntax	:set fdm=syntax<CR>
521  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.&Diff	:set fdm=diff<CR>
522  an 40.340.210 &Tools.&Folding.Fold\ Met&hod.Ma&rker	:set fdm=marker<CR>
523  " create and delete folds
524  vnoremenu 40.340.220 &Tools.&Folding.Create\ &Fold<Tab>zf	zf
525  an 40.340.230 &Tools.&Folding.&Delete\ Fold<Tab>zd		zd
526  an 40.340.240 &Tools.&Folding.Delete\ &All\ Folds<Tab>zD	zD
527  " moving around in folds
528  an 40.340.300 &Tools.&Folding.-SEP2-				<Nop>
529  an 40.340.310.10 &Tools.&Folding.Fold\ Col&umn\ Width.\ &0\ 	:set fdc=0<CR>
530  an 40.340.310.20 &Tools.&Folding.Fold\ Col&umn\ Width.\ &2\ 	:set fdc=2<CR>
531  an 40.340.310.30 &Tools.&Folding.Fold\ Col&umn\ Width.\ &3\ 	:set fdc=3<CR>
532  an 40.340.310.40 &Tools.&Folding.Fold\ Col&umn\ Width.\ &4\ 	:set fdc=4<CR>
533  an 40.340.310.50 &Tools.&Folding.Fold\ Col&umn\ Width.\ &5\ 	:set fdc=5<CR>
534  an 40.340.310.60 &Tools.&Folding.Fold\ Col&umn\ Width.\ &6\ 	:set fdc=6<CR>
535  an 40.340.310.70 &Tools.&Folding.Fold\ Col&umn\ Width.\ &7\ 	:set fdc=7<CR>
536  an 40.340.310.80 &Tools.&Folding.Fold\ Col&umn\ Width.\ &8\ 	:set fdc=8<CR>
537endif  " has folding
538
539if has("diff")
540  an 40.350.100 &Tools.&Diff.&Update		:diffupdate<CR>
541  an 40.350.110 &Tools.&Diff.&Get\ Block	:diffget<CR>
542  vunmenu &Tools.&Diff.&Get\ Block
543  vnoremenu &Tools.&Diff.&Get\ Block		:diffget<CR>
544  an 40.350.120 &Tools.&Diff.&Put\ Block	:diffput<CR>
545  vunmenu &Tools.&Diff.&Put\ Block
546  vnoremenu &Tools.&Diff.&Put\ Block		:diffput<CR>
547endif
548
549an 40.358 &Tools.-SEP2-					<Nop>
550an 40.360 &Tools.&Make<Tab>:make			:make<CR>
551an 40.370 &Tools.&List\ Errors<Tab>:cl			:cl<CR>
552an 40.380 &Tools.L&ist\ Messages<Tab>:cl!		:cl!<CR>
553an 40.390 &Tools.&Next\ Error<Tab>:cn			:cn<CR>
554an 40.400 &Tools.&Previous\ Error<Tab>:cp		:cp<CR>
555an 40.410 &Tools.&Older\ List<Tab>:cold			:colder<CR>
556an 40.420 &Tools.N&ewer\ List<Tab>:cnew			:cnewer<CR>
557an 40.430.50 &Tools.Error\ &Window.&Update<Tab>:cwin	:cwin<CR>
558an 40.430.60 &Tools.Error\ &Window.&Open<Tab>:copen	:copen<CR>
559an 40.430.70 &Tools.Error\ &Window.&Close<Tab>:cclose	:cclose<CR>
560
561an 40.520 &Tools.-SEP3-					<Nop>
562an <silent> 40.530 &Tools.&Convert\ to\ HEX<Tab>:%!xxd
563	\ :call <SID>XxdConv()<CR>
564an <silent> 40.540 &Tools.Conve&rt\ Back<Tab>:%!xxd\ -r
565	\ :call <SID>XxdBack()<CR>
566
567" Use a function to do the conversion, so that it also works with 'insertmode'
568" set.
569func s:XxdConv()
570  let mod = &mod
571  if has("vms")
572    %!mc vim:xxd
573  else
574    call s:XxdFind()
575    exe '%!' . g:xxdprogram
576  endif
577  if getline(1) =~ "^0000000:"		" only if it worked
578    set ft=xxd
579  endif
580  let &mod = mod
581endfun
582
583func s:XxdBack()
584  let mod = &mod
585  if has("vms")
586    %!mc vim:xxd -r
587  else
588    call s:XxdFind()
589    exe '%!' . g:xxdprogram . ' -r'
590  endif
591  set ft=
592  doautocmd filetypedetect BufReadPost
593  let &mod = mod
594endfun
595
596func s:XxdFind()
597  if !exists("g:xxdprogram")
598    " On the PC xxd may not be in the path but in the install directory
599    if has("win32") && !executable("xxd")
600      let g:xxdprogram = $VIMRUNTIME . (&shellslash ? '/' : '\') . "xxd.exe"
601      if g:xxdprogram =~ ' '
602	let g:xxdprogram = '"' .. g:xxdprogram .. '"'
603      endif
604    else
605      let g:xxdprogram = "xxd"
606    endif
607  endif
608endfun
609
610let s:did_setup_compilers = 0
611
612" Setup the Tools.Compiler submenu
613func s:SetupCompilers() abort
614  if s:did_setup_compilers
615    return
616  endif
617  let s:did_setup_compilers = 1
618
619  let n = globpath(&runtimepath, "compiler/*.vim", 1, 1)
620  let idx = 100
621  for name in n
622    " Ignore case for VMS and windows
623    let name = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
624    exe "an 30.440." . idx . ' &Tools.Se&t\ Compiler.' . name . " :compiler " . name . "<CR>"
625    let idx = idx + 10
626  endfor
627  silent! aunmenu &Tools.Show\ Compiler\ Se&ttings\ in\ Menu
628endfun
629if exists("do_no_lazyload_menus")
630  call s:SetupCompilers()
631else
632  an <silent> 30.440 &Tools.Show\ Compiler\ Se&ttings\ in\ Menu :call <SID>SetupCompilers()<CR>
633endif
634
635" Load ColorScheme, Compiler Setting and Keymap menus when idle.
636if !exists("do_no_lazyload_menus")
637  func s:SetupLazyloadMenus()
638    call s:SetupColorSchemes()
639    call s:SetupCompilers()
640    if has("keymap")
641      call s:SetupKeymaps()
642    endif
643  endfunc
644  augroup SetupLazyloadMenus
645    au!
646    au CursorHold,CursorHoldI * call <SID>SetupLazyloadMenus() | au! SetupLazyloadMenus
647  augroup END
648endif
649
650
651if !exists("no_buffers_menu")
652
653" Buffer list menu -- Setup functions & actions
654
655" wait with building the menu until after loading 'session' files. Makes
656" startup faster.
657let s:bmenu_wait = 1
658
659" Dictionary of buffer number to name. This helps prevent problems where a
660" buffer as renamed and we didn't keep track of that.
661let s:bmenu_items = {}
662
663if !exists("bmenu_priority")
664  let bmenu_priority = 60
665endif
666
667" invoked from a BufCreate or BufFilePost autocommand
668func s:BMAdd()
669  if s:bmenu_wait == 0
670    " when adding too many buffers, redraw in short format
671    if s:bmenu_count == &menuitems && s:bmenu_short == 0
672      call s:BMShow()
673    else
674      let name = expand("<afile>")
675      let num = expand("<abuf>")
676      if s:BMCanAdd(name, num)
677	call <SID>BMFilename(name, num)
678	let s:bmenu_count += 1
679      endif
680    endif
681  endif
682endfunc
683
684" invoked from a BufDelete or BufFilePre autocommand
685func s:BMRemove()
686  if s:bmenu_wait == 0
687    let bufnum = expand("<abuf>")
688    if s:bmenu_items->has_key(bufnum)
689      let menu_name = s:bmenu_items[bufnum]
690      exe 'silent! aun &Buffers.' . menu_name
691      let s:bmenu_count = s:bmenu_count - 1
692      unlet s:bmenu_items[bufnum]
693    endif
694  endif
695endfunc
696
697" Return non-zero if buffer with number "name" / "num" is useful to add in the
698" buffer menu.
699func s:BMCanAdd(name, num)
700  " no directory or unlisted buffer
701  if isdirectory(a:name) || !buflisted(a:num)
702    return 0
703  endif
704
705  " no special buffer, such as terminal or popup
706  let buftype = getbufvar(a:num, '&buftype')
707  if buftype != '' && buftype != 'nofile' && buftype != 'nowrite'
708    return 0
709  endif
710
711  " only existing buffers
712  return bufexists(a:num)
713endfunc
714
715" Create the buffer menu (delete an existing one first).
716func s:BMShow(...)
717  let s:bmenu_wait = 1
718  let s:bmenu_short = 1
719  let s:bmenu_count = 0
720  let s:bmenu_items = {}
721  "
722  " get new priority, if exists
723  if a:0 == 1
724    let g:bmenu_priority = a:1
725  endif
726
727  " Remove old menu, if it exists; keep one entry to avoid a torn off menu to
728  " disappear.  Use try/catch to avoid setting v:errmsg
729  try | unmenu &Buffers | catch | endtry
730  exe 'noremenu ' . g:bmenu_priority . ".1 &Buffers.Dummy l"
731  try | unmenu! &Buffers | catch | endtry
732
733  " create new menu; set 'cpo' to include the <CR>
734  let cpo_save = &cpo
735  set cpo&vim
736  exe 'an <silent> ' . g:bmenu_priority . ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
737  exe 'an ' . g:bmenu_priority . ".4 &Buffers.&Delete :confirm bd<CR>"
738  exe 'an ' . g:bmenu_priority . ".6 &Buffers.&Alternate :confirm b #<CR>"
739  exe 'an ' . g:bmenu_priority . ".7 &Buffers.&Next :confirm bnext<CR>"
740  exe 'an ' . g:bmenu_priority . ".8 &Buffers.&Previous :confirm bprev<CR>"
741  exe 'an ' . g:bmenu_priority . ".9 &Buffers.-SEP- :"
742  let &cpo = cpo_save
743  unmenu &Buffers.Dummy
744
745  " figure out how many buffers there are
746  let buf = 1
747  while buf <= bufnr('$')
748    if s:BMCanAdd(bufname(buf), buf)
749      let s:bmenu_count = s:bmenu_count + 1
750    endif
751    let buf = buf + 1
752  endwhile
753  if s:bmenu_count <= &menuitems
754    let s:bmenu_short = 0
755  endif
756
757  " iterate through buffer list, adding each buffer to the menu:
758  let buf = 1
759  while buf <= bufnr('$')
760    let name = bufname(buf)
761    if s:BMCanAdd(name, buf)
762      call <SID>BMFilename(name, buf)
763    endif
764    let buf = buf + 1
765  endwhile
766  let s:bmenu_wait = 0
767  aug buffer_list
768  au!
769  au BufCreate,BufFilePost * call <SID>BMAdd()
770  au BufDelete,BufFilePre * call <SID>BMRemove()
771  aug END
772endfunc
773
774func s:BMHash(name)
775  " Make name all upper case, so that chars are between 32 and 96
776  let nm = substitute(a:name, ".*", '\U\0', "")
777  if has("ebcdic")
778    " HACK: Replace all non alphabetics with 'Z'
779    "       Just to make it work for now.
780    let nm = substitute(nm, "[^A-Z]", 'Z', "g")
781    let sp = char2nr('A') - 1
782  else
783    let sp = char2nr(' ')
784  endif
785  " convert first six chars into a number for sorting:
786  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)
787endfunc
788
789func s:BMHash2(name)
790  let nm = substitute(a:name, ".", '\L\0', "")
791  " Not exactly right for EBCDIC...
792  if nm[0] < 'a' || nm[0] > 'z'
793    return '&others.'
794  elseif nm[0] <= 'd'
795    return '&abcd.'
796  elseif nm[0] <= 'h'
797    return '&efgh.'
798  elseif nm[0] <= 'l'
799    return '&ijkl.'
800  elseif nm[0] <= 'p'
801    return '&mnop.'
802  elseif nm[0] <= 't'
803    return '&qrst.'
804  else
805    return '&u-z.'
806  endif
807endfunc
808
809" Insert a buffer name into the buffer menu.
810func s:BMFilename(name, num)
811  let munge = <SID>BMMunge(a:name, a:num)
812  let hash = <SID>BMHash(munge)
813  if s:bmenu_short == 0
814    let s:bmenu_items[a:num] = munge
815    let cmd = 'an ' . g:bmenu_priority . '.' . hash . ' &Buffers.' . munge
816  else
817    let menu_name = <SID>BMHash2(munge) . munge
818    let s:bmenu_items[a:num] = menu_name
819    let cmd = 'an ' . g:bmenu_priority . '.' . hash . '.' . hash . ' &Buffers.' . menu_name
820  endif
821  " set 'cpo' to include the <CR>
822  let cpo_save = &cpo
823  set cpo&vim
824  exe cmd . ' :confirm b' . a:num . '<CR>'
825  let &cpo = cpo_save
826endfunc
827
828" Truncate a long path to fit it in a menu item.
829if !exists("g:bmenu_max_pathlen")
830  let g:bmenu_max_pathlen = 35
831endif
832func s:BMTruncName(fname)
833  let name = a:fname
834  if g:bmenu_max_pathlen < 5
835    let name = ""
836  else
837    let len = strlen(name)
838    if len > g:bmenu_max_pathlen
839      let amountl = (g:bmenu_max_pathlen / 2) - 2
840      let amountr = g:bmenu_max_pathlen - amountl - 3
841      let pattern = '^\(.\{,' . amountl . '}\).\{-}\(.\{,' . amountr . '}\)$'
842      let left = substitute(name, pattern, '\1', '')
843      let right = substitute(name, pattern, '\2', '')
844      if strlen(left) + strlen(right) < len
845	let name = left . '...' . right
846      endif
847    endif
848  endif
849  return name
850endfunc
851
852func s:BMMunge(fname, bnum)
853  let name = a:fname
854  if name == ''
855    if !exists("g:menutrans_no_file")
856      let g:menutrans_no_file = "[No Name]"
857    endif
858    let name = g:menutrans_no_file
859  else
860    let name = fnamemodify(name, ':p:~')
861  endif
862  " detach file name and separate it out:
863  let name2 = fnamemodify(name, ':t')
864  if a:bnum >= 0
865    let name2 = name2 . ' (' . a:bnum . ')'
866  endif
867  let name = name2 . "\t" . <SID>BMTruncName(fnamemodify(name,':h'))
868  let name = escape(name, "\\. \t|")
869  let name = substitute(name, "&", "&&", "g")
870  let name = substitute(name, "\n", "^@", "g")
871  return name
872endfunc
873
874" When just starting Vim, load the buffer menu later
875if has("vim_starting")
876  augroup LoadBufferMenu
877    au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
878    au  VimEnter * au! LoadBufferMenu
879  augroup END
880else
881  call <SID>BMShow()
882endif
883
884endif " !exists("no_buffers_menu")
885
886" Window menu
887an 70.300 &Window.&New<Tab>^Wn			<C-W>n
888an 70.310 &Window.S&plit<Tab>^Ws		<C-W>s
889an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^	<C-W><C-^>
890an 70.330 &Window.Split\ &Vertically<Tab>^Wv	<C-W>v
891an <silent> 70.332 &Window.Split\ File\ E&xplorer	:call MenuExplOpen()<CR>
892if !exists("*MenuExplOpen")
893  fun MenuExplOpen()
894    if @% == ""
895      20vsp .
896    else
897      exe "20vsp " . s:FnameEscape(expand("%:p:h"))
898    endif
899  endfun
900endif
901an 70.335 &Window.-SEP1-				<Nop>
902an 70.340 &Window.&Close<Tab>^Wc			:confirm close<CR>
903an 70.345 &Window.Close\ &Other(s)<Tab>^Wo		:confirm only<CR>
904an 70.350 &Window.-SEP2-				<Nop>
905an 70.355 &Window.Move\ &To.&Top<Tab>^WK		<C-W>K
906an 70.355 &Window.Move\ &To.&Bottom<Tab>^WJ		<C-W>J
907an 70.355 &Window.Move\ &To.&Left\ Side<Tab>^WH		<C-W>H
908an 70.355 &Window.Move\ &To.&Right\ Side<Tab>^WL	<C-W>L
909an 70.360 &Window.Rotate\ &Up<Tab>^WR			<C-W>R
910an 70.362 &Window.Rotate\ &Down<Tab>^Wr			<C-W>r
911an 70.365 &Window.-SEP3-				<Nop>
912an 70.370 &Window.&Equal\ Size<Tab>^W=			<C-W>=
913an 70.380 &Window.&Max\ Height<Tab>^W_			<C-W>_
914an 70.390 &Window.M&in\ Height<Tab>^W1_			<C-W>1_
915an 70.400 &Window.Max\ &Width<Tab>^W\|			<C-W>\|
916an 70.410 &Window.Min\ Widt&h<Tab>^W1\|			<C-W>1\|
917
918" The popup menu
919an 1.10 PopUp.&Undo			u
920an 1.15 PopUp.-SEP1-			<Nop>
921vnoremenu 1.20 PopUp.Cu&t		"+x
922vnoremenu 1.30 PopUp.&Copy		"+y
923cnoremenu 1.30 PopUp.&Copy		<C-Y>
924nnoremenu 1.40 PopUp.&Paste		"+gP
925cnoremenu 1.40 PopUp.&Paste		<C-R>+
926exe 'vnoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['v']
927exe 'inoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['i']
928vnoremenu 1.50 PopUp.&Delete		x
929an 1.55 PopUp.-SEP2-			<Nop>
930vnoremenu 1.60 PopUp.Select\ Blockwise	<C-V>
931
932nnoremenu 1.70 PopUp.Select\ &Word	vaw
933onoremenu 1.70 PopUp.Select\ &Word	aw
934vnoremenu 1.70 PopUp.Select\ &Word	<C-C>vaw
935inoremenu 1.70 PopUp.Select\ &Word	<C-O>vaw
936cnoremenu 1.70 PopUp.Select\ &Word	<C-C>vaw
937
938nnoremenu 1.73 PopUp.Select\ &Sentence	vas
939onoremenu 1.73 PopUp.Select\ &Sentence	as
940vnoremenu 1.73 PopUp.Select\ &Sentence	<C-C>vas
941inoremenu 1.73 PopUp.Select\ &Sentence	<C-O>vas
942cnoremenu 1.73 PopUp.Select\ &Sentence	<C-C>vas
943
944nnoremenu 1.77 PopUp.Select\ Pa&ragraph	vap
945onoremenu 1.77 PopUp.Select\ Pa&ragraph	ap
946vnoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-C>vap
947inoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-O>vap
948cnoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-C>vap
949
950nnoremenu 1.80 PopUp.Select\ &Line	V
951onoremenu 1.80 PopUp.Select\ &Line	<C-C>V
952vnoremenu 1.80 PopUp.Select\ &Line	<C-C>V
953inoremenu 1.80 PopUp.Select\ &Line	<C-O>V
954cnoremenu 1.80 PopUp.Select\ &Line	<C-C>V
955
956nnoremenu 1.90 PopUp.Select\ &Block	<C-V>
957onoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
958vnoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
959inoremenu 1.90 PopUp.Select\ &Block	<C-O><C-V>
960cnoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
961
962noremenu  <script> <silent> 1.100 PopUp.Select\ &All	:<C-U>call <SID>SelectAll()<CR>
963inoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-O>:call <SID>SelectAll()<CR>
964cnoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-U>call <SID>SelectAll()<CR>
965
966if has("spell")
967  " Spell suggestions in the popup menu.  Note that this will slow down the
968  " appearance of the menu!
969  func s:SpellPopup()
970    if exists("s:changeitem") && s:changeitem != ''
971      call <SID>SpellDel()
972    endif
973
974    " Return quickly if spell checking is not enabled.
975    if !&spell || &spelllang == ''
976      return
977    endif
978
979    let curcol = col('.')
980    let [w, a] = spellbadword()
981    if col('.') > curcol		" don't use word after the cursor
982      let w = ''
983    endif
984    if w != ''
985      if a == 'caps'
986	let s:suglist = [substitute(w, '.*', '\u&', '')]
987      else
988	let s:suglist = spellsuggest(w, 10)
989      endif
990      if len(s:suglist) > 0
991	if !exists("g:menutrans_spell_change_ARG_to")
992	  let g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
993	endif
994	let s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
995	let s:fromword = w
996	let pri = 1
997	" set 'cpo' to include the <CR>
998	let cpo_save = &cpo
999	set cpo&vim
1000	for sug in s:suglist
1001	  exe 'anoremenu 1.5.' . pri . ' PopUp.' . s:changeitem . '.' . escape(sug, ' .')
1002		\ . ' :call <SID>SpellReplace(' . pri . ')<CR>'
1003	  let pri += 1
1004	endfor
1005
1006	if !exists("g:menutrans_spell_add_ARG_to_word_list")
1007	  let g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
1008	endif
1009	let s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
1010	exe 'anoremenu 1.6 PopUp.' . s:additem . ' :spellgood ' . w . '<CR>'
1011
1012	if !exists("g:menutrans_spell_ignore_ARG")
1013	  let g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
1014	endif
1015	let s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
1016	exe 'anoremenu 1.7 PopUp.' . s:ignoreitem . ' :spellgood! ' . w . '<CR>'
1017
1018	anoremenu 1.8 PopUp.-SpellSep- :
1019	let &cpo = cpo_save
1020      endif
1021    endif
1022    call cursor(0, curcol)	" put the cursor back where it was
1023  endfunc
1024
1025  func s:SpellReplace(n)
1026    let l = getline('.')
1027    " Move the cursor to the start of the word.
1028    call spellbadword()
1029    call setline('.', strpart(l, 0, col('.') - 1) . s:suglist[a:n - 1]
1030	  \ . strpart(l, col('.') + len(s:fromword) - 1))
1031  endfunc
1032
1033  func s:SpellDel()
1034    exe "aunmenu PopUp." . s:changeitem
1035    exe "aunmenu PopUp." . s:additem
1036    exe "aunmenu PopUp." . s:ignoreitem
1037    aunmenu PopUp.-SpellSep-
1038    let s:changeitem = ''
1039  endfun
1040
1041  augroup SpellPopupMenu
1042    au! MenuPopup * call <SID>SpellPopup()
1043  augroup END
1044endif
1045
1046" The GUI toolbar (for MS-Windows and GTK)
1047if has("toolbar")
1048  an 1.10 ToolBar.Open			:browse confirm e<CR>
1049  an <silent> 1.20 ToolBar.Save		:if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
1050  an 1.30 ToolBar.SaveAll		:browse confirm wa<CR>
1051
1052  if has("printer")
1053    an 1.40   ToolBar.Print		:hardcopy<CR>
1054    vunmenu   ToolBar.Print
1055    vnoremenu ToolBar.Print		:hardcopy<CR>
1056  elseif has("unix")
1057    an 1.40   ToolBar.Print		:w !lpr<CR>
1058    vunmenu   ToolBar.Print
1059    vnoremenu ToolBar.Print		:w !lpr<CR>
1060  endif
1061
1062  an 1.45 ToolBar.-sep1-		<Nop>
1063  an 1.50 ToolBar.Undo			u
1064  an 1.60 ToolBar.Redo			<C-R>
1065
1066  an 1.65 ToolBar.-sep2-		<Nop>
1067  vnoremenu 1.70 ToolBar.Cut		"+x
1068  vnoremenu 1.80 ToolBar.Copy		"+y
1069  cnoremenu 1.80 ToolBar.Copy		<C-Y>
1070  nnoremenu 1.90 ToolBar.Paste		"+gP
1071  cnoremenu	 ToolBar.Paste		<C-R>+
1072  exe 'vnoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['v']
1073  exe 'inoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['i']
1074
1075  if !has("gui_athena")
1076    an 1.95   ToolBar.-sep3-		<Nop>
1077    an 1.100  ToolBar.Replace		:promptrepl<CR>
1078    vunmenu   ToolBar.Replace
1079    vnoremenu ToolBar.Replace		y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
1080    an 1.110  ToolBar.FindNext		n
1081    an 1.120  ToolBar.FindPrev		N
1082  endif
1083
1084  an 1.215 ToolBar.-sep5-		<Nop>
1085  an <silent> 1.220 ToolBar.LoadSesn	:call <SID>LoadVimSesn()<CR>
1086  an <silent> 1.230 ToolBar.SaveSesn	:call <SID>SaveVimSesn()<CR>
1087  an 1.240 ToolBar.RunScript		:browse so<CR>
1088
1089  an 1.245 ToolBar.-sep6-		<Nop>
1090  an 1.250 ToolBar.Make			:make<CR>
1091  an 1.270 ToolBar.RunCtags		:exe "!" . g:ctags_command<CR>
1092  an 1.280 ToolBar.TagJump		g<C-]>
1093
1094  an 1.295 ToolBar.-sep7-		<Nop>
1095  an 1.300 ToolBar.Help			:help<CR>
1096  an <silent> 1.310 ToolBar.FindHelp	:call <SID>Helpfind()<CR>
1097
1098" Only set the tooltips here if not done in a language menu file
1099if exists("*Do_toolbar_tmenu")
1100  call Do_toolbar_tmenu()
1101else
1102  let did_toolbar_tmenu = 1
1103  tmenu ToolBar.Open		Open file
1104  tmenu ToolBar.Save		Save current file
1105  tmenu ToolBar.SaveAll		Save all files
1106  tmenu ToolBar.Print		Print
1107  tmenu ToolBar.Undo		Undo
1108  tmenu ToolBar.Redo		Redo
1109  tmenu ToolBar.Cut		Cut to clipboard
1110  tmenu ToolBar.Copy		Copy to clipboard
1111  tmenu ToolBar.Paste		Paste from Clipboard
1112  if !has("gui_athena")
1113    tmenu ToolBar.Replace	Find / Replace...
1114    tmenu ToolBar.FindNext	Find Next
1115    tmenu ToolBar.FindPrev	Find Previous
1116  endif
1117  tmenu ToolBar.LoadSesn	Choose a session to load
1118  tmenu ToolBar.SaveSesn	Save current session
1119  tmenu ToolBar.RunScript	Choose a Vim Script to run
1120  tmenu ToolBar.Make		Make current project (:make)
1121  tmenu ToolBar.RunCtags	Build tags in current directory tree (!ctags -R .)
1122  tmenu ToolBar.TagJump		Jump to tag under cursor
1123  tmenu ToolBar.Help		Vim Help
1124  tmenu ToolBar.FindHelp	Search Vim Help
1125endif
1126
1127" Select a session to load; default to current session name if present
1128fun! s:LoadVimSesn()
1129  if strlen(v:this_session) > 0
1130    let name = s:FnameEscape(v:this_session)
1131  else
1132    let name = "Session.vim"
1133  endif
1134  execute "browse so " . name
1135endfun
1136
1137" Select a session to save; default to current session name if present
1138fun! s:SaveVimSesn()
1139  if strlen(v:this_session) == 0
1140    let v:this_session = "Session.vim"
1141  endif
1142  execute "browse mksession! " . s:FnameEscape(v:this_session)
1143endfun
1144
1145endif
1146
1147endif " !exists("did_install_default_menus")
1148
1149" Define these items always, so that syntax can be switched on when it wasn't.
1150" But skip them when the Syntax menu was disabled by the user.
1151if !exists("did_install_syntax_menu")
1152  an 50.212 &Syntax.&Manual		:syn manual<CR>
1153  an 50.214 &Syntax.A&utomatic		:syn on<CR>
1154  an <silent> 50.216 &Syntax.On/Off\ for\ &This\ File :call <SID>SynOnOff()<CR>
1155  if !exists("*s:SynOnOff")
1156    fun s:SynOnOff()
1157      if has("syntax_items")
1158	syn clear
1159      else
1160	if !exists("g:syntax_on")
1161	  syn manual
1162	endif
1163	set syn=ON
1164      endif
1165    endfun
1166  endif
1167endif
1168
1169
1170" Install the Syntax menu only when filetype.vim has been loaded or when
1171" manual syntax highlighting is enabled.
1172" Avoid installing the Syntax menu twice.
1173if (exists("did_load_filetypes") || exists("syntax_on"))
1174	\ && !exists("did_install_syntax_menu")
1175  let did_install_syntax_menu = 1
1176
1177" Skip setting up the individual syntax selection menus unless
1178" do_syntax_sel_menu is defined (it takes quite a bit of time).
1179if exists("do_syntax_sel_menu")
1180  runtime! synmenu.vim
1181else
1182  an <silent> 50.10 &Syntax.&Show\ File\ Types\ in\ Menu	:let do_syntax_sel_menu = 1<Bar>runtime! synmenu.vim<Bar>aunmenu &Syntax.&Show\ File\ Types\ in\ Menu<CR>
1183  an 50.195 &Syntax.-SEP1-		<Nop>
1184endif
1185
1186an 50.210 &Syntax.&Off			:syn off<CR>
1187an 50.700 &Syntax.-SEP3-		<Nop>
1188an 50.710 &Syntax.Co&lor\ Test		:sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
1189an 50.720 &Syntax.&Highlight\ Test	:runtime syntax/hitest.vim<CR>
1190an 50.730 &Syntax.&Convert\ to\ HTML	:runtime syntax/2html.vim<CR>
1191
1192endif " !exists("did_install_syntax_menu")
1193
1194" Restore the previous value of 'cpoptions'.
1195let &cpo = s:cpo_save
1196unlet s:cpo_save
1197
1198" vim: set sw=2 :
1199