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