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