xref: /vim-8.2.3635/runtime/menu.vim (revision 2387773d)
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:	2019 Dec 10
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! <SID>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
659if !exists("bmenu_priority")
660  let bmenu_priority = 60
661endif
662
663func! s:BMAdd()
664  if s:bmenu_wait == 0
665    " when adding too many buffers, redraw in short format
666    if s:bmenu_count == &menuitems && s:bmenu_short == 0
667      call s:BMShow()
668    else
669      call <SID>BMFilename(expand("<afile>"), expand("<abuf>"))
670      let s:bmenu_count = s:bmenu_count + 1
671    endif
672  endif
673endfunc
674
675func! s:BMRemove()
676  if s:bmenu_wait == 0
677    let name = expand("<afile>")
678    if isdirectory(name)
679      return
680    endif
681    let munge = <SID>BMMunge(name, expand("<abuf>"))
682
683    if s:bmenu_short == 0
684      exe 'silent! aun &Buffers.' . munge
685    else
686      exe 'silent! aun &Buffers.' . <SID>BMHash2(munge) . munge
687    endif
688    let s:bmenu_count = s:bmenu_count - 1
689  endif
690endfunc
691
692" Create the buffer menu (delete an existing one first).
693func! s:BMShow(...)
694  let s:bmenu_wait = 1
695  let s:bmenu_short = 1
696  let s:bmenu_count = 0
697  "
698  " get new priority, if exists
699  if a:0 == 1
700    let g:bmenu_priority = a:1
701  endif
702
703  " Remove old menu, if exists; keep one entry to avoid a torn off menu to
704  " disappear.  Use try/catch to avoid setting v:errmsg
705  try | unmenu &Buffers | catch | endtry
706  exe 'noremenu ' . g:bmenu_priority . ".1 &Buffers.Dummy l"
707  try | unmenu! &Buffers | catch | endtry
708
709  " create new menu; set 'cpo' to include the <CR>
710  let cpo_save = &cpo
711  set cpo&vim
712  exe 'an <silent> ' . g:bmenu_priority . ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
713  exe 'an ' . g:bmenu_priority . ".4 &Buffers.&Delete :confirm bd<CR>"
714  exe 'an ' . g:bmenu_priority . ".6 &Buffers.&Alternate :confirm b #<CR>"
715  exe 'an ' . g:bmenu_priority . ".7 &Buffers.&Next :confirm bnext<CR>"
716  exe 'an ' . g:bmenu_priority . ".8 &Buffers.&Previous :confirm bprev<CR>"
717  exe 'an ' . g:bmenu_priority . ".9 &Buffers.-SEP- :"
718  let &cpo = cpo_save
719  unmenu &Buffers.Dummy
720
721  " figure out how many buffers there are
722  let buf = 1
723  while buf <= bufnr('$')
724    if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
725      let s:bmenu_count = s:bmenu_count + 1
726    endif
727    let buf = buf + 1
728  endwhile
729  if s:bmenu_count <= &menuitems
730    let s:bmenu_short = 0
731  endif
732
733  " iterate through buffer list, adding each buffer to the menu:
734  let buf = 1
735  while buf <= bufnr('$')
736    if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
737      call <SID>BMFilename(bufname(buf), buf)
738    endif
739    let buf = buf + 1
740  endwhile
741  let s:bmenu_wait = 0
742  aug buffer_list
743  au!
744  au BufCreate,BufFilePost * call <SID>BMAdd()
745  au BufDelete,BufFilePre * call <SID>BMRemove()
746  aug END
747endfunc
748
749func! s:BMHash(name)
750  " Make name all upper case, so that chars are between 32 and 96
751  let nm = substitute(a:name, ".*", '\U\0', "")
752  if has("ebcdic")
753    " HACK: Replace all non alphabetics with 'Z'
754    "       Just to make it work for now.
755    let nm = substitute(nm, "[^A-Z]", 'Z', "g")
756    let sp = char2nr('A') - 1
757  else
758    let sp = char2nr(' ')
759  endif
760  " convert first six chars into a number for sorting:
761  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)
762endfunc
763
764func! s:BMHash2(name)
765  let nm = substitute(a:name, ".", '\L\0', "")
766  " Not exactly right for EBCDIC...
767  if nm[0] < 'a' || nm[0] > 'z'
768    return '&others.'
769  elseif nm[0] <= 'd'
770    return '&abcd.'
771  elseif nm[0] <= 'h'
772    return '&efgh.'
773  elseif nm[0] <= 'l'
774    return '&ijkl.'
775  elseif nm[0] <= 'p'
776    return '&mnop.'
777  elseif nm[0] <= 't'
778    return '&qrst.'
779  else
780    return '&u-z.'
781  endif
782endfunc
783
784" insert a buffer name into the buffer menu:
785func! s:BMFilename(name, num)
786  if isdirectory(a:name)
787    return
788  endif
789  let munge = <SID>BMMunge(a:name, a:num)
790  let hash = <SID>BMHash(munge)
791  if s:bmenu_short == 0
792    let name = 'an ' . g:bmenu_priority . '.' . hash . ' &Buffers.' . munge
793  else
794    let name = 'an ' . g:bmenu_priority . '.' . hash . '.' . hash . ' &Buffers.' . <SID>BMHash2(munge) . munge
795  endif
796  " set 'cpo' to include the <CR>
797  let cpo_save = &cpo
798  set cpo&vim
799  exe name . ' :confirm b' . a:num . '<CR>'
800  let &cpo = cpo_save
801endfunc
802
803" Truncate a long path to fit it in a menu item.
804if !exists("g:bmenu_max_pathlen")
805  let g:bmenu_max_pathlen = 35
806endif
807func! s:BMTruncName(fname)
808  let name = a:fname
809  if g:bmenu_max_pathlen < 5
810    let name = ""
811  else
812    let len = strlen(name)
813    if len > g:bmenu_max_pathlen
814      let amountl = (g:bmenu_max_pathlen / 2) - 2
815      let amountr = g:bmenu_max_pathlen - amountl - 3
816      let pattern = '^\(.\{,' . amountl . '}\).\{-}\(.\{,' . amountr . '}\)$'
817      let left = substitute(name, pattern, '\1', '')
818      let right = substitute(name, pattern, '\2', '')
819      if strlen(left) + strlen(right) < len
820	let name = left . '...' . right
821      endif
822    endif
823  endif
824  return name
825endfunc
826
827func! s:BMMunge(fname, bnum)
828  let name = a:fname
829  if name == ''
830    if !exists("g:menutrans_no_file")
831      let g:menutrans_no_file = "[No Name]"
832    endif
833    let name = g:menutrans_no_file
834  else
835    let name = fnamemodify(name, ':p:~')
836  endif
837  " detach file name and separate it out:
838  let name2 = fnamemodify(name, ':t')
839  if a:bnum >= 0
840    let name2 = name2 . ' (' . a:bnum . ')'
841  endif
842  let name = name2 . "\t" . <SID>BMTruncName(fnamemodify(name,':h'))
843  let name = escape(name, "\\. \t|")
844  let name = substitute(name, "&", "&&", "g")
845  let name = substitute(name, "\n", "^@", "g")
846  return name
847endfunc
848
849" When just starting Vim, load the buffer menu later
850if has("vim_starting")
851  augroup LoadBufferMenu
852    au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
853    au  VimEnter * au! LoadBufferMenu
854  augroup END
855else
856  call <SID>BMShow()
857endif
858
859endif " !exists("no_buffers_menu")
860
861" Window menu
862an 70.300 &Window.&New<Tab>^Wn			<C-W>n
863an 70.310 &Window.S&plit<Tab>^Ws		<C-W>s
864an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^	<C-W><C-^>
865an 70.330 &Window.Split\ &Vertically<Tab>^Wv	<C-W>v
866an <silent> 70.332 &Window.Split\ File\ E&xplorer	:call MenuExplOpen()<CR>
867if !exists("*MenuExplOpen")
868  fun MenuExplOpen()
869    if @% == ""
870      20vsp .
871    else
872      exe "20vsp " . s:FnameEscape(expand("%:p:h"))
873    endif
874  endfun
875endif
876an 70.335 &Window.-SEP1-				<Nop>
877an 70.340 &Window.&Close<Tab>^Wc			:confirm close<CR>
878an 70.345 &Window.Close\ &Other(s)<Tab>^Wo		:confirm only<CR>
879an 70.350 &Window.-SEP2-				<Nop>
880an 70.355 &Window.Move\ &To.&Top<Tab>^WK		<C-W>K
881an 70.355 &Window.Move\ &To.&Bottom<Tab>^WJ		<C-W>J
882an 70.355 &Window.Move\ &To.&Left\ Side<Tab>^WH		<C-W>H
883an 70.355 &Window.Move\ &To.&Right\ Side<Tab>^WL	<C-W>L
884an 70.360 &Window.Rotate\ &Up<Tab>^WR			<C-W>R
885an 70.362 &Window.Rotate\ &Down<Tab>^Wr			<C-W>r
886an 70.365 &Window.-SEP3-				<Nop>
887an 70.370 &Window.&Equal\ Size<Tab>^W=			<C-W>=
888an 70.380 &Window.&Max\ Height<Tab>^W_			<C-W>_
889an 70.390 &Window.M&in\ Height<Tab>^W1_			<C-W>1_
890an 70.400 &Window.Max\ &Width<Tab>^W\|			<C-W>\|
891an 70.410 &Window.Min\ Widt&h<Tab>^W1\|			<C-W>1\|
892
893" The popup menu
894an 1.10 PopUp.&Undo			u
895an 1.15 PopUp.-SEP1-			<Nop>
896vnoremenu 1.20 PopUp.Cu&t		"+x
897vnoremenu 1.30 PopUp.&Copy		"+y
898cnoremenu 1.30 PopUp.&Copy		<C-Y>
899nnoremenu 1.40 PopUp.&Paste		"+gP
900cnoremenu 1.40 PopUp.&Paste		<C-R>+
901exe 'vnoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['v']
902exe 'inoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['i']
903vnoremenu 1.50 PopUp.&Delete		x
904an 1.55 PopUp.-SEP2-			<Nop>
905vnoremenu 1.60 PopUp.Select\ Blockwise	<C-V>
906
907nnoremenu 1.70 PopUp.Select\ &Word	vaw
908onoremenu 1.70 PopUp.Select\ &Word	aw
909vnoremenu 1.70 PopUp.Select\ &Word	<C-C>vaw
910inoremenu 1.70 PopUp.Select\ &Word	<C-O>vaw
911cnoremenu 1.70 PopUp.Select\ &Word	<C-C>vaw
912
913nnoremenu 1.73 PopUp.Select\ &Sentence	vas
914onoremenu 1.73 PopUp.Select\ &Sentence	as
915vnoremenu 1.73 PopUp.Select\ &Sentence	<C-C>vas
916inoremenu 1.73 PopUp.Select\ &Sentence	<C-O>vas
917cnoremenu 1.73 PopUp.Select\ &Sentence	<C-C>vas
918
919nnoremenu 1.77 PopUp.Select\ Pa&ragraph	vap
920onoremenu 1.77 PopUp.Select\ Pa&ragraph	ap
921vnoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-C>vap
922inoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-O>vap
923cnoremenu 1.77 PopUp.Select\ Pa&ragraph	<C-C>vap
924
925nnoremenu 1.80 PopUp.Select\ &Line	V
926onoremenu 1.80 PopUp.Select\ &Line	<C-C>V
927vnoremenu 1.80 PopUp.Select\ &Line	<C-C>V
928inoremenu 1.80 PopUp.Select\ &Line	<C-O>V
929cnoremenu 1.80 PopUp.Select\ &Line	<C-C>V
930
931nnoremenu 1.90 PopUp.Select\ &Block	<C-V>
932onoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
933vnoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
934inoremenu 1.90 PopUp.Select\ &Block	<C-O><C-V>
935cnoremenu 1.90 PopUp.Select\ &Block	<C-C><C-V>
936
937noremenu  <script> <silent> 1.100 PopUp.Select\ &All	:<C-U>call <SID>SelectAll()<CR>
938inoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-O>:call <SID>SelectAll()<CR>
939cnoremenu <script> <silent> 1.100 PopUp.Select\ &All	<C-U>call <SID>SelectAll()<CR>
940
941if has("spell")
942  " Spell suggestions in the popup menu.  Note that this will slow down the
943  " appearance of the menu!
944  func! <SID>SpellPopup()
945    if exists("s:changeitem") && s:changeitem != ''
946      call <SID>SpellDel()
947    endif
948
949    " Return quickly if spell checking is not enabled.
950    if !&spell || &spelllang == ''
951      return
952    endif
953
954    let curcol = col('.')
955    let [w, a] = spellbadword()
956    if col('.') > curcol		" don't use word after the cursor
957      let w = ''
958    endif
959    if w != ''
960      if a == 'caps'
961	let s:suglist = [substitute(w, '.*', '\u&', '')]
962      else
963	let s:suglist = spellsuggest(w, 10)
964      endif
965      if len(s:suglist) > 0
966	if !exists("g:menutrans_spell_change_ARG_to")
967	  let g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
968	endif
969	let s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
970	let s:fromword = w
971	let pri = 1
972	" set 'cpo' to include the <CR>
973	let cpo_save = &cpo
974	set cpo&vim
975	for sug in s:suglist
976	  exe 'anoremenu 1.5.' . pri . ' PopUp.' . s:changeitem . '.' . escape(sug, ' .')
977		\ . ' :call <SID>SpellReplace(' . pri . ')<CR>'
978	  let pri += 1
979	endfor
980
981	if !exists("g:menutrans_spell_add_ARG_to_word_list")
982	  let g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
983	endif
984	let s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
985	exe 'anoremenu 1.6 PopUp.' . s:additem . ' :spellgood ' . w . '<CR>'
986
987	if !exists("g:menutrans_spell_ignore_ARG")
988	  let g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
989	endif
990	let s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
991	exe 'anoremenu 1.7 PopUp.' . s:ignoreitem . ' :spellgood! ' . w . '<CR>'
992
993	anoremenu 1.8 PopUp.-SpellSep- :
994	let &cpo = cpo_save
995      endif
996    endif
997    call cursor(0, curcol)	" put the cursor back where it was
998  endfunc
999
1000  func! <SID>SpellReplace(n)
1001    let l = getline('.')
1002    " Move the cursor to the start of the word.
1003    call spellbadword()
1004    call setline('.', strpart(l, 0, col('.') - 1) . s:suglist[a:n - 1]
1005	  \ . strpart(l, col('.') + len(s:fromword) - 1))
1006  endfunc
1007
1008  func! <SID>SpellDel()
1009    exe "aunmenu PopUp." . s:changeitem
1010    exe "aunmenu PopUp." . s:additem
1011    exe "aunmenu PopUp." . s:ignoreitem
1012    aunmenu PopUp.-SpellSep-
1013    let s:changeitem = ''
1014  endfun
1015
1016  augroup SpellPopupMenu
1017    au! MenuPopup * call <SID>SpellPopup()
1018  augroup END
1019endif
1020
1021" The GUI toolbar (for MS-Windows and GTK)
1022if has("toolbar")
1023  an 1.10 ToolBar.Open			:browse confirm e<CR>
1024  an <silent> 1.20 ToolBar.Save		:if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
1025  an 1.30 ToolBar.SaveAll		:browse confirm wa<CR>
1026
1027  if has("printer")
1028    an 1.40   ToolBar.Print		:hardcopy<CR>
1029    vunmenu   ToolBar.Print
1030    vnoremenu ToolBar.Print		:hardcopy<CR>
1031  elseif has("unix")
1032    an 1.40   ToolBar.Print		:w !lpr<CR>
1033    vunmenu   ToolBar.Print
1034    vnoremenu ToolBar.Print		:w !lpr<CR>
1035  endif
1036
1037  an 1.45 ToolBar.-sep1-		<Nop>
1038  an 1.50 ToolBar.Undo			u
1039  an 1.60 ToolBar.Redo			<C-R>
1040
1041  an 1.65 ToolBar.-sep2-		<Nop>
1042  vnoremenu 1.70 ToolBar.Cut		"+x
1043  vnoremenu 1.80 ToolBar.Copy		"+y
1044  cnoremenu 1.80 ToolBar.Copy		<C-Y>
1045  nnoremenu 1.90 ToolBar.Paste		"+gP
1046  cnoremenu	 ToolBar.Paste		<C-R>+
1047  exe 'vnoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['v']
1048  exe 'inoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['i']
1049
1050  if !has("gui_athena")
1051    an 1.95   ToolBar.-sep3-		<Nop>
1052    an 1.100  ToolBar.Replace		:promptrepl<CR>
1053    vunmenu   ToolBar.Replace
1054    vnoremenu ToolBar.Replace		y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
1055    an 1.110  ToolBar.FindNext		n
1056    an 1.120  ToolBar.FindPrev		N
1057  endif
1058
1059  an 1.215 ToolBar.-sep5-		<Nop>
1060  an <silent> 1.220 ToolBar.LoadSesn	:call <SID>LoadVimSesn()<CR>
1061  an <silent> 1.230 ToolBar.SaveSesn	:call <SID>SaveVimSesn()<CR>
1062  an 1.240 ToolBar.RunScript		:browse so<CR>
1063
1064  an 1.245 ToolBar.-sep6-		<Nop>
1065  an 1.250 ToolBar.Make			:make<CR>
1066  an 1.270 ToolBar.RunCtags		:exe "!" . g:ctags_command<CR>
1067  an 1.280 ToolBar.TagJump		g<C-]>
1068
1069  an 1.295 ToolBar.-sep7-		<Nop>
1070  an 1.300 ToolBar.Help			:help<CR>
1071  an <silent> 1.310 ToolBar.FindHelp	:call <SID>Helpfind()<CR>
1072
1073" Only set the tooltips here if not done in a language menu file
1074if exists("*Do_toolbar_tmenu")
1075  call Do_toolbar_tmenu()
1076else
1077  let did_toolbar_tmenu = 1
1078  tmenu ToolBar.Open		Open file
1079  tmenu ToolBar.Save		Save current file
1080  tmenu ToolBar.SaveAll		Save all files
1081  tmenu ToolBar.Print		Print
1082  tmenu ToolBar.Undo		Undo
1083  tmenu ToolBar.Redo		Redo
1084  tmenu ToolBar.Cut		Cut to clipboard
1085  tmenu ToolBar.Copy		Copy to clipboard
1086  tmenu ToolBar.Paste		Paste from Clipboard
1087  if !has("gui_athena")
1088    tmenu ToolBar.Replace	Find / Replace...
1089    tmenu ToolBar.FindNext	Find Next
1090    tmenu ToolBar.FindPrev	Find Previous
1091  endif
1092  tmenu ToolBar.LoadSesn	Choose a session to load
1093  tmenu ToolBar.SaveSesn	Save current session
1094  tmenu ToolBar.RunScript	Choose a Vim Script to run
1095  tmenu ToolBar.Make		Make current project (:make)
1096  tmenu ToolBar.RunCtags	Build tags in current directory tree (!ctags -R .)
1097  tmenu ToolBar.TagJump		Jump to tag under cursor
1098  tmenu ToolBar.Help		Vim Help
1099  tmenu ToolBar.FindHelp	Search Vim Help
1100endif
1101
1102" Select a session to load; default to current session name if present
1103fun! s:LoadVimSesn()
1104  if strlen(v:this_session) > 0
1105    let name = s:FnameEscape(v:this_session)
1106  else
1107    let name = "Session.vim"
1108  endif
1109  execute "browse so " . name
1110endfun
1111
1112" Select a session to save; default to current session name if present
1113fun! s:SaveVimSesn()
1114  if strlen(v:this_session) == 0
1115    let v:this_session = "Session.vim"
1116  endif
1117  execute "browse mksession! " . s:FnameEscape(v:this_session)
1118endfun
1119
1120endif
1121
1122endif " !exists("did_install_default_menus")
1123
1124" Define these items always, so that syntax can be switched on when it wasn't.
1125" But skip them when the Syntax menu was disabled by the user.
1126if !exists("did_install_syntax_menu")
1127  an 50.212 &Syntax.&Manual		:syn manual<CR>
1128  an 50.214 &Syntax.A&utomatic		:syn on<CR>
1129  an <silent> 50.216 &Syntax.On/Off\ for\ &This\ File :call <SID>SynOnOff()<CR>
1130  if !exists("*s:SynOnOff")
1131    fun s:SynOnOff()
1132      if has("syntax_items")
1133	syn clear
1134      else
1135	if !exists("g:syntax_on")
1136	  syn manual
1137	endif
1138	set syn=ON
1139      endif
1140    endfun
1141  endif
1142endif
1143
1144
1145" Install the Syntax menu only when filetype.vim has been loaded or when
1146" manual syntax highlighting is enabled.
1147" Avoid installing the Syntax menu twice.
1148if (exists("did_load_filetypes") || exists("syntax_on"))
1149	\ && !exists("did_install_syntax_menu")
1150  let did_install_syntax_menu = 1
1151
1152" Skip setting up the individual syntax selection menus unless
1153" do_syntax_sel_menu is defined (it takes quite a bit of time).
1154if exists("do_syntax_sel_menu")
1155  runtime! synmenu.vim
1156else
1157  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>
1158  an 50.195 &Syntax.-SEP1-		<Nop>
1159endif
1160
1161an 50.210 &Syntax.&Off			:syn off<CR>
1162an 50.700 &Syntax.-SEP3-		<Nop>
1163an 50.710 &Syntax.Co&lor\ Test		:sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
1164an 50.720 &Syntax.&Highlight\ Test	:runtime syntax/hitest.vim<CR>
1165an 50.730 &Syntax.&Convert\ to\ HTML	:runtime syntax/2html.vim<CR>
1166
1167endif " !exists("did_install_syntax_menu")
1168
1169" Restore the previous value of 'cpoptions'.
1170let &cpo = s:cpo_save
1171unlet s:cpo_save
1172
1173" vim: set sw=2 :
1174