blob: a6ecf3ce52ecb38345d26dbdfcbd33076a83afd0 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" 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 <Bram@vim.org>
Bram Moolenaar7c63fbc2018-05-17 13:15:23 +02005" Last Change: 2018 May 17
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
7" Note that ":an" (short for ":anoremenu") is often used to make a menu work
8" in all modes and avoid side effects from mappings defined by the user.
9
10" Make sure the '<' and 'C' flags are not included in 'cpoptions', otherwise
11" <CR> would not be recognized. See ":help 'cpoptions'".
12let s:cpo_save = &cpo
13set cpo&vim
14
15" Avoid installing the menus twice
16if !exists("did_install_default_menus")
17let did_install_default_menus = 1
18
19
20if exists("v:lang") || &langmenu != ""
21 " Try to find a menu translation file for the current language.
22 if &langmenu != ""
23 if &langmenu =~ "none"
24 let s:lang = ""
25 else
26 let s:lang = &langmenu
27 endif
28 else
29 let s:lang = v:lang
30 endif
31 " A language name must be at least two characters, don't accept "C"
32 if strlen(s:lang) > 1
33 " When the language does not include the charset add 'encoding'
34 if s:lang =~ '^\a\a$\|^\a\a_\a\a$'
35 let s:lang = s:lang . '.' . &enc
36 endif
37
38 " We always use a lowercase name.
39 " Change "iso-8859" to "iso_8859" and "iso8859" to "iso_8859", some
40 " systems appear to use this.
41 " Change spaces to underscores.
42 let s:lang = substitute(tolower(s:lang), '\.iso-', ".iso_", "")
43 let s:lang = substitute(s:lang, '\.iso8859', ".iso_8859", "")
44 let s:lang = substitute(s:lang, " ", "_", "g")
45 " Remove "@euro", otherwise "LC_ALL=de_DE@euro gvim" will show English menus
46 let s:lang = substitute(s:lang, "@euro", "", "")
47 " Change "iso_8859-1" and "iso_8859-15" to "latin1", we always use the
48 " same menu file for them.
49 let s:lang = substitute(s:lang, 'iso_8859-15\=$', "latin1", "")
50 menutrans clear
51 exe "runtime! lang/menu_" . s:lang . ".vim"
52
53 if !exists("did_menu_trans")
54 " There is no exact match, try matching with a wildcard added
55 " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE).
56 let s:lang = substitute(s:lang, '\.[^.]*', "", "")
Bram Moolenaar05159a02005-02-26 23:04:13 +000057 exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim"
Bram Moolenaar071d4272004-06-13 20:20:40 +000058
Bram Moolenaar68f1b1b2018-07-23 05:10:14 +020059 if !exists("did_menu_trans") && s:lang =~ '_'
60 " If the language includes a region try matching without that region.
61 " (e.g. find menu_de.vim if s:lang == de_DE).
62 let langonly = substitute(s:lang, '_.*', "", "")
63 exe "runtime! lang/menu_" . langonly . "[^a-z]*vim"
64 endif
65
Bram Moolenaare2cc9702005-03-15 22:43:58 +000066 if !exists("did_menu_trans") && strlen($LANG) > 1 && s:lang !~ '^en_us'
Bram Moolenaar071d4272004-06-13 20:20:40 +000067 " On windows locale names are complicated, try using $LANG, it might
Bram Moolenaare2cc9702005-03-15 22:43:58 +000068 " have been set by set_init_1(). But don't do this for "en" or "en_us".
Bram Moolenaar2ce06f62005-01-31 19:19:04 +000069 " But don't match "slovak" when $LANG is "sl".
70 exe "runtime! lang/menu_" . tolower($LANG) . "[^a-z]*vim"
Bram Moolenaar071d4272004-06-13 20:20:40 +000071 endif
72 endif
73 endif
74endif
75
76
77" Help menu
78an 9999.10 &Help.&Overview<Tab><F1> :help<CR>
79an 9999.20 &Help.&User\ Manual :help usr_toc<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +010080an 9999.30 &Help.&How-To\ Links :help how-to<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +000081an <silent> 9999.40 &Help.&Find\.\.\. :call <SID>Helpfind()<CR>
82an 9999.45 &Help.-sep1- <Nop>
83an 9999.50 &Help.&Credits :help credits<CR>
84an 9999.60 &Help.Co&pying :help copying<CR>
85an 9999.70 &Help.&Sponsor/Register :help sponsor<CR>
86an 9999.70 &Help.O&rphans :help kcc<CR>
87an 9999.75 &Help.-sep2- <Nop>
88an 9999.80 &Help.&Version :version<CR>
89an 9999.90 &Help.&About :intro<CR>
90
91fun! s:Helpfind()
92 if !exists("g:menutrans_help_dialog")
93 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')"
94 endif
95 let h = inputdialog(g:menutrans_help_dialog)
96 if h != ""
97 let v:errmsg = ""
98 silent! exe "help " . h
99 if v:errmsg != ""
100 echo v:errmsg
101 endif
102 endif
103endfun
104
105" File menu
106an 10.310 &File.&Open\.\.\.<Tab>:e :browse confirm e<CR>
107an 10.320 &File.Sp&lit-Open\.\.\.<Tab>:sp :browse sp<CR>
Bram Moolenaar5c8837f2006-02-25 21:52:33 +0000108an 10.320 &File.Open\ Tab\.\.\.<Tab>:tabnew :browse tabnew<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109an 10.325 &File.&New<Tab>:enew :confirm enew<CR>
110an <silent> 10.330 &File.&Close<Tab>:close
Bram Moolenaarcab49df2011-03-22 17:40:10 +0100111 \ :if winheight(2) < 0 && tabpagewinnr(2) == 0 <Bar>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112 \ confirm enew <Bar>
113 \ else <Bar>
114 \ confirm close <Bar>
115 \ endif<CR>
116an 10.335 &File.-SEP1- <Nop>
117an <silent> 10.340 &File.&Save<Tab>:w :if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
118an 10.350 &File.Save\ &As\.\.\.<Tab>:sav :browse confirm saveas<CR>
119
120if has("diff")
121 an 10.400 &File.-SEP2- <Nop>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100122 an 10.410 &File.Split\ &Diff\ With\.\.\. :browse vert diffsplit<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123 an 10.420 &File.Split\ Patched\ &By\.\.\. :browse vert diffpatch<CR>
124endif
125
126if has("printer")
127 an 10.500 &File.-SEP3- <Nop>
128 an 10.510 &File.&Print :hardcopy<CR>
129 vunmenu &File.&Print
130 vnoremenu &File.&Print :hardcopy<CR>
131elseif has("unix")
132 an 10.500 &File.-SEP3- <Nop>
133 an 10.510 &File.&Print :w !lpr<CR>
134 vunmenu &File.&Print
135 vnoremenu &File.&Print :w !lpr<CR>
136endif
137an 10.600 &File.-SEP4- <Nop>
138an 10.610 &File.Sa&ve-Exit<Tab>:wqa :confirm wqa<CR>
139an 10.620 &File.E&xit<Tab>:qa :confirm qa<CR>
140
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141func! <SID>SelectAll()
Bram Moolenaara3e6bc92013-01-30 14:18:00 +0100142 exe "norm! gg" . (&slm == "" ? "VG" : "gH\<C-O>G")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143endfunc
144
Bram Moolenaaraba88572008-06-25 20:13:35 +0000145func! s:FnameEscape(fname)
146 if exists('*fnameescape')
147 return fnameescape(a:fname)
Bram Moolenaar5c736222010-01-06 20:54:52 +0100148 endif
Bram Moolenaaraba88572008-06-25 20:13:35 +0000149 return escape(a:fname, " \t\n*?[{`$\\%#'\"|!<")
150endfunc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151
152" Edit menu
153an 20.310 &Edit.&Undo<Tab>u u
154an 20.320 &Edit.&Redo<Tab>^R <C-R>
155an 20.330 &Edit.Rep&eat<Tab>\. .
156
157an 20.335 &Edit.-SEP1- <Nop>
158vnoremenu 20.340 &Edit.Cu&t<Tab>"+x "+x
159vnoremenu 20.350 &Edit.&Copy<Tab>"+y "+y
160cnoremenu 20.350 &Edit.&Copy<Tab>"+y <C-Y>
161nnoremenu 20.360 &Edit.&Paste<Tab>"+gP "+gP
162cnoremenu &Edit.&Paste<Tab>"+gP <C-R>+
Bram Moolenaar4c5d8152018-10-19 22:36:53 +0200163if exists(':tlmenu')
164 tlnoremenu &Edit.&Paste<Tab>"+gP <C-W>"+
165endif
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000166exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP ' . paste#paste_cmd['v']
167exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP ' . paste#paste_cmd['i']
Bram Moolenaar071d4272004-06-13 20:20:40 +0000168nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p [p
169inoremenu &Edit.Put\ &Before<Tab>[p <C-O>[p
170nnoremenu 20.380 &Edit.Put\ &After<Tab>]p ]p
171inoremenu &Edit.Put\ &After<Tab>]p <C-O>]p
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100172if has("win32")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000173 vnoremenu 20.390 &Edit.&Delete<Tab>x x
174endif
175noremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG :<C-U>call <SID>SelectAll()<CR>
176inoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG <C-O>:call <SID>SelectAll()<CR>
177cnoremenu <script> <silent> 20.400 &Edit.&Select\ All<Tab>ggVG <C-U>call <SID>SelectAll()<CR>
178
179an 20.405 &Edit.-SEP2- <Nop>
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100180if has("win32") || has("gui_gtk") || has("gui_kde") || has("gui_motif")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000181 an 20.410 &Edit.&Find\.\.\. :promptfind<CR>
182 vunmenu &Edit.&Find\.\.\.
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000183 vnoremenu <silent> &Edit.&Find\.\.\. y:promptfind <C-R>=<SID>FixFText()<CR><CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184 an 20.420 &Edit.Find\ and\ Rep&lace\.\.\. :promptrepl<CR>
185 vunmenu &Edit.Find\ and\ Rep&lace\.\.\.
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000186 vnoremenu <silent> &Edit.Find\ and\ Rep&lace\.\.\. y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187else
188 an 20.410 &Edit.&Find<Tab>/ /
189 an 20.420 &Edit.Find\ and\ Rep&lace<Tab>:%s :%s/
190 vunmenu &Edit.Find\ and\ Rep&lace<Tab>:%s
191 vnoremenu &Edit.Find\ and\ Rep&lace<Tab>:s :s/
192endif
193
194an 20.425 &Edit.-SEP3- <Nop>
195an 20.430 &Edit.Settings\ &Window :options<CR>
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000196an 20.435 &Edit.Startup\ &Settings :call <SID>EditVimrc()<CR>
197
198fun! s:EditVimrc()
199 if $MYVIMRC != ''
Bram Moolenaare30de2d2008-07-01 19:56:57 +0000200 let fname = $MYVIMRC
Bram Moolenaar42ebd062016-07-17 13:35:14 +0200201 elseif has("win32")
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000202 if $HOME != ''
Bram Moolenaare30de2d2008-07-01 19:56:57 +0000203 let fname = $HOME . "/_vimrc"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000204 else
Bram Moolenaare30de2d2008-07-01 19:56:57 +0000205 let fname = $VIM . "/_vimrc"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000206 endif
207 elseif has("amiga")
208 let fname = "s:.vimrc"
209 else
Bram Moolenaare30de2d2008-07-01 19:56:57 +0000210 let fname = $HOME . "/.vimrc"
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000211 endif
Bram Moolenaaraba88572008-06-25 20:13:35 +0000212 let fname = s:FnameEscape(fname)
Bram Moolenaar910f66f2006-04-05 20:41:53 +0000213 if &mod
214 exe "split " . fname
215 else
216 exe "edit " . fname
217 endif
218endfun
Bram Moolenaar071d4272004-06-13 20:20:40 +0000219
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000220fun! s:FixFText()
221 " Fix text in nameless register to be used with :promptfind.
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000222 return substitute(@", "[\r\n]", '\\n', 'g')
Bram Moolenaar5b8d8fd2005-08-16 23:01:50 +0000223endfun
224
Bram Moolenaar071d4272004-06-13 20:20:40 +0000225" Edit/Global Settings
226an 20.440.100 &Edit.&Global\ Settings.Toggle\ Pattern\ &Highlight<Tab>:set\ hls! :set hls! hls?<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100227an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Ignoring\ Case<Tab>:set\ ic! :set ic! ic?<CR>
228an 20.440.110 &Edit.&Global\ Settings.Toggle\ &Showing\ Matched\ Pairs<Tab>:set\ sm! :set sm! sm?<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000229
Bram Moolenaar214641f2017-03-05 17:04:09 +0100230an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 1\ :set so=1<CR>
231an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 2\ :set so=2<CR>
232an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 3\ :set so=3<CR>
233an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 4\ :set so=4<CR>
234an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 5\ :set so=5<CR>
235an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 7\ :set so=7<CR>
236an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 10\ :set so=10<CR>
237an 20.440.120 &Edit.&Global\ Settings.&Context\ Lines.\ 100\ :set so=100<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238
239an 20.440.130.40 &Edit.&Global\ Settings.&Virtual\ Edit.Never :set ve=<CR>
240an 20.440.130.50 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ Selection :set ve=block<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100241an 20.440.130.60 &Edit.&Global\ Settings.&Virtual\ Edit.Insert\ Mode :set ve=insert<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242an 20.440.130.70 &Edit.&Global\ Settings.&Virtual\ Edit.Block\ and\ Insert :set ve=block,insert<CR>
243an 20.440.130.80 &Edit.&Global\ Settings.&Virtual\ Edit.Always :set ve=all<CR>
244an 20.440.140 &Edit.&Global\ Settings.Toggle\ Insert\ &Mode<Tab>:set\ im! :set im!<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100245an 20.440.145 &Edit.&Global\ Settings.Toggle\ Vi\ C&ompatibility<Tab>:set\ cp! :set cp!<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246an <silent> 20.440.150 &Edit.&Global\ Settings.Search\ &Path\.\.\. :call <SID>SearchP()<CR>
247an <silent> 20.440.160 &Edit.&Global\ Settings.Ta&g\ Files\.\.\. :call <SID>TagFiles()<CR>
248"
249" GUI options
250an 20.440.300 &Edit.&Global\ Settings.-SEP1- <Nop>
251an <silent> 20.440.310 &Edit.&Global\ Settings.Toggle\ &Toolbar :call <SID>ToggleGuiOption("T")<CR>
252an <silent> 20.440.320 &Edit.&Global\ Settings.Toggle\ &Bottom\ Scrollbar :call <SID>ToggleGuiOption("b")<CR>
253an <silent> 20.440.330 &Edit.&Global\ Settings.Toggle\ &Left\ Scrollbar :call <SID>ToggleGuiOption("l")<CR>
254an <silent> 20.440.340 &Edit.&Global\ Settings.Toggle\ &Right\ Scrollbar :call <SID>ToggleGuiOption("r")<CR>
255
256fun! s:SearchP()
257 if !exists("g:menutrans_path_dialog")
258 let g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
259 endif
260 let n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
261 if n != ""
262 let &path = substitute(n, ' ', '\\ ', 'g')
263 endif
264endfun
265
266fun! s:TagFiles()
267 if !exists("g:menutrans_tags_dialog")
268 let g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
269 endif
270 let n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
271 if n != ""
272 let &tags = substitute(n, ' ', '\\ ', 'g')
273 endif
274endfun
275
276fun! s:ToggleGuiOption(option)
277 " If a:option is already set in guioptions, then we want to remove it
278 if match(&guioptions, "\\C" . a:option) > -1
279 exec "set go-=" . a:option
280 else
281 exec "set go+=" . a:option
282 endif
283endfun
284
285" Edit/File Settings
286
287" Boolean options
288an 20.440.100 &Edit.F&ile\ Settings.Toggle\ Line\ &Numbering<Tab>:set\ nu! :set nu! nu?<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100289an 20.440.105 &Edit.F&ile\ Settings.Toggle\ Relati&ve\ Line\ Numbering<Tab>:set\ rnu! :set rnu! rnu?<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290an 20.440.110 &Edit.F&ile\ Settings.Toggle\ &List\ Mode<Tab>:set\ list! :set list! list?<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100291an 20.440.120 &Edit.F&ile\ Settings.Toggle\ Line\ &Wrapping<Tab>:set\ wrap! :set wrap! wrap?<CR>
292an 20.440.130 &Edit.F&ile\ Settings.Toggle\ W&rapping\ at\ Word<Tab>:set\ lbr! :set lbr! lbr?<CR>
293an 20.440.160 &Edit.F&ile\ Settings.Toggle\ Tab\ &Expanding<Tab>:set\ et! :set et! et?<CR>
294an 20.440.170 &Edit.F&ile\ Settings.Toggle\ &Auto\ Indenting<Tab>:set\ ai! :set ai! ai?<CR>
295an 20.440.180 &Edit.F&ile\ Settings.Toggle\ &C-Style\ Indenting<Tab>:set\ cin! :set cin! cin?<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296
297" other options
298an 20.440.600 &Edit.F&ile\ Settings.-SEP2- <Nop>
299an 20.440.610.20 &Edit.F&ile\ Settings.&Shiftwidth.2 :set sw=2 sw?<CR>
300an 20.440.610.30 &Edit.F&ile\ Settings.&Shiftwidth.3 :set sw=3 sw?<CR>
301an 20.440.610.40 &Edit.F&ile\ Settings.&Shiftwidth.4 :set sw=4 sw?<CR>
302an 20.440.610.50 &Edit.F&ile\ Settings.&Shiftwidth.5 :set sw=5 sw?<CR>
303an 20.440.610.60 &Edit.F&ile\ Settings.&Shiftwidth.6 :set sw=6 sw?<CR>
304an 20.440.610.80 &Edit.F&ile\ Settings.&Shiftwidth.8 :set sw=8 sw?<CR>
305
306an 20.440.620.20 &Edit.F&ile\ Settings.Soft\ &Tabstop.2 :set sts=2 sts?<CR>
307an 20.440.620.30 &Edit.F&ile\ Settings.Soft\ &Tabstop.3 :set sts=3 sts?<CR>
308an 20.440.620.40 &Edit.F&ile\ Settings.Soft\ &Tabstop.4 :set sts=4 sts?<CR>
309an 20.440.620.50 &Edit.F&ile\ Settings.Soft\ &Tabstop.5 :set sts=5 sts?<CR>
310an 20.440.620.60 &Edit.F&ile\ Settings.Soft\ &Tabstop.6 :set sts=6 sts?<CR>
311an 20.440.620.80 &Edit.F&ile\ Settings.Soft\ &Tabstop.8 :set sts=8 sts?<CR>
312
313an <silent> 20.440.630 &Edit.F&ile\ Settings.Te&xt\ Width\.\.\. :call <SID>TextWidth()<CR>
314an <silent> 20.440.640 &Edit.F&ile\ Settings.&File\ Format\.\.\. :call <SID>FileFormat()<CR>
315fun! s:TextWidth()
316 if !exists("g:menutrans_textwidth_dialog")
317 let g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
318 endif
319 let n = inputdialog(g:menutrans_textwidth_dialog, &tw)
320 if n != ""
Bram Moolenaarad3b3662013-05-17 18:14:19 +0200321 " Remove leading zeros to avoid it being used as an octal number.
322 " But keep a zero by itself.
323 let tw = substitute(n, "^0*", "", "")
Bram Moolenaar214641f2017-03-05 17:04:09 +0100324 let &tw = tw == '' ? 0 : tw
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325 endif
326endfun
327
328fun! s:FileFormat()
329 if !exists("g:menutrans_fileformat_dialog")
330 let g:menutrans_fileformat_dialog = "Select format for writing the file"
331 endif
332 if !exists("g:menutrans_fileformat_choices")
333 let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
334 endif
335 if &ff == "dos"
336 let def = 2
337 elseif &ff == "mac"
338 let def = 3
339 else
340 let def = 1
341 endif
342 let n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def, "Question")
343 if n == 1
344 set ff=unix
345 elseif n == 2
346 set ff=dos
347 elseif n == 3
348 set ff=mac
349 endif
350endfun
351
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100352let s:did_setup_color_schemes = 0
Bram Moolenaarc5604bc2010-07-17 15:20:30 +0200353
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354" Setup the Edit.Color Scheme submenu
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100355func! s:SetupColorSchemes() abort
356 if s:did_setup_color_schemes
357 return
358 endif
359 let s:did_setup_color_schemes = 1
Bram Moolenaarc5604bc2010-07-17 15:20:30 +0200360
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100361 let n = globpath(&runtimepath, "colors/*.vim", 1, 1)
Bram Moolenaarfc65cab2018-08-28 22:58:02 +0200362 let n += globpath(&runtimepath, "pack/*/start/*/colors/*.vim", 1, 1)
363 let n += globpath(&runtimepath, "pack/*/opt/*/colors/*.vim", 1, 1)
Bram Moolenaarc5604bc2010-07-17 15:20:30 +0200364
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100365 " Ignore case for VMS and windows, sort on name
366 let names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
Bram Moolenaarc5604bc2010-07-17 15:20:30 +0200367
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100368 " define all the submenu entries
369 let idx = 100
370 for name in names
371 exe "an 20.450." . idx . ' &Edit.C&olor\ Scheme.' . name . " :colors " . name . "<CR>"
372 let idx = idx + 10
373 endfor
374 silent! aunmenu &Edit.Show\ C&olor\ Schemes\ in\ Menu
375endfun
376if exists("do_no_lazyload_menus")
377 call s:SetupColorSchemes()
378else
379 an <silent> 20.450 &Edit.Show\ C&olor\ Schemes\ in\ Menu :call <SID>SetupColorSchemes()<CR>
380endif
Bram Moolenaarc5604bc2010-07-17 15:20:30 +0200381
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382
383" Setup the Edit.Keymap submenu
384if has("keymap")
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100385 let s:did_setup_keymaps = 0
386
387 func! s:SetupKeymaps() abort
388 if s:did_setup_keymaps
389 return
390 endif
391 let s:did_setup_keymaps = 1
392
393 let n = globpath(&runtimepath, "keymap/*.vim", 1, 1)
394 if !empty(n)
395 let idx = 100
396 an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
397 for name in n
398 " Ignore case for VMS and windows
399 let name = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
400 exe "an 20.460." . idx . ' &Edit.&Keymap.' . name . " :set keymap=" . name . "<CR>"
401 let idx = idx + 10
402 endfor
403 endif
404 silent! aunmenu &Edit.Show\ &Keymaps\ in\ Menu
405 endfun
406 if exists("do_no_lazyload_menus")
407 call s:SetupKeymaps()
408 else
409 an <silent> 20.460 &Edit.Show\ &Keymaps\ in\ Menu :call <SID>SetupKeymaps()<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000411endif
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100412if has("win32") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413 an 20.470 &Edit.Select\ Fo&nt\.\.\. :set guifont=*<CR>
414endif
415
416" Programming menu
417if !exists("g:ctags_command")
418 if has("vms")
Bram Moolenaard675e2c2007-01-09 14:09:25 +0000419 let g:ctags_command = "mc vim:ctags *.*"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420 else
421 let g:ctags_command = "ctags -R ."
422 endif
423endif
424
Bram Moolenaar214641f2017-03-05 17:04:09 +0100425an 40.300 &Tools.&Jump\ to\ This\ Tag<Tab>g^] g<C-]>
426vunmenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]
427vnoremenu &Tools.&Jump\ to\ This\ Tag<Tab>g^] g<C-]>
428an 40.310 &Tools.Jump\ &Back<Tab>^T <C-T>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000429an 40.320 &Tools.Build\ &Tags\ File :exe "!" . g:ctags_command<CR>
430
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000431if has("folding") || has("spell")
432 an 40.330 &Tools.-SEP1- <Nop>
433endif
434
Bram Moolenaarf3681cc2005-06-08 22:03:13 +0000435" Tools.Spelling Menu
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000436if has("spell")
437 an 40.335.110 &Tools.&Spelling.&Spell\ Check\ On :set spell<CR>
438 an 40.335.120 &Tools.&Spelling.Spell\ Check\ &Off :set nospell<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100439 an 40.335.130 &Tools.&Spelling.To\ &Next\ Error<Tab>]s ]s
440 an 40.335.130 &Tools.&Spelling.To\ &Previous\ Error<Tab>[s [s
Bram Moolenaar362e1a32006-03-06 23:29:24 +0000441 an 40.335.140 &Tools.&Spelling.Suggest\ &Corrections<Tab>z= z=
Bram Moolenaar214641f2017-03-05 17:04:09 +0100442 an 40.335.150 &Tools.&Spelling.&Repeat\ Correction<Tab>:spellrepall :spellrepall<CR>
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000443 an 40.335.200 &Tools.&Spelling.-SEP1- <Nop>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100444 an 40.335.210 &Tools.&Spelling.Set\ Language\ to\ "en" :set spl=en spell<CR>
445 an 40.335.220 &Tools.&Spelling.Set\ Language\ to\ "en_au" :set spl=en_au spell<CR>
446 an 40.335.230 &Tools.&Spelling.Set\ Language\ to\ "en_ca" :set spl=en_ca spell<CR>
447 an 40.335.240 &Tools.&Spelling.Set\ Language\ to\ "en_gb" :set spl=en_gb spell<CR>
448 an 40.335.250 &Tools.&Spelling.Set\ Language\ to\ "en_nz" :set spl=en_nz spell<CR>
449 an 40.335.260 &Tools.&Spelling.Set\ Language\ to\ "en_us" :set spl=en_us spell<CR>
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000450 an <silent> 40.335.270 &Tools.&Spelling.&Find\ More\ Languages :call <SID>SpellLang()<CR>
451
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000452 let s:undo_spellang = ['aun &Tools.&Spelling.&Find\ More\ Languages']
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000453 func! s:SpellLang()
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000454 for cmd in s:undo_spellang
455 exe "silent! " . cmd
456 endfor
457 let s:undo_spellang = []
458
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000459 if &enc == "iso-8859-15"
460 let enc = "latin1"
461 else
462 let enc = &enc
463 endif
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000464
Bram Moolenaarf3408e72012-10-21 01:21:59 +0200465 if !exists("g:menutrans_set_lang_to")
Bram Moolenaar214641f2017-03-05 17:04:09 +0100466 let g:menutrans_set_lang_to = 'Set Language to'
Bram Moolenaarf3408e72012-10-21 01:21:59 +0200467 endif
468
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000469 let found = 0
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100470 let s = globpath(&runtimepath, "spell/*." . enc . ".spl", 1, 1)
471 if !empty(s)
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000472 let n = 300
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100473 for f in s
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000474 let nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000475 if nm != "en" && nm !~ '/'
Bram Moolenaarf3408e72012-10-21 01:21:59 +0200476 let _nm = nm
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000477 let found += 1
Bram Moolenaarf3408e72012-10-21 01:21:59 +0200478 let menuname = '&Tools.&Spelling.' . escape(g:menutrans_set_lang_to, "\\. \t|") . '\ "' . nm . '"'
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000479 exe 'an 40.335.' . n . ' ' . menuname . ' :set spl=' . nm . ' spell<CR>'
480 let s:undo_spellang += ['aun ' . menuname]
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000481 endif
482 let n += 10
483 endfor
484 endif
485 if found == 0
486 echomsg "Could not find other spell files"
487 elseif found == 1
Bram Moolenaarf3408e72012-10-21 01:21:59 +0200488 echomsg "Found spell file " . _nm
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000489 else
490 echomsg "Found " . found . " more spell files"
491 endif
Bram Moolenaar5a8684e2005-07-30 22:43:24 +0000492 " Need to redo this when 'encoding' is changed.
493 augroup spellmenu
494 au! EncodingChanged * call <SID>SpellLang()
495 augroup END
Bram Moolenaar82cf9b62005-06-07 21:09:25 +0000496 endfun
497
498endif
499
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500" Tools.Fold Menu
501if has("folding")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000502 " open close folds
Bram Moolenaar214641f2017-03-05 17:04:09 +0100503 an 40.340.110 &Tools.&Folding.&Enable/Disable\ Folds<Tab>zi zi
Bram Moolenaar071d4272004-06-13 20:20:40 +0000504 an 40.340.120 &Tools.&Folding.&View\ Cursor\ Line<Tab>zv zv
Bram Moolenaar214641f2017-03-05 17:04:09 +0100505 an 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx zMzx
506 inoremenu 40.340.120 &Tools.&Folding.Vie&w\ Cursor\ Line\ Only<Tab>zMzx <C-O>zM<C-O>zx
507 an 40.340.130 &Tools.&Folding.C&lose\ More\ Folds<Tab>zm zm
508 an 40.340.140 &Tools.&Folding.&Close\ All\ Folds<Tab>zM zM
509 an 40.340.150 &Tools.&Folding.O&pen\ More\ Folds<Tab>zr zr
Bram Moolenaar3df01732017-02-17 22:47:16 +0100510 an 40.340.160 &Tools.&Folding.&Open\ All\ Folds<Tab>zR zR
Bram Moolenaar071d4272004-06-13 20:20:40 +0000511 " fold method
512 an 40.340.200 &Tools.&Folding.-SEP1- <Nop>
513 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.M&anual :set fdm=manual<CR>
514 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.I&ndent :set fdm=indent<CR>
515 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.E&xpression :set fdm=expr<CR>
516 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.S&yntax :set fdm=syntax<CR>
517 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.&Diff :set fdm=diff<CR>
518 an 40.340.210 &Tools.&Folding.Fold\ Met&hod.Ma&rker :set fdm=marker<CR>
519 " create and delete folds
520 vnoremenu 40.340.220 &Tools.&Folding.Create\ &Fold<Tab>zf zf
521 an 40.340.230 &Tools.&Folding.&Delete\ Fold<Tab>zd zd
522 an 40.340.240 &Tools.&Folding.Delete\ &All\ Folds<Tab>zD zD
523 " moving around in folds
524 an 40.340.300 &Tools.&Folding.-SEP2- <Nop>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100525 an 40.340.310.10 &Tools.&Folding.Fold\ Col&umn\ Width.\ &0\ :set fdc=0<CR>
526 an 40.340.310.20 &Tools.&Folding.Fold\ Col&umn\ Width.\ &2\ :set fdc=2<CR>
527 an 40.340.310.30 &Tools.&Folding.Fold\ Col&umn\ Width.\ &3\ :set fdc=3<CR>
528 an 40.340.310.40 &Tools.&Folding.Fold\ Col&umn\ Width.\ &4\ :set fdc=4<CR>
529 an 40.340.310.50 &Tools.&Folding.Fold\ Col&umn\ Width.\ &5\ :set fdc=5<CR>
530 an 40.340.310.60 &Tools.&Folding.Fold\ Col&umn\ Width.\ &6\ :set fdc=6<CR>
531 an 40.340.310.70 &Tools.&Folding.Fold\ Col&umn\ Width.\ &7\ :set fdc=7<CR>
532 an 40.340.310.80 &Tools.&Folding.Fold\ Col&umn\ Width.\ &8\ :set fdc=8<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +0000533endif " has folding
534
535if has("diff")
536 an 40.350.100 &Tools.&Diff.&Update :diffupdate<CR>
537 an 40.350.110 &Tools.&Diff.&Get\ Block :diffget<CR>
538 vunmenu &Tools.&Diff.&Get\ Block
539 vnoremenu &Tools.&Diff.&Get\ Block :diffget<CR>
540 an 40.350.120 &Tools.&Diff.&Put\ Block :diffput<CR>
541 vunmenu &Tools.&Diff.&Put\ Block
542 vnoremenu &Tools.&Diff.&Put\ Block :diffput<CR>
543endif
544
545an 40.358 &Tools.-SEP2- <Nop>
546an 40.360 &Tools.&Make<Tab>:make :make<CR>
547an 40.370 &Tools.&List\ Errors<Tab>:cl :cl<CR>
548an 40.380 &Tools.L&ist\ Messages<Tab>:cl! :cl!<CR>
549an 40.390 &Tools.&Next\ Error<Tab>:cn :cn<CR>
550an 40.400 &Tools.&Previous\ Error<Tab>:cp :cp<CR>
551an 40.410 &Tools.&Older\ List<Tab>:cold :colder<CR>
552an 40.420 &Tools.N&ewer\ List<Tab>:cnew :cnewer<CR>
553an 40.430.50 &Tools.Error\ &Window.&Update<Tab>:cwin :cwin<CR>
554an 40.430.60 &Tools.Error\ &Window.&Open<Tab>:copen :copen<CR>
555an 40.430.70 &Tools.Error\ &Window.&Close<Tab>:cclose :cclose<CR>
556
557an 40.520 &Tools.-SEP3- <Nop>
558an <silent> 40.530 &Tools.&Convert\ to\ HEX<Tab>:%!xxd
559 \ :call <SID>XxdConv()<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +0100560an <silent> 40.540 &Tools.Conve&rt\ Back<Tab>:%!xxd\ -r
Bram Moolenaar071d4272004-06-13 20:20:40 +0000561 \ :call <SID>XxdBack()<CR>
562
563" Use a function to do the conversion, so that it also works with 'insertmode'
564" set.
565func! s:XxdConv()
566 let mod = &mod
567 if has("vms")
568 %!mc vim:xxd
569 else
570 call s:XxdFind()
571 exe '%!"' . g:xxdprogram . '"'
572 endif
573 if getline(1) =~ "^0000000:" " only if it worked
574 set ft=xxd
575 endif
576 let &mod = mod
577endfun
578
579func! s:XxdBack()
580 let mod = &mod
581 if has("vms")
582 %!mc vim:xxd -r
583 else
584 call s:XxdFind()
585 exe '%!"' . g:xxdprogram . '" -r'
586 endif
587 set ft=
588 doautocmd filetypedetect BufReadPost
589 let &mod = mod
590endfun
591
592func! s:XxdFind()
593 if !exists("g:xxdprogram")
594 " On the PC xxd may not be in the path but in the install directory
Bram Moolenaar42ebd062016-07-17 13:35:14 +0200595 if has("win32") && !executable("xxd")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000596 let g:xxdprogram = $VIMRUNTIME . (&shellslash ? '/' : '\') . "xxd.exe"
597 else
598 let g:xxdprogram = "xxd"
599 endif
600 endif
601endfun
602
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100603let s:did_setup_compilers = 0
604
Bram Moolenaar071d4272004-06-13 20:20:40 +0000605" Setup the Tools.Compiler submenu
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100606func! s:SetupCompilers() abort
607 if s:did_setup_compilers
608 return
Bram Moolenaar071d4272004-06-13 20:20:40 +0000609 endif
Bram Moolenaar040c1fe2017-11-09 19:45:48 +0100610 let s:did_setup_compilers = 1
611
612 let n = globpath(&runtimepath, "compiler/*.vim", 1, 1)
613 let idx = 100
614 for name in n
615 " Ignore case for VMS and windows
616 let name = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
617 exe "an 30.440." . idx . ' &Tools.Se&t\ Compiler.' . name . " :compiler " . name . "<CR>"
618 let idx = idx + 10
619 endfor
620 silent! aunmenu &Tools.Show\ Compiler\ Se&ttings\ in\ Menu
621endfun
622if exists("do_no_lazyload_menus")
623 call s:SetupCompilers()
624else
625 an <silent> 30.440 &Tools.Show\ Compiler\ Se&ttings\ in\ Menu :call <SID>SetupCompilers()<CR>
626endif
627
628" Load ColorScheme, Compiler Setting and Keymap menus when idle.
629if !exists("do_no_lazyload_menus")
630 func! s:SetupLazyloadMenus()
631 call s:SetupColorSchemes()
632 call s:SetupCompilers()
633 if has("keymap")
634 call s:SetupKeymaps()
635 endif
636 endfunc
637 augroup SetupLazyloadMenus
638 au!
639 au CursorHold,CursorHoldI * call <SID>SetupLazyloadMenus() | au! SetupLazyloadMenus
640 augroup END
641endif
642
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643
644if !exists("no_buffers_menu")
645
646" Buffer list menu -- Setup functions & actions
647
648" wait with building the menu until after loading 'session' files. Makes
649" startup faster.
650let s:bmenu_wait = 1
651
652if !exists("bmenu_priority")
653 let bmenu_priority = 60
654endif
655
656func! s:BMAdd()
657 if s:bmenu_wait == 0
658 " when adding too many buffers, redraw in short format
659 if s:bmenu_count == &menuitems && s:bmenu_short == 0
660 call s:BMShow()
661 else
662 call <SID>BMFilename(expand("<afile>"), expand("<abuf>"))
663 let s:bmenu_count = s:bmenu_count + 1
664 endif
665 endif
666endfunc
667
668func! s:BMRemove()
669 if s:bmenu_wait == 0
670 let name = expand("<afile>")
671 if isdirectory(name)
672 return
673 endif
674 let munge = <SID>BMMunge(name, expand("<abuf>"))
675
676 if s:bmenu_short == 0
677 exe 'silent! aun &Buffers.' . munge
678 else
679 exe 'silent! aun &Buffers.' . <SID>BMHash2(munge) . munge
680 endif
681 let s:bmenu_count = s:bmenu_count - 1
682 endif
683endfunc
684
685" Create the buffer menu (delete an existing one first).
686func! s:BMShow(...)
687 let s:bmenu_wait = 1
688 let s:bmenu_short = 1
689 let s:bmenu_count = 0
690 "
691 " get new priority, if exists
692 if a:0 == 1
693 let g:bmenu_priority = a:1
694 endif
695
696 " remove old menu, if exists; keep one entry to avoid a torn off menu to
697 " disappear.
698 silent! unmenu &Buffers
699 exe 'noremenu ' . g:bmenu_priority . ".1 &Buffers.Dummy l"
700 silent! unmenu! &Buffers
701
702 " create new menu; set 'cpo' to include the <CR>
703 let cpo_save = &cpo
704 set cpo&vim
705 exe 'an <silent> ' . g:bmenu_priority . ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
706 exe 'an ' . g:bmenu_priority . ".4 &Buffers.&Delete :confirm bd<CR>"
707 exe 'an ' . g:bmenu_priority . ".6 &Buffers.&Alternate :confirm b #<CR>"
708 exe 'an ' . g:bmenu_priority . ".7 &Buffers.&Next :confirm bnext<CR>"
709 exe 'an ' . g:bmenu_priority . ".8 &Buffers.&Previous :confirm bprev<CR>"
710 exe 'an ' . g:bmenu_priority . ".9 &Buffers.-SEP- :"
711 let &cpo = cpo_save
712 unmenu &Buffers.Dummy
713
714 " figure out how many buffers there are
715 let buf = 1
716 while buf <= bufnr('$')
717 if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000718 let s:bmenu_count = s:bmenu_count + 1
719 endif
720 let buf = buf + 1
721 endwhile
722 if s:bmenu_count <= &menuitems
723 let s:bmenu_short = 0
724 endif
725
726 " iterate through buffer list, adding each buffer to the menu:
727 let buf = 1
728 while buf <= bufnr('$')
729 if bufexists(buf) && !isdirectory(bufname(buf)) && buflisted(buf)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000730 call <SID>BMFilename(bufname(buf), buf)
731 endif
732 let buf = buf + 1
733 endwhile
734 let s:bmenu_wait = 0
735 aug buffer_list
736 au!
737 au BufCreate,BufFilePost * call <SID>BMAdd()
738 au BufDelete,BufFilePre * call <SID>BMRemove()
739 aug END
740endfunc
741
742func! s:BMHash(name)
743 " Make name all upper case, so that chars are between 32 and 96
744 let nm = substitute(a:name, ".*", '\U\0', "")
745 if has("ebcdic")
746 " HACK: Replace all non alphabetics with 'Z'
747 " Just to make it work for now.
748 let nm = substitute(nm, "[^A-Z]", 'Z', "g")
749 let sp = char2nr('A') - 1
750 else
751 let sp = char2nr(' ')
752 endif
753 " convert first six chars into a number for sorting:
754 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)
755endfunc
756
757func! s:BMHash2(name)
758 let nm = substitute(a:name, ".", '\L\0', "")
759 " Not exactly right for EBCDIC...
760 if nm[0] < 'a' || nm[0] > 'z'
761 return '&others.'
762 elseif nm[0] <= 'd'
763 return '&abcd.'
764 elseif nm[0] <= 'h'
765 return '&efgh.'
766 elseif nm[0] <= 'l'
767 return '&ijkl.'
768 elseif nm[0] <= 'p'
769 return '&mnop.'
770 elseif nm[0] <= 't'
771 return '&qrst.'
772 else
773 return '&u-z.'
774 endif
775endfunc
776
777" insert a buffer name into the buffer menu:
778func! s:BMFilename(name, num)
779 if isdirectory(a:name)
780 return
781 endif
782 let munge = <SID>BMMunge(a:name, a:num)
783 let hash = <SID>BMHash(munge)
784 if s:bmenu_short == 0
785 let name = 'an ' . g:bmenu_priority . '.' . hash . ' &Buffers.' . munge
786 else
787 let name = 'an ' . g:bmenu_priority . '.' . hash . '.' . hash . ' &Buffers.' . <SID>BMHash2(munge) . munge
788 endif
789 " set 'cpo' to include the <CR>
790 let cpo_save = &cpo
791 set cpo&vim
792 exe name . ' :confirm b' . a:num . '<CR>'
793 let &cpo = cpo_save
794endfunc
795
796" Truncate a long path to fit it in a menu item.
797if !exists("g:bmenu_max_pathlen")
798 let g:bmenu_max_pathlen = 35
799endif
800func! s:BMTruncName(fname)
801 let name = a:fname
802 if g:bmenu_max_pathlen < 5
803 let name = ""
804 else
805 let len = strlen(name)
806 if len > g:bmenu_max_pathlen
807 let amountl = (g:bmenu_max_pathlen / 2) - 2
808 let amountr = g:bmenu_max_pathlen - amountl - 3
809 let pattern = '^\(.\{,' . amountl . '}\).\{-}\(.\{,' . amountr . '}\)$'
810 let left = substitute(name, pattern, '\1', '')
811 let right = substitute(name, pattern, '\2', '')
812 if strlen(left) + strlen(right) < len
813 let name = left . '...' . right
814 endif
815 endif
816 endif
817 return name
818endfunc
819
820func! s:BMMunge(fname, bnum)
821 let name = a:fname
822 if name == ''
823 if !exists("g:menutrans_no_file")
Bram Moolenaar6dc819b2018-07-03 16:42:19 +0200824 let g:menutrans_no_file = "[No Name]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000825 endif
826 let name = g:menutrans_no_file
827 else
828 let name = fnamemodify(name, ':p:~')
829 endif
830 " detach file name and separate it out:
831 let name2 = fnamemodify(name, ':t')
832 if a:bnum >= 0
833 let name2 = name2 . ' (' . a:bnum . ')'
834 endif
835 let name = name2 . "\t" . <SID>BMTruncName(fnamemodify(name,':h'))
836 let name = escape(name, "\\. \t|")
837 let name = substitute(name, "&", "&&", "g")
838 let name = substitute(name, "\n", "^@", "g")
839 return name
840endfunc
841
842" When just starting Vim, load the buffer menu later
843if has("vim_starting")
844 augroup LoadBufferMenu
845 au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
846 au VimEnter * au! LoadBufferMenu
847 augroup END
848else
849 call <SID>BMShow()
850endif
851
852endif " !exists("no_buffers_menu")
853
854" Window menu
855an 70.300 &Window.&New<Tab>^Wn <C-W>n
856an 70.310 &Window.S&plit<Tab>^Ws <C-W>s
857an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^ <C-W><C-^>
858an 70.330 &Window.Split\ &Vertically<Tab>^Wv <C-W>v
859if has("vertsplit")
860 an <silent> 70.332 &Window.Split\ File\ E&xplorer :call MenuExplOpen()<CR>
861 if !exists("*MenuExplOpen")
862 fun MenuExplOpen()
863 if @% == ""
864 20vsp .
865 else
Bram Moolenaaraba88572008-06-25 20:13:35 +0000866 exe "20vsp " . s:FnameEscape(expand("%:p:h"))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000867 endif
868 endfun
869 endif
870endif
871an 70.335 &Window.-SEP1- <Nop>
872an 70.340 &Window.&Close<Tab>^Wc :confirm close<CR>
873an 70.345 &Window.Close\ &Other(s)<Tab>^Wo :confirm only<CR>
874an 70.350 &Window.-SEP2- <Nop>
875an 70.355 &Window.Move\ &To.&Top<Tab>^WK <C-W>K
876an 70.355 &Window.Move\ &To.&Bottom<Tab>^WJ <C-W>J
Bram Moolenaar214641f2017-03-05 17:04:09 +0100877an 70.355 &Window.Move\ &To.&Left\ Side<Tab>^WH <C-W>H
878an 70.355 &Window.Move\ &To.&Right\ Side<Tab>^WL <C-W>L
Bram Moolenaar071d4272004-06-13 20:20:40 +0000879an 70.360 &Window.Rotate\ &Up<Tab>^WR <C-W>R
880an 70.362 &Window.Rotate\ &Down<Tab>^Wr <C-W>r
881an 70.365 &Window.-SEP3- <Nop>
882an 70.370 &Window.&Equal\ Size<Tab>^W= <C-W>=
883an 70.380 &Window.&Max\ Height<Tab>^W_ <C-W>_
884an 70.390 &Window.M&in\ Height<Tab>^W1_ <C-W>1_
885an 70.400 &Window.Max\ &Width<Tab>^W\| <C-W>\|
886an 70.410 &Window.Min\ Widt&h<Tab>^W1\| <C-W>1\|
887
888" The popup menu
889an 1.10 PopUp.&Undo u
890an 1.15 PopUp.-SEP1- <Nop>
891vnoremenu 1.20 PopUp.Cu&t "+x
892vnoremenu 1.30 PopUp.&Copy "+y
893cnoremenu 1.30 PopUp.&Copy <C-Y>
894nnoremenu 1.40 PopUp.&Paste "+gP
895cnoremenu 1.40 PopUp.&Paste <C-R>+
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +0000896exe 'vnoremenu <script> 1.40 PopUp.&Paste ' . paste#paste_cmd['v']
897exe 'inoremenu <script> 1.40 PopUp.&Paste ' . paste#paste_cmd['i']
Bram Moolenaar071d4272004-06-13 20:20:40 +0000898vnoremenu 1.50 PopUp.&Delete x
899an 1.55 PopUp.-SEP2- <Nop>
900vnoremenu 1.60 PopUp.Select\ Blockwise <C-V>
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000901
902nnoremenu 1.70 PopUp.Select\ &Word vaw
903onoremenu 1.70 PopUp.Select\ &Word aw
904vnoremenu 1.70 PopUp.Select\ &Word <C-C>vaw
905inoremenu 1.70 PopUp.Select\ &Word <C-O>vaw
906cnoremenu 1.70 PopUp.Select\ &Word <C-C>vaw
907
908nnoremenu 1.73 PopUp.Select\ &Sentence vas
909onoremenu 1.73 PopUp.Select\ &Sentence as
910vnoremenu 1.73 PopUp.Select\ &Sentence <C-C>vas
911inoremenu 1.73 PopUp.Select\ &Sentence <C-O>vas
912cnoremenu 1.73 PopUp.Select\ &Sentence <C-C>vas
913
914nnoremenu 1.77 PopUp.Select\ Pa&ragraph vap
915onoremenu 1.77 PopUp.Select\ Pa&ragraph ap
916vnoremenu 1.77 PopUp.Select\ Pa&ragraph <C-C>vap
917inoremenu 1.77 PopUp.Select\ Pa&ragraph <C-O>vap
918cnoremenu 1.77 PopUp.Select\ Pa&ragraph <C-C>vap
919
920nnoremenu 1.80 PopUp.Select\ &Line V
921onoremenu 1.80 PopUp.Select\ &Line <C-C>V
922vnoremenu 1.80 PopUp.Select\ &Line <C-C>V
923inoremenu 1.80 PopUp.Select\ &Line <C-O>V
924cnoremenu 1.80 PopUp.Select\ &Line <C-C>V
925
926nnoremenu 1.90 PopUp.Select\ &Block <C-V>
927onoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
928vnoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
929inoremenu 1.90 PopUp.Select\ &Block <C-O><C-V>
930cnoremenu 1.90 PopUp.Select\ &Block <C-C><C-V>
931
Bram Moolenaar071d4272004-06-13 20:20:40 +0000932noremenu <script> <silent> 1.100 PopUp.Select\ &All :<C-U>call <SID>SelectAll()<CR>
933inoremenu <script> <silent> 1.100 PopUp.Select\ &All <C-O>:call <SID>SelectAll()<CR>
934cnoremenu <script> <silent> 1.100 PopUp.Select\ &All <C-U>call <SID>SelectAll()<CR>
935
Bram Moolenaar45360022005-07-21 21:08:21 +0000936if has("spell")
937 " Spell suggestions in the popup menu. Note that this will slow down the
938 " appearance of the menu!
939 func! <SID>SpellPopup()
940 if exists("s:changeitem") && s:changeitem != ''
941 call <SID>SpellDel()
942 endif
Bram Moolenaarb38dea22006-09-14 11:35:25 +0000943
944 " Return quickly if spell checking is not enabled.
Bram Moolenaard8c00872005-07-22 21:52:15 +0000945 if !&spell || &spelllang == ''
946 return
947 endif
Bram Moolenaar45360022005-07-21 21:08:21 +0000948
949 let curcol = col('.')
Bram Moolenaar1c7715d2005-10-03 22:02:18 +0000950 let [w, a] = spellbadword()
Bram Moolenaar45360022005-07-21 21:08:21 +0000951 if col('.') > curcol " don't use word after the cursor
952 let w = ''
Bram Moolenaar45360022005-07-21 21:08:21 +0000953 endif
954 if w != ''
Bram Moolenaara93fa7e2006-04-17 22:14:47 +0000955 if a == 'caps'
956 let s:suglist = [substitute(w, '.*', '\u&', '')]
957 else
958 let s:suglist = spellsuggest(w, 10)
959 endif
Bram Moolenaar62292582010-07-10 16:36:59 +0200960 if len(s:suglist) > 0
Bram Moolenaar7c63fbc2018-05-17 13:15:23 +0200961 if !exists("g:menutrans_spell_change_ARG_to")
962 let g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
963 endif
964 let s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
Bram Moolenaar45360022005-07-21 21:08:21 +0000965 let s:fromword = w
966 let pri = 1
Bram Moolenaar62292582010-07-10 16:36:59 +0200967 " set 'cpo' to include the <CR>
968 let cpo_save = &cpo
969 set cpo&vim
Bram Moolenaar45360022005-07-21 21:08:21 +0000970 for sug in s:suglist
Bram Moolenaarb38dea22006-09-14 11:35:25 +0000971 exe 'anoremenu 1.5.' . pri . ' PopUp.' . s:changeitem . '.' . escape(sug, ' .')
Bram Moolenaar45360022005-07-21 21:08:21 +0000972 \ . ' :call <SID>SpellReplace(' . pri . ')<CR>'
973 let pri += 1
974 endfor
975
Bram Moolenaar7c63fbc2018-05-17 13:15:23 +0200976 if !exists("g:menutrans_spell_add_ARG_to_word_list")
977 let g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
978 endif
979 let s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
Bram Moolenaarb38dea22006-09-14 11:35:25 +0000980 exe 'anoremenu 1.6 PopUp.' . s:additem . ' :spellgood ' . w . '<CR>'
Bram Moolenaar45360022005-07-21 21:08:21 +0000981
Bram Moolenaar7c63fbc2018-05-17 13:15:23 +0200982 if !exists("g:menutrans_spell_ignore_ARG")
983 let g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
984 endif
985 let s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
Bram Moolenaarb38dea22006-09-14 11:35:25 +0000986 exe 'anoremenu 1.7 PopUp.' . s:ignoreitem . ' :spellgood! ' . w . '<CR>'
Bram Moolenaar45360022005-07-21 21:08:21 +0000987
Bram Moolenaarb38dea22006-09-14 11:35:25 +0000988 anoremenu 1.8 PopUp.-SpellSep- :
Bram Moolenaar62292582010-07-10 16:36:59 +0200989 let &cpo = cpo_save
Bram Moolenaar45360022005-07-21 21:08:21 +0000990 endif
991 endif
Bram Moolenaar62292582010-07-10 16:36:59 +0200992 call cursor(0, curcol) " put the cursor back where it was
Bram Moolenaar45360022005-07-21 21:08:21 +0000993 endfunc
994
995 func! <SID>SpellReplace(n)
996 let l = getline('.')
Bram Moolenaar62292582010-07-10 16:36:59 +0200997 " Move the cursor to the start of the word.
998 call spellbadword()
Bram Moolenaar45360022005-07-21 21:08:21 +0000999 call setline('.', strpart(l, 0, col('.') - 1) . s:suglist[a:n - 1]
1000 \ . strpart(l, col('.') + len(s:fromword) - 1))
1001 endfunc
1002
1003 func! <SID>SpellDel()
1004 exe "aunmenu PopUp." . s:changeitem
1005 exe "aunmenu PopUp." . s:additem
1006 exe "aunmenu PopUp." . s:ignoreitem
1007 aunmenu PopUp.-SpellSep-
1008 let s:changeitem = ''
1009 endfun
1010
Bram Moolenaarb38dea22006-09-14 11:35:25 +00001011 augroup SpellPopupMenu
1012 au! MenuPopup * call <SID>SpellPopup()
1013 augroup END
Bram Moolenaar45360022005-07-21 21:08:21 +00001014endif
Bram Moolenaar071d4272004-06-13 20:20:40 +00001015
1016" The GUI toolbar (for MS-Windows and GTK)
1017if has("toolbar")
1018 an 1.10 ToolBar.Open :browse confirm e<CR>
1019 an <silent> 1.20 ToolBar.Save :if expand("%") == ""<Bar>browse confirm w<Bar>else<Bar>confirm w<Bar>endif<CR>
1020 an 1.30 ToolBar.SaveAll :browse confirm wa<CR>
1021
1022 if has("printer")
1023 an 1.40 ToolBar.Print :hardcopy<CR>
1024 vunmenu ToolBar.Print
1025 vnoremenu ToolBar.Print :hardcopy<CR>
1026 elseif has("unix")
1027 an 1.40 ToolBar.Print :w !lpr<CR>
1028 vunmenu ToolBar.Print
1029 vnoremenu ToolBar.Print :w !lpr<CR>
1030 endif
1031
1032 an 1.45 ToolBar.-sep1- <Nop>
1033 an 1.50 ToolBar.Undo u
1034 an 1.60 ToolBar.Redo <C-R>
1035
1036 an 1.65 ToolBar.-sep2- <Nop>
1037 vnoremenu 1.70 ToolBar.Cut "+x
1038 vnoremenu 1.80 ToolBar.Copy "+y
1039 cnoremenu 1.80 ToolBar.Copy <C-Y>
1040 nnoremenu 1.90 ToolBar.Paste "+gP
1041 cnoremenu ToolBar.Paste <C-R>+
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001042 exe 'vnoremenu <script> ToolBar.Paste ' . paste#paste_cmd['v']
1043 exe 'inoremenu <script> ToolBar.Paste ' . paste#paste_cmd['i']
Bram Moolenaar071d4272004-06-13 20:20:40 +00001044
1045 if !has("gui_athena")
1046 an 1.95 ToolBar.-sep3- <Nop>
Bram Moolenaare2cc9702005-03-15 22:43:58 +00001047 an 1.100 ToolBar.Replace :promptrepl<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00001048 vunmenu ToolBar.Replace
Bram Moolenaar4ea8fe12006-03-09 22:32:39 +00001049 vnoremenu ToolBar.Replace y:promptrepl <C-R>=<SID>FixFText()<CR><CR>
Bram Moolenaare2cc9702005-03-15 22:43:58 +00001050 an 1.110 ToolBar.FindNext n
1051 an 1.120 ToolBar.FindPrev N
Bram Moolenaar071d4272004-06-13 20:20:40 +00001052 endif
1053
Bram Moolenaar071d4272004-06-13 20:20:40 +00001054 an 1.215 ToolBar.-sep5- <Nop>
1055 an <silent> 1.220 ToolBar.LoadSesn :call <SID>LoadVimSesn()<CR>
1056 an <silent> 1.230 ToolBar.SaveSesn :call <SID>SaveVimSesn()<CR>
1057 an 1.240 ToolBar.RunScript :browse so<CR>
1058
1059 an 1.245 ToolBar.-sep6- <Nop>
1060 an 1.250 ToolBar.Make :make<CR>
1061 an 1.270 ToolBar.RunCtags :exe "!" . g:ctags_command<CR>
1062 an 1.280 ToolBar.TagJump g<C-]>
1063
1064 an 1.295 ToolBar.-sep7- <Nop>
1065 an 1.300 ToolBar.Help :help<CR>
1066 an <silent> 1.310 ToolBar.FindHelp :call <SID>Helpfind()<CR>
1067
1068" Only set the tooltips here if not done in a language menu file
1069if exists("*Do_toolbar_tmenu")
1070 call Do_toolbar_tmenu()
1071else
1072 let did_toolbar_tmenu = 1
1073 tmenu ToolBar.Open Open file
1074 tmenu ToolBar.Save Save current file
1075 tmenu ToolBar.SaveAll Save all files
1076 tmenu ToolBar.Print Print
1077 tmenu ToolBar.Undo Undo
1078 tmenu ToolBar.Redo Redo
1079 tmenu ToolBar.Cut Cut to clipboard
1080 tmenu ToolBar.Copy Copy to clipboard
1081 tmenu ToolBar.Paste Paste from Clipboard
1082 if !has("gui_athena")
Bram Moolenaar5c736222010-01-06 20:54:52 +01001083 tmenu ToolBar.Replace Find / Replace...
Bram Moolenaar071d4272004-06-13 20:20:40 +00001084 tmenu ToolBar.FindNext Find Next
1085 tmenu ToolBar.FindPrev Find Previous
Bram Moolenaar071d4272004-06-13 20:20:40 +00001086 endif
Bram Moolenaarb38dea22006-09-14 11:35:25 +00001087 tmenu ToolBar.LoadSesn Choose a session to load
Bram Moolenaar071d4272004-06-13 20:20:40 +00001088 tmenu ToolBar.SaveSesn Save current session
Bram Moolenaarb38dea22006-09-14 11:35:25 +00001089 tmenu ToolBar.RunScript Choose a Vim Script to run
Bram Moolenaare2cc9702005-03-15 22:43:58 +00001090 tmenu ToolBar.Make Make current project (:make)
1091 tmenu ToolBar.RunCtags Build tags in current directory tree (!ctags -R .)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001092 tmenu ToolBar.TagJump Jump to tag under cursor
1093 tmenu ToolBar.Help Vim Help
1094 tmenu ToolBar.FindHelp Search Vim Help
1095endif
1096
1097" Select a session to load; default to current session name if present
1098fun! s:LoadVimSesn()
1099 if strlen(v:this_session) > 0
Bram Moolenaaraba88572008-06-25 20:13:35 +00001100 let name = s:FnameEscape(v:this_session)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001101 else
1102 let name = "Session.vim"
1103 endif
1104 execute "browse so " . name
1105endfun
1106
1107" Select a session to save; default to current session name if present
1108fun! s:SaveVimSesn()
1109 if strlen(v:this_session) == 0
1110 let v:this_session = "Session.vim"
1111 endif
Bram Moolenaaraba88572008-06-25 20:13:35 +00001112 execute "browse mksession! " . s:FnameEscape(v:this_session)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001113endfun
1114
1115endif
1116
1117endif " !exists("did_install_default_menus")
1118
1119" Define these items always, so that syntax can be switched on when it wasn't.
1120" But skip them when the Syntax menu was disabled by the user.
1121if !exists("did_install_syntax_menu")
1122 an 50.212 &Syntax.&Manual :syn manual<CR>
1123 an 50.214 &Syntax.A&utomatic :syn on<CR>
Bram Moolenaar214641f2017-03-05 17:04:09 +01001124 an <silent> 50.216 &Syntax.On/Off\ for\ &This\ File :call <SID>SynOnOff()<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00001125 if !exists("*s:SynOnOff")
1126 fun s:SynOnOff()
1127 if has("syntax_items")
1128 syn clear
1129 else
1130 if !exists("g:syntax_on")
1131 syn manual
1132 endif
1133 set syn=ON
1134 endif
1135 endfun
1136 endif
1137endif
1138
1139
1140" Install the Syntax menu only when filetype.vim has been loaded or when
1141" manual syntax highlighting is enabled.
1142" Avoid installing the Syntax menu twice.
1143if (exists("did_load_filetypes") || exists("syntax_on"))
1144 \ && !exists("did_install_syntax_menu")
1145 let did_install_syntax_menu = 1
1146
1147" Skip setting up the individual syntax selection menus unless
1148" do_syntax_sel_menu is defined (it takes quite a bit of time).
1149if exists("do_syntax_sel_menu")
1150 runtime! synmenu.vim
1151else
Bram Moolenaar040c1fe2017-11-09 19:45:48 +01001152 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>
Bram Moolenaar071d4272004-06-13 20:20:40 +00001153 an 50.195 &Syntax.-SEP1- <Nop>
1154endif
1155
1156an 50.210 &Syntax.&Off :syn off<CR>
1157an 50.700 &Syntax.-SEP3- <Nop>
Bram Moolenaar214641f2017-03-05 17:04:09 +01001158an 50.710 &Syntax.Co&lor\ Test :sp $VIMRUNTIME/syntax/colortest.vim<Bar>so %<CR>
1159an 50.720 &Syntax.&Highlight\ Test :runtime syntax/hitest.vim<CR>
Bram Moolenaar071d4272004-06-13 20:20:40 +00001160an 50.730 &Syntax.&Convert\ to\ HTML :runtime syntax/2html.vim<CR>
1161
1162endif " !exists("did_install_syntax_menu")
1163
Bram Moolenaar071d4272004-06-13 20:20:40 +00001164" Restore the previous value of 'cpoptions'.
1165let &cpo = s:cpo_save
1166unlet s:cpo_save
1167
1168" vim: set sw=2 :