diff runtime/menu.vim @ 27538:f37561549ec2

Update runtime files; use compiled functions Commit: https://github.com/vim/vim/commit/3e79c97c18c50f97797ab13ed81c4011eba9aba0 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 4 19:48:06 2022 +0000 Update runtime files; use compiled functions
author Bram Moolenaar <Bram@vim.org>
date Fri, 04 Feb 2022 21:00:05 +0100
parents f0d7cb510ce3
children 179c118424a6
line wrap: on
line diff
--- a/runtime/menu.vim
+++ b/runtime/menu.vim
@@ -2,7 +2,7 @@
 " You can also use this as a start for your own set of menus.
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2021 Dec 22
+" Last Change:	2022 Feb 04
 
 " Note that ":an" (short for ":anoremenu") is often used to make a menu work
 " in all modes and avoid side effects from mappings defined by the user.
@@ -33,7 +33,7 @@ if exists("v:lang") || &langmenu != ""
   if strlen(s:lang) > 1 && s:lang !~? '^en_us'
     " When the language does not include the charset add 'encoding'
     if s:lang =~ '^\a\a$\|^\a\a_\a\a$'
-      let s:lang = s:lang . '.' . &enc
+      let s:lang = s:lang .. '.' .. &enc
     endif
 
     " We always use a lowercase name.
@@ -49,26 +49,26 @@ if exists("v:lang") || &langmenu != ""
     " same menu file for them.
     let s:lang = substitute(s:lang, 'iso_8859-15\=$', "latin1", "")
     menutrans clear
-    exe "runtime! lang/menu_" . s:lang . ".vim"
+    exe "runtime! lang/menu_" .. s:lang .. ".vim"
 
     if !exists("did_menu_trans")
       " There is no exact match, try matching with a wildcard added
       " (e.g. find menu_de_de.iso_8859-1.vim if s:lang == de_DE).
       let s:lang = substitute(s:lang, '\.[^.]*', "", "")
-      exe "runtime! lang/menu_" . s:lang . "[^a-z]*vim"
+      exe "runtime! lang/menu_" .. s:lang .. "[^a-z]*vim"
 
       if !exists("did_menu_trans") && s:lang =~ '_'
 	" If the language includes a region try matching without that region.
 	" (e.g. find menu_de.vim if s:lang == de_DE).
 	let langonly = substitute(s:lang, '_.*', "", "")
-	exe "runtime! lang/menu_" . langonly . "[^a-z]*vim"
+	exe "runtime! lang/menu_" .. langonly .. "[^a-z]*vim"
       endif
 
       if !exists("did_menu_trans") && strlen($LANG) > 1 && s:lang !~ '^en_us'
 	" On windows locale names are complicated, try using $LANG, it might
 	" have been set by set_init_1().  But don't do this for "en" or "en_us".
 	" But don't match "slovak" when $LANG is "sl".
-	exe "runtime! lang/menu_" . tolower($LANG) . "[^a-z]*vim"
+	exe "runtime! lang/menu_" .. tolower($LANG) .. "[^a-z]*vim"
       endif
     endif
   endif
@@ -104,19 +104,19 @@ if exists(':tlmenu')
   tlnoremenu 9999.90 &Help.&About			<C-W>:intro<CR>
 endif
 
-fun! s:Helpfind()
+def s:Helpfind()
   if !exists("g:menutrans_help_dialog")
-    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')"
+    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')"
   endif
-  let h = inputdialog(g:menutrans_help_dialog)
+  var h = inputdialog(g:menutrans_help_dialog)
   if h != ""
-    let v:errmsg = ""
-    silent! exe "help " . h
+    v:errmsg = ""
+    silent! exe "help " .. h
     if v:errmsg != ""
       echo v:errmsg
     endif
   endif
-endfun
+enddef
 
 " File menu
 an 10.310 &File.&Open\.\.\.<Tab>:e		:browse confirm e<CR>
@@ -154,16 +154,9 @@ an 10.600 &File.-SEP4-				<Nop>
 an 10.610 &File.Sa&ve-Exit<Tab>:wqa		:confirm wqa<CR>
 an 10.620 &File.E&xit<Tab>:qa			:confirm qa<CR>
 
-func s:SelectAll()
-  exe "norm! gg" . (&slm == "" ? "VG" : "gH\<C-O>G")
-endfunc
-
-func s:FnameEscape(fname)
-  if exists('*fnameescape')
-    return fnameescape(a:fname)
-  endif
-  return escape(a:fname, " \t\n*?[{`$\\%#'\"|!<")
-endfunc
+def s:SelectAll()
+  exe "norm! gg" .. (&slm == "" ? "VG" : "gH\<C-O>G")
+enddef
 
 " Edit menu
 an 20.310 &Edit.&Undo<Tab>u			u
@@ -182,8 +175,8 @@ cnoremenu	 &Edit.&Paste<Tab>"+gP		<C-R>+
 if exists(':tlmenu')
   tlnoremenu	 &Edit.&Paste<Tab>"+gP		<C-W>"+
 endif
-exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP	' . paste#paste_cmd['v']
-exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP	' . paste#paste_cmd['i']
+exe 'vnoremenu <script> &Edit.&Paste<Tab>"+gP	' .. paste#paste_cmd['v']
+exe 'inoremenu <script> &Edit.&Paste<Tab>"+gP	' .. paste#paste_cmd['i']
 nnoremenu 20.370 &Edit.Put\ &Before<Tab>[p	[p
 inoremenu	 &Edit.Put\ &Before<Tab>[p	<C-O>[p
 nnoremenu 20.380 &Edit.Put\ &After<Tab>]p	]p
@@ -214,32 +207,33 @@ an 20.425	 &Edit.-SEP3-				<Nop>
 an 20.430	 &Edit.Settings\ &Window		:options<CR>
 an 20.435	 &Edit.Startup\ &Settings		:call <SID>EditVimrc()<CR>
 
-fun! s:EditVimrc()
+def s:EditVimrc()
+  var fname: string
   if $MYVIMRC != ''
-    let fname = $MYVIMRC
+    fname = $MYVIMRC
   elseif has("win32")
     if $HOME != ''
-      let fname = $HOME . "/_vimrc"
+      fname = $HOME .. "/_vimrc"
     else
-      let fname = $VIM . "/_vimrc"
+      fname = $VIM .. "/_vimrc"
     endif
   elseif has("amiga")
-    let fname = "s:.vimrc"
+    fname = "s:.vimrc"
   else
-    let fname = $HOME . "/.vimrc"
+    fname = $HOME .. "/.vimrc"
   endif
-  let fname = s:FnameEscape(fname)
+  fname = fnameescape(fname)
   if &mod
-    exe "split " . fname
+    exe "split " .. fname
   else
-    exe "edit " . fname
+    exe "edit " .. fname
   endif
-endfun
+enddef
 
-fun! s:FixFText()
-  " Fix text in nameless register to be used with :promptfind.
+def s:FixFText(): string
+  # Fix text in nameless register to be used with :promptfind.
   return substitute(@", "[\r\n]", '\\n', 'g')
-endfun
+enddef
 
 " Edit/Global Settings
 an 20.440.100 &Edit.&Global\ Settings.Toggle\ Pattern\ &Highlight<Tab>:set\ hls!	:set hls! hls?<CR>
@@ -272,34 +266,34 @@ an <silent> 20.440.320 &Edit.&Global\ Se
 an <silent> 20.440.330 &Edit.&Global\ Settings.Toggle\ &Left\ Scrollbar	:call <SID>ToggleGuiOption("l")<CR>
 an <silent> 20.440.340 &Edit.&Global\ Settings.Toggle\ &Right\ Scrollbar :call <SID>ToggleGuiOption("r")<CR>
 
-fun! s:SearchP()
+def s:SearchP()
   if !exists("g:menutrans_path_dialog")
-    let g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
+    g:menutrans_path_dialog = "Enter search path for files.\nSeparate directory names with a comma."
   endif
-  let n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
+  var n = inputdialog(g:menutrans_path_dialog, substitute(&path, '\\ ', ' ', 'g'))
   if n != ""
-    let &path = substitute(n, ' ', '\\ ', 'g')
+    &path = substitute(n, ' ', '\\ ', 'g')
   endif
-endfun
+enddef
 
-fun! s:TagFiles()
+def s:TagFiles()
   if !exists("g:menutrans_tags_dialog")
-    let g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
+    g:menutrans_tags_dialog = "Enter names of tag files.\nSeparate the names with a comma."
   endif
-  let n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
+  var n = inputdialog(g:menutrans_tags_dialog, substitute(&tags, '\\ ', ' ', 'g'))
   if n != ""
-    let &tags = substitute(n, ' ', '\\ ', 'g')
+    &tags = substitute(n, ' ', '\\ ', 'g')
   endif
-endfun
+enddef
 
-fun! s:ToggleGuiOption(option)
-    " If a:option is already set in guioptions, then we want to remove it
-    if match(&guioptions, "\\C" . a:option) > -1
-	exec "set go-=" . a:option
-    else
-	exec "set go+=" . a:option
-    endif
-endfun
+def s:ToggleGuiOption(option: string)
+  # If a:option is already set in guioptions, then we want to remove it
+  if match(&guioptions, "\\C" .. option) > -1
+    exec "set go-=" .. option
+  else
+    exec "set go+=" .. option
+  endif
+enddef
 
 " Edit/File Settings
 
@@ -331,34 +325,36 @@ an 20.440.620.80 &Edit.F&ile\ Settings.S
 
 an <silent> 20.440.630 &Edit.F&ile\ Settings.Te&xt\ Width\.\.\.  :call <SID>TextWidth()<CR>
 an <silent> 20.440.640 &Edit.F&ile\ Settings.&File\ Format\.\.\.  :call <SID>FileFormat()<CR>
-fun! s:TextWidth()
+
+def s:TextWidth()
   if !exists("g:menutrans_textwidth_dialog")
-    let g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
+    g:menutrans_textwidth_dialog = "Enter new text width (0 to disable formatting): "
   endif
-  let n = inputdialog(g:menutrans_textwidth_dialog, &tw)
+  var n = inputdialog(g:menutrans_textwidth_dialog, &tw .. '')
   if n != ""
-    " Remove leading zeros to avoid it being used as an octal number.
-    " But keep a zero by itself.
-    let tw = substitute(n, "^0*", "", "")
-    let &tw = tw == '' ? 0 : tw
+    # Remove leading zeros to avoid it being used as an octal number.
+    # But keep a zero by itself.
+    var tw = substitute(n, "^0*", "", "")
+    &tw = tw == '' ? 0 : tw
   endif
-endfun
+enddef
 
-fun! s:FileFormat()
+def s:FileFormat()
   if !exists("g:menutrans_fileformat_dialog")
-    let g:menutrans_fileformat_dialog = "Select format for writing the file"
+    g:menutrans_fileformat_dialog = "Select format for writing the file"
   endif
   if !exists("g:menutrans_fileformat_choices")
-    let g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
+    g:menutrans_fileformat_choices = "&Unix\n&Dos\n&Mac\n&Cancel"
   endif
+  var def_choice: number
   if &ff == "dos"
-    let def = 2
+    def_choice = 2
   elseif &ff == "mac"
-    let def = 3
+    def_choice = 3
   else
-    let def = 1
+    def_choice = 1
   endif
-  let n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def, "Question")
+  var n = confirm(g:menutrans_fileformat_dialog, g:menutrans_fileformat_choices, def_choice, "Question")
   if n == 1
     set ff=unix
   elseif n == 2
@@ -366,32 +362,33 @@ fun! s:FileFormat()
   elseif n == 3
     set ff=mac
   endif
-endfun
+enddef
 
 let s:did_setup_color_schemes = 0
 
 " Setup the Edit.Color Scheme submenu
-func s:SetupColorSchemes() abort
+def s:SetupColorSchemes()
   if s:did_setup_color_schemes
     return
   endif
-  let s:did_setup_color_schemes = 1
+  s:did_setup_color_schemes = 1
 
-  let n = globpath(&runtimepath, "colors/*.vim", 1, 1)
-  let n += globpath(&packpath, "pack/*/start/*/colors/*.vim", 1, 1)
-  let n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
+  var n = globpath(&runtimepath, "colors/*.vim", 1, 1)
+  n += globpath(&packpath, "pack/*/start/*/colors/*.vim", 1, 1)
+  n += globpath(&packpath, "pack/*/opt/*/colors/*.vim", 1, 1)
 
-  " Ignore case for VMS and windows, sort on name
-  let names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
+  # Ignore case for VMS and windows, sort on name
+  var names = sort(map(n, 'substitute(v:val, "\\c.*[/\\\\:\\]]\\([^/\\\\:]*\\)\\.vim", "\\1", "")'), 1)
 
-  " define all the submenu entries
-  let idx = 100
+  # define all the submenu entries
+  var idx = 100
   for name in names
-    exe "an 20.450." . idx . ' &Edit.C&olor\ Scheme.' . name . " :colors " . name . "<CR>"
-    let idx = idx + 10
+    exe "an 20.450." .. idx .. ' &Edit.C&olor\ Scheme.' .. name .. " :colors " .. name .. "<CR>"
+    idx += 10
   endfor
   silent! aunmenu &Edit.Show\ C&olor\ Schemes\ in\ Menu
-endfun
+enddef
+
 if exists("do_no_lazyload_menus")
   call s:SetupColorSchemes()
 else
@@ -403,31 +400,33 @@ endif
 if has("keymap")
   let s:did_setup_keymaps = 0
 
-  func s:SetupKeymaps() abort
+  def s:SetupKeymaps()
     if s:did_setup_keymaps
       return
     endif
-    let s:did_setup_keymaps = 1
+    s:did_setup_keymaps = 1
 
-    let n = globpath(&runtimepath, "keymap/*.vim", 1, 1)
-    if !empty(n)
-      let idx = 100
+    var names = globpath(&runtimepath, "keymap/*.vim", 1, 1)
+    if !empty(names)
+      var idx = 100
       an 20.460.90 &Edit.&Keymap.None :set keymap=<CR>
-      for name in n
-	" Ignore case for VMS and windows
-	let name = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
-	exe "an 20.460." . idx . ' &Edit.&Keymap.' . name . " :set keymap=" . name . "<CR>"
-	let idx = idx + 10
+      for name in names
+	# Ignore case for VMS and windows
+	var mapname = substitute(name, '\c.*[/\\:\]]\([^/\\:_]*\)\(_[0-9a-zA-Z-]*\)\=\.vim', '\1', '')
+	exe "an 20.460." .. idx .. ' &Edit.&Keymap.' .. mapname .. " :set keymap=" .. mapname .. "<CR>"
+	idx += 10
       endfor
     endif
     silent! aunmenu &Edit.Show\ &Keymaps\ in\ Menu
-  endfun
+  enddef
+
   if exists("do_no_lazyload_menus")
     call s:SetupKeymaps()
   else
     an <silent> 20.460 &Edit.Show\ &Keymaps\ in\ Menu :call <SID>SetupKeymaps()<CR>
   endif
 endif
+
 if has("win32") || has("gui_motif") || has("gui_gtk") || has("gui_kde") || has("gui_photon") || has("gui_mac")
   an 20.470 &Edit.Select\ Fo&nt\.\.\.	:set guifont=*<CR>
 endif
@@ -445,7 +444,7 @@ an 40.300 &Tools.&Jump\ to\ This\ Tag<Ta
 vunmenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]
 vnoremenu &Tools.&Jump\ to\ This\ Tag<Tab>g^]	g<C-]>
 an 40.310 &Tools.Jump\ &Back<Tab>^T		<C-T>
-an 40.320 &Tools.Build\ &Tags\ File		:exe "!" . g:ctags_command<CR>
+an 40.320 &Tools.Build\ &Tags\ File		:exe "!" .. g:ctags_command<CR>
 
 if has("folding") || has("spell")
   an 40.330 &Tools.-SEP1-						<Nop>
@@ -469,50 +468,47 @@ if has("spell")
   an <silent> 40.335.270 &Tools.&Spelling.&Find\ More\ Languages	:call <SID>SpellLang()<CR>
 
   let s:undo_spelllang = ['aun &Tools.&Spelling.&Find\ More\ Languages']
-  func s:SpellLang()
+  def s:SpellLang()
     for cmd in s:undo_spelllang
-      exe "silent! " . cmd
+      exe "silent! " .. cmd
     endfor
-    let s:undo_spelllang = []
+    s:undo_spelllang = []
 
-    if &enc == "iso-8859-15"
-      let enc = "latin1"
-    else
-      let enc = &enc
-    endif
+    var enc = &enc == "iso-8859-15" ? "latin1" : &enc
 
     if !exists("g:menutrans_set_lang_to")
-      let g:menutrans_set_lang_to = 'Set Language to'
+      g:menutrans_set_lang_to = 'Set Language to'
     endif
 
-    let found = 0
-    let s = globpath(&runtimepath, "spell/*." . enc . ".spl", 1, 1)
-    if !empty(s)
-      let n = 300
-      for f in s
-	let nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
+    var found = 0
+    var _nm = ''
+    var names = globpath(&runtimepath, "spell/*." .. enc .. ".spl", 1, 1)
+    if !empty(names)
+      var n = 300
+      for f in names
+	var nm = substitute(f, '.*spell[/\\]\(..\)\.[^/\\]*\.spl', '\1', "")
 	if nm != "en" && nm !~ '/'
-          let _nm = nm
-	  let found += 1
-	  let menuname = '&Tools.&Spelling.' . escape(g:menutrans_set_lang_to, "\\. \t|") . '\ "' . nm . '"'
-	  exe 'an 40.335.' . n . ' ' . menuname . ' :set spl=' . nm . ' spell<CR>'
-	  let s:undo_spelllang += ['aun ' . menuname]
+          _nm = nm
+	  found += 1
+	  var menuname = '&Tools.&Spelling.' .. escape(g:menutrans_set_lang_to, "\\. \t|") .. '\ "' .. nm .. '"'
+	  exe 'an 40.335.' .. n .. ' ' .. menuname .. ' :set spl=' .. nm .. ' spell<CR>'
+	  s:undo_spelllang += ['aun ' .. menuname]
 	endif
-	let n += 10
+	n += 10
       endfor
     endif
     if found == 0
       echomsg "Could not find other spell files"
     elseif found == 1
-      echomsg "Found spell file " . _nm
+      echomsg "Found spell file " .. _nm
     else
-      echomsg "Found " . found . " more spell files"
+      echomsg "Found " .. found .. " more spell files"
     endif
-    " Need to redo this when 'encoding' is changed.
+    # Need to redo this when 'encoding' is changed.
     augroup spellmenu
     au! EncodingChanged * call <SID>SpellLang()
     augroup END
-  endfun
+  enddef
 
 endif
 
@@ -581,66 +577,67 @@ an <silent> 40.540 &Tools.Conve&rt\ Back
 
 " Use a function to do the conversion, so that it also works with 'insertmode'
 " set.
-func s:XxdConv()
-  let mod = &mod
+def s:XxdConv()
+  var mod = &mod
   if has("vms")
-    %!mc vim:xxd
+    :%!mc vim:xxd
   else
-    call s:XxdFind()
-    exe '%!' . g:xxdprogram
+    s:XxdFind()
+    exe '%!' .. g:xxdprogram
   endif
-  if getline(1) =~ "^0000000:"		" only if it worked
+  if getline(1) =~ "^0000000:"		# only if it worked
     set ft=xxd
   endif
-  let &mod = mod
-endfun
+  &mod = mod
+enddef
 
-func s:XxdBack()
-  let mod = &mod
+def s:XxdBack()
+  var mod = &mod
   if has("vms")
-    %!mc vim:xxd -r
+    :%!mc vim:xxd -r
   else
-    call s:XxdFind()
-    exe '%!' . g:xxdprogram . ' -r'
+    s:XxdFind()
+    exe '%!' .. g:xxdprogram .. ' -r'
   endif
   set ft=
   doautocmd filetypedetect BufReadPost
-  let &mod = mod
-endfun
+  &mod = mod
+enddef
 
-func s:XxdFind()
+def s:XxdFind()
   if !exists("g:xxdprogram")
-    " On the PC xxd may not be in the path but in the install directory
+    # On the PC xxd may not be in the path but in the install directory
     if has("win32") && !executable("xxd")
-      let g:xxdprogram = $VIMRUNTIME . (&shellslash ? '/' : '\') . "xxd.exe"
+      g:xxdprogram = $VIMRUNTIME .. (&shellslash ? '/' : '\') .. "xxd.exe"
       if g:xxdprogram =~ ' '
-	let g:xxdprogram = '"' .. g:xxdprogram .. '"'
+	g:xxdprogram = '"' .. g:xxdprogram .. '"'
       endif
     else
-      let g:xxdprogram = "xxd"
+      g:xxdprogram = "xxd"
     endif
   endif
-endfun
+enddef
 
 let s:did_setup_compilers = 0
 
 " Setup the Tools.Compiler submenu
-func s:SetupCompilers() abort
+def s:SetupCompilers()
   if s:did_setup_compilers
     return
   endif
-  let s:did_setup_compilers = 1
+  s:did_setup_compilers = 1
 
-  let n = globpath(&runtimepath, "compiler/*.vim", 1, 1)
-  let idx = 100
-  for name in n
-    " Ignore case for VMS and windows
-    let name = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
-    exe "an 30.440." . idx . ' &Tools.Se&t\ Compiler.' . name . " :compiler " . name . "<CR>"
-    let idx = idx + 10
+  var names = globpath(&runtimepath, "compiler/*.vim", 1, 1)
+  var idx = 100
+  for name in names
+    # Ignore case for VMS and windows
+    var cname = substitute(name, '\c.*[/\\:\]]\([^/\\:]*\)\.vim', '\1', '')
+    exe "an 30.440." .. idx .. ' &Tools.Se&t\ Compiler.' .. cname .. " :compiler " .. cname .. "<CR>"
+    idx += 10
   endfor
   silent! aunmenu &Tools.Show\ Compiler\ Se&ttings\ in\ Menu
-endfun
+enddef
+
 if exists("do_no_lazyload_menus")
   call s:SetupCompilers()
 else
@@ -649,13 +646,13 @@ endif
 
 " Load ColorScheme, Compiler Setting and Keymap menus when idle.
 if !exists("do_no_lazyload_menus")
-  func s:SetupLazyloadMenus()
-    call s:SetupColorSchemes()
-    call s:SetupCompilers()
+  def s:SetupLazyloadMenus()
+    s:SetupColorSchemes()
+    s:SetupCompilers()
     if has("keymap")
-      call s:SetupKeymaps()
+      s:SetupKeymaps()
     endif
-  endfunc
+  enddef
   augroup SetupLazyloadMenus
     au!
     au CursorHold,CursorHoldI * call <SID>SetupLazyloadMenus() | au! SetupLazyloadMenus
@@ -680,135 +677,133 @@ if !exists("bmenu_priority")
 endif
 
 " invoked from a BufCreate or BufFilePost autocommand
-func s:BMAdd()
+def s:BMAdd()
   if s:bmenu_wait == 0
-    " when adding too many buffers, redraw in short format
+    # when adding too many buffers, redraw in short format
     if s:bmenu_count == &menuitems && s:bmenu_short == 0
-      call s:BMShow()
+      s:BMShow()
     else
-      let name = expand("<afile>")
-      let num = expand("<abuf>") + 0 " add zero to convert to a number type
+      var name = expand("<afile>")
+      var num = str2nr(expand("<abuf>"))
       if s:BMCanAdd(name, num)
-	call <SID>BMFilename(name, num)
-	let s:bmenu_count += 1
+	s:BMFilename(name, num)
+	s:bmenu_count += 1
       endif
     endif
   endif
-endfunc
+enddef
 
 " invoked from a BufDelete or BufFilePre autocommand
-func s:BMRemove()
+def s:BMRemove()
   if s:bmenu_wait == 0
-    let bufnum = expand("<abuf>")
+    var bufnum = expand("<abuf>")
     if s:bmenu_items->has_key(bufnum)
-      let menu_name = s:bmenu_items[bufnum]
-      exe 'silent! aun &Buffers.' . menu_name
-      let s:bmenu_count = s:bmenu_count - 1
+      var menu_name = s:bmenu_items[bufnum]
+      exe 'silent! aun &Buffers.' .. menu_name
+      s:bmenu_count = s:bmenu_count - 1
       unlet s:bmenu_items[bufnum]
     endif
   endif
-endfunc
+enddef
 
 " Return non-zero if buffer with number "name" / "num" is useful to add in the
 " buffer menu.
-func s:BMCanAdd(name, num)
-  " no directory or unlisted buffer
-  if isdirectory(a:name) || !buflisted(a:num)
-    return 0
-  endif
-
-  " no name with control characters
-  if a:name =~ '[\x01-\x1f]'
-    return 0
+def s:BMCanAdd(name: string, num: number): bool
+  # no directory or unlisted buffer
+  if isdirectory(name) || !buflisted(num)
+    return false
   endif
 
-  " no special buffer, such as terminal or popup
-  let buftype = getbufvar(a:num, '&buftype')
-  if buftype != '' && buftype != 'nofile' && buftype != 'nowrite'
-    return 0
+  # no name with control characters
+  if name =~ '[\x01-\x1f]'
+    return false
   endif
 
-  " only existing buffers
-  return bufexists(a:num)
-endfunc
-
-" Create the buffer menu (delete an existing one first).
-func s:BMShow(...)
-  let s:bmenu_wait = 1
-  let s:bmenu_short = 1
-  let s:bmenu_count = 0
-  let s:bmenu_items = {}
-  "
-  " get new priority, if exists
-  if a:0 == 1
-    let g:bmenu_priority = a:1
+  # no special buffer, such as terminal or popup
+  var buftype = getbufvar(num, '&buftype')
+  if buftype != '' && buftype != 'nofile' && buftype != 'nowrite'
+    return false
   endif
 
-  " Remove old menu, if it exists; keep one entry to avoid a torn off menu to
-  " disappear.  Use try/catch to avoid setting v:errmsg
-  try | unmenu &Buffers | catch | endtry
-  exe 'noremenu ' . g:bmenu_priority . ".1 &Buffers.Dummy l"
-  try | unmenu! &Buffers | catch | endtry
+  # only existing buffers
+  return bufexists(num)
+enddef
+
+" Create the buffer menu (delete an existing one first).
+def s:BMShow()
+  s:bmenu_wait = 1
+  s:bmenu_short = 1
+  s:bmenu_count = 0
+  s:bmenu_items = {}
 
-  " create new menu; set 'cpo' to include the <CR>
-  let cpo_save = &cpo
-  set cpo&vim
-  exe 'an <silent> ' . g:bmenu_priority . ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
-  exe 'an ' . g:bmenu_priority . ".4 &Buffers.&Delete :confirm bd<CR>"
-  exe 'an ' . g:bmenu_priority . ".6 &Buffers.&Alternate :confirm b #<CR>"
-  exe 'an ' . g:bmenu_priority . ".7 &Buffers.&Next :confirm bnext<CR>"
-  exe 'an ' . g:bmenu_priority . ".8 &Buffers.&Previous :confirm bprev<CR>"
-  exe 'an ' . g:bmenu_priority . ".9 &Buffers.-SEP- :"
-  let &cpo = cpo_save
+  # Remove old menu, if it exists; keep one entry to avoid a torn off menu to
+  # disappear.  Use try/catch to avoid setting v:errmsg
+  try 
+    unmenu &Buffers 
+  catch 
+  endtry
+  exe 'noremenu ' .. g:bmenu_priority .. ".1 &Buffers.Dummy l"
+  try 
+    unmenu! &Buffers 
+  catch 
+  endtry
+
+  # create new menu
+  exe 'an <silent> ' .. g:bmenu_priority .. ".2 &Buffers.&Refresh\\ menu :call <SID>BMShow()<CR>"
+  exe 'an ' .. g:bmenu_priority .. ".4 &Buffers.&Delete :confirm bd<CR>"
+  exe 'an ' .. g:bmenu_priority .. ".6 &Buffers.&Alternate :confirm b #<CR>"
+  exe 'an ' .. g:bmenu_priority .. ".7 &Buffers.&Next :confirm bnext<CR>"
+  exe 'an ' .. g:bmenu_priority .. ".8 &Buffers.&Previous :confirm bprev<CR>"
+  exe 'an ' .. g:bmenu_priority .. ".9 &Buffers.-SEP- :"
   unmenu &Buffers.Dummy
 
-  " figure out how many buffers there are
-  let buf = 1
+  # figure out how many buffers there are
+  var buf = 1
   while buf <= bufnr('$')
     if s:BMCanAdd(bufname(buf), buf)
-      let s:bmenu_count = s:bmenu_count + 1
+      s:bmenu_count = s:bmenu_count + 1
     endif
-    let buf = buf + 1
+    buf += 1
   endwhile
   if s:bmenu_count <= &menuitems
-    let s:bmenu_short = 0
+    s:bmenu_short = 0
   endif
 
-  " iterate through buffer list, adding each buffer to the menu:
-  let buf = 1
+  # iterate through buffer list, adding each buffer to the menu:
+  buf = 1
   while buf <= bufnr('$')
-    let name = bufname(buf)
+    var name = bufname(buf)
     if s:BMCanAdd(name, buf)
-      call <SID>BMFilename(name, buf)
+      call s:BMFilename(name, buf)
     endif
-    let buf = buf + 1
+    buf += 1
   endwhile
-  let s:bmenu_wait = 0
+  s:bmenu_wait = 0
   aug buffer_list
-  au!
-  au BufCreate,BufFilePost * call <SID>BMAdd()
-  au BufDelete,BufFilePre * call <SID>BMRemove()
+    au!
+    au BufCreate,BufFilePost * call s:BMAdd()
+    au BufDelete,BufFilePre * call s:BMRemove()
   aug END
-endfunc
+enddef
 
-func s:BMHash(name)
-  " Make name all upper case, so that chars are between 32 and 96
-  let nm = substitute(a:name, ".*", '\U\0', "")
+def s:BMHash(name: string): number
+  # Make name all upper case, so that chars are between 32 and 96
+  var nm = substitute(name, ".*", '\U\0', "")
+  var sp: number
   if has("ebcdic")
-    " HACK: Replace all non alphabetics with 'Z'
-    "       Just to make it work for now.
-    let nm = substitute(nm, "[^A-Z]", 'Z', "g")
-    let sp = char2nr('A') - 1
+    # HACK: Replace all non alphabetics with 'Z'
+    #       Just to make it work for now.
+    nm = substitute(nm, "[^A-Z]", 'Z', "g")
+    sp = char2nr('A') - 1
   else
-    let sp = char2nr(' ')
+    sp = char2nr(' ')
   endif
-  " convert first six chars into a number for sorting:
+  # convert first six chars into a number for sorting:
   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)
-endfunc
+enddef
 
-func s:BMHash2(name)
-  let nm = substitute(a:name, ".", '\L\0', "")
-  " Not exactly right for EBCDIC...
+def s:BMHash2(name: string): string
+  var nm = substitute(name, ".", '\L\0', "")
   if nm[0] < 'a' || nm[0] > 'z'
     return '&others.'
   elseif nm[0] <= 'd'
@@ -824,72 +819,70 @@ func s:BMHash2(name)
   else
     return '&u-z.'
   endif
-endfunc
+enddef
 
 " Insert a buffer name into the buffer menu.
-func s:BMFilename(name, num)
-  let munge = <SID>BMMunge(a:name, a:num)
-  let hash = <SID>BMHash(munge)
+def s:BMFilename(name: string, num: number)
+  var munge = s:BMMunge(name, num)
+  var hash = s:BMHash(munge)
+  var cmd: string
   if s:bmenu_short == 0
-    let s:bmenu_items[a:num] = munge
-    let cmd = 'an ' . g:bmenu_priority . '.' . hash . ' &Buffers.' . munge
+    s:bmenu_items[num] = munge
+    cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. ' &Buffers.' .. munge
   else
-    let menu_name = <SID>BMHash2(munge) . munge
-    let s:bmenu_items[a:num] = menu_name
-    let cmd = 'an ' . g:bmenu_priority . '.' . hash . '.' . hash . ' &Buffers.' . menu_name
+    var menu_name = s:BMHash2(munge) .. munge
+    s:bmenu_items[num] = menu_name
+    cmd = 'an ' .. g:bmenu_priority .. '.' .. hash .. '.' .. hash .. ' &Buffers.' .. menu_name
   endif
-  " set 'cpo' to include the <CR>
-  let cpo_save = &cpo
-  set cpo&vim
-  exe cmd . ' :confirm b' . a:num . '<CR>'
-  let &cpo = cpo_save
-endfunc
+  exe cmd .. ' :confirm b' .. num .. '<CR>'
+enddef
 
 " Truncate a long path to fit it in a menu item.
 if !exists("g:bmenu_max_pathlen")
   let g:bmenu_max_pathlen = 35
 endif
-func s:BMTruncName(fname)
-  let name = a:fname
+
+def s:BMTruncName(fname: string): string
+  var name = fname
   if g:bmenu_max_pathlen < 5
-    let name = ""
+    name = ""
   else
-    let len = strlen(name)
+    var len = strlen(name)
     if len > g:bmenu_max_pathlen
-      let amountl = (g:bmenu_max_pathlen / 2) - 2
-      let amountr = g:bmenu_max_pathlen - amountl - 3
-      let pattern = '^\(.\{,' . amountl . '}\).\{-}\(.\{,' . amountr . '}\)$'
-      let left = substitute(name, pattern, '\1', '')
-      let right = substitute(name, pattern, '\2', '')
+      var amountl = (g:bmenu_max_pathlen / 2) - 2
+      var amountr = g:bmenu_max_pathlen - amountl - 3
+      var pattern = '^\(.\{,' .. amountl .. '}\).\{-}\(.\{,' .. amountr .. '}\)$'
+      var left = substitute(name, pattern, '\1', '')
+      var right = substitute(name, pattern, '\2', '')
       if strlen(left) + strlen(right) < len
-	let name = left . '...' . right
+	name = left .. '...' .. right
       endif
     endif
   endif
   return name
-endfunc
+enddef
 
-func s:BMMunge(fname, bnum)
-  let name = a:fname
+def s:BMMunge(fname: string, bnum: number): string
+  var name = fname
   if name == ''
     if !exists("g:menutrans_no_file")
-      let g:menutrans_no_file = "[No Name]"
+      g:menutrans_no_file = "[No Name]"
     endif
-    let name = g:menutrans_no_file
+    name = g:menutrans_no_file
   else
-    let name = fnamemodify(name, ':p:~')
+    name = fnamemodify(name, ':p:~')
   endif
-  " detach file name and separate it out:
-  let name2 = fnamemodify(name, ':t')
-  if a:bnum >= 0
-    let name2 = name2 . ' (' . a:bnum . ')'
+  # detach file name and separate it out:
+  var name2 = fnamemodify(name, ':t')
+  if bnum >= 0
+    name2 = name2 .. ' (' .. bnum .. ')'
   endif
-  let name = name2 . "\t" . <SID>BMTruncName(fnamemodify(name,':h'))
-  let name = escape(name, "\\. \t|")
-  let name = substitute(name, "&", "&&", "g")
-  let name = substitute(name, "\n", "^@", "g")
+  name = name2 .. "\t" .. s:BMTruncName(fnamemodify(name, ':h'))
+  name = escape(name, "\\. \t|")
+  name = substitute(name, "&", "&&", "g")
+  name = substitute(name, "\n", "^@", "g")
   return name
-endfunc
+enddef
 
 " When just starting Vim, load the buffer menu later
 if has("vim_starting")
@@ -910,13 +903,13 @@ an 70.320 &Window.Sp&lit\ To\ #<Tab>^W^^
 an 70.330 &Window.Split\ &Vertically<Tab>^Wv	<C-W>v
 an <silent> 70.332 &Window.Split\ File\ E&xplorer	:call MenuExplOpen()<CR>
 if !exists("*MenuExplOpen")
-  fun MenuExplOpen()
+  def MenuExplOpen()
     if @% == ""
-      20vsp .
+      :20vsp .
     else
-      exe "20vsp " . s:FnameEscape(expand("%:p:h"))
+      exe ":20vsp " .. fnameescape(expand("%:p:h"))
     endif
-  endfun
+  enddef
 endif
 an 70.335 &Window.-SEP1-				<Nop>
 an 70.340 &Window.&Close<Tab>^Wc			:confirm close<CR>
@@ -943,8 +936,8 @@ vnoremenu 1.30 PopUp.&Copy		"+y
 cnoremenu 1.30 PopUp.&Copy		<C-Y>
 nnoremenu 1.40 PopUp.&Paste		"+gP
 cnoremenu 1.40 PopUp.&Paste		<C-R>+
-exe 'vnoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['v']
-exe 'inoremenu <script> 1.40 PopUp.&Paste	' . paste#paste_cmd['i']
+exe 'vnoremenu <script> 1.40 PopUp.&Paste	' .. paste#paste_cmd['v']
+exe 'inoremenu <script> 1.40 PopUp.&Paste	' .. paste#paste_cmd['i']
 vnoremenu 1.50 PopUp.&Delete		x
 an 1.55 PopUp.-SEP2-			<Nop>
 vnoremenu 1.60 PopUp.Select\ Blockwise	<C-V>
@@ -986,77 +979,75 @@ cnoremenu <script> <silent> 1.100 PopUp.
 if has("spell")
   " Spell suggestions in the popup menu.  Note that this will slow down the
   " appearance of the menu!
-  func s:SpellPopup()
+  def s:SpellPopup()
     if exists("s:changeitem") && s:changeitem != ''
-      call <SID>SpellDel()
+      call s:SpellDel()
     endif
 
-    " Return quickly if spell checking is not enabled.
+    # Return quickly if spell checking is not enabled.
     if !&spell || &spelllang == ''
       return
     endif
 
-    let curcol = col('.')
-    let [w, a] = spellbadword()
-    if col('.') > curcol		" don't use word after the cursor
-      let w = ''
+    var curcol = col('.')
+    var w: string
+    var a: string
+    [w, a] = spellbadword()
+    if col('.') > curcol		# don't use word after the cursor
+      w = ''
     endif
     if w != ''
       if a == 'caps'
-	let s:suglist = [substitute(w, '.*', '\u&', '')]
+	s:suglist = [substitute(w, '.*', '\u&', '')]
       else
-	let s:suglist = spellsuggest(w, 10)
+	s:suglist = spellsuggest(w, 10)
       endif
       if len(s:suglist) > 0
 	if !exists("g:menutrans_spell_change_ARG_to")
-	  let g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
+	  g:menutrans_spell_change_ARG_to = 'Change\ "%s"\ to'
 	endif
-	let s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
-	let s:fromword = w
-	let pri = 1
-	" set 'cpo' to include the <CR>
-	let cpo_save = &cpo
-	set cpo&vim
+	s:changeitem = printf(g:menutrans_spell_change_ARG_to, escape(w, ' .'))
+	s:fromword = w
+	var pri = 1
 	for sug in s:suglist
-	  exe 'anoremenu 1.5.' . pri . ' PopUp.' . s:changeitem . '.' . escape(sug, ' .')
-		\ . ' :call <SID>SpellReplace(' . pri . ')<CR>'
-	  let pri += 1
+	  exe 'anoremenu 1.5.' .. pri .. ' PopUp.' .. s:changeitem .. '.' .. escape(sug, ' .')
+		\ .. ' :call <SID>SpellReplace(' .. pri .. ')<CR>'
+	  pri += 1
 	endfor
 
 	if !exists("g:menutrans_spell_add_ARG_to_word_list")
-	  let g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
+	  g:menutrans_spell_add_ARG_to_word_list = 'Add\ "%s"\ to\ Word\ List'
 	endif
-	let s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
-	exe 'anoremenu 1.6 PopUp.' . s:additem . ' :spellgood ' . w . '<CR>'
+	s:additem = printf(g:menutrans_spell_add_ARG_to_word_list, escape(w, ' .'))
+	exe 'anoremenu 1.6 PopUp.' .. s:additem .. ' :spellgood ' .. w .. '<CR>'
 
 	if !exists("g:menutrans_spell_ignore_ARG")
-	  let g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
+	  g:menutrans_spell_ignore_ARG = 'Ignore\ "%s"'
 	endif
-	let s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
-	exe 'anoremenu 1.7 PopUp.' . s:ignoreitem . ' :spellgood! ' . w . '<CR>'
+	s:ignoreitem = printf(g:menutrans_spell_ignore_ARG, escape(w, ' .'))
+	exe 'anoremenu 1.7 PopUp.' .. s:ignoreitem .. ' :spellgood! ' .. w .. '<CR>'
 
 	anoremenu 1.8 PopUp.-SpellSep- :
-	let &cpo = cpo_save
       endif
     endif
-    call cursor(0, curcol)	" put the cursor back where it was
-  endfunc
+    call cursor(0, curcol)	# put the cursor back where it was
+  enddef
 
-  func s:SpellReplace(n)
-    let l = getline('.')
-    " Move the cursor to the start of the word.
+  def s:SpellReplace(n: number)
+    var l = getline('.')
+    # Move the cursor to the start of the word.
     call spellbadword()
-    call setline('.', strpart(l, 0, col('.') - 1) . s:suglist[a:n - 1]
-	  \ . strpart(l, col('.') + len(s:fromword) - 1))
-  endfunc
+    call setline('.', strpart(l, 0, col('.') - 1) .. s:suglist[n - 1]
+	  \ .. strpart(l, col('.') + len(s:fromword) - 1))
+  enddef
 
-  func s:SpellDel()
-    exe "aunmenu PopUp." . s:changeitem
-    exe "aunmenu PopUp." . s:additem
-    exe "aunmenu PopUp." . s:ignoreitem
+  def s:SpellDel()
+    exe "aunmenu PopUp." .. s:changeitem
+    exe "aunmenu PopUp." .. s:additem
+    exe "aunmenu PopUp." .. s:ignoreitem
     aunmenu PopUp.-SpellSep-
-    let s:changeitem = ''
-  endfun
+    s:changeitem = ''
+  enddef
 
   augroup SpellPopupMenu
     au! MenuPopup * call <SID>SpellPopup()
@@ -1089,8 +1080,8 @@ if has("toolbar")
   cnoremenu 1.80 ToolBar.Copy		<C-Y>
   nnoremenu 1.90 ToolBar.Paste		"+gP
   cnoremenu	 ToolBar.Paste		<C-R>+
-  exe 'vnoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['v']
-  exe 'inoremenu <script>	 ToolBar.Paste	' . paste#paste_cmd['i']
+  exe 'vnoremenu <script>	 ToolBar.Paste	' .. paste#paste_cmd['v']
+  exe 'inoremenu <script>	 ToolBar.Paste	' .. paste#paste_cmd['i']
 
   if !has("gui_athena")
     an 1.95   ToolBar.-sep3-		<Nop>
@@ -1108,7 +1099,7 @@ if has("toolbar")
 
   an 1.245 ToolBar.-sep6-		<Nop>
   an 1.250 ToolBar.Make			:make<CR>
-  an 1.270 ToolBar.RunCtags		:exe "!" . g:ctags_command<CR>
+  an 1.270 ToolBar.RunCtags		:exe "!" .. g:ctags_command<CR>
   an 1.280 ToolBar.TagJump		g<C-]>
 
   an 1.295 ToolBar.-sep7-		<Nop>
@@ -1145,22 +1136,23 @@ else
 endif
 
 " Select a session to load; default to current session name if present
-fun! s:LoadVimSesn()
+def s:LoadVimSesn()
+  var name: string
   if strlen(v:this_session) > 0
-    let name = s:FnameEscape(v:this_session)
+    name = fnameescape(v:this_session)
   else
-    let name = "Session.vim"
+    name = "Session.vim"
   endif
-  execute "browse so " . name
-endfun
+  execute "browse so " .. name
+enddef
 
 " Select a session to save; default to current session name if present
-fun! s:SaveVimSesn()
+def s:SaveVimSesn()
   if strlen(v:this_session) == 0
-    let v:this_session = "Session.vim"
+    v:this_session = "Session.vim"
   endif
-  execute "browse mksession! " . s:FnameEscape(v:this_session)
-endfun
+  execute "browse mksession! " .. fnameescape(v:this_session)
+enddef
 
 endif
 
@@ -1173,7 +1165,7 @@ if !exists("did_install_syntax_menu")
   an 50.214 &Syntax.A&utomatic		:syn on<CR>
   an <silent> 50.216 &Syntax.On/Off\ for\ &This\ File :call <SID>SynOnOff()<CR>
   if !exists("*s:SynOnOff")
-    fun s:SynOnOff()
+    def s:SynOnOff()
       if has("syntax_items")
 	syn clear
       else
@@ -1182,7 +1174,7 @@ if !exists("did_install_syntax_menu")
 	endif
 	set syn=ON
       endif
-    endfun
+    enddef
   endif
 endif
 
@@ -1209,6 +1201,9 @@ an 50.710 &Syntax.Co&lor\ Test		:sp $VIM
 an 50.720 &Syntax.&Highlight\ Test	:runtime syntax/hitest.vim<CR>
 an 50.730 &Syntax.&Convert\ to\ HTML	:runtime syntax/2html.vim<CR>
 
+" Uncomment this to compile the functions early to find any mistakes
+defcompile
+
 endif " !exists("did_install_syntax_menu")
 
 " Restore the previous value of 'cpoptions'.