From 57fa9add79faa1c34d71bf19f1c0cd0380059954 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 29 Jul 2019 03:16:37 +0200 Subject: [PATCH] vim-patch:314dd79cac2a Update runtime files. https://github.com/vim/vim/commit/314dd79cac2adc10304212d1980d23ecf6782cfc --- runtime/autoload/paste.vim | 46 +- runtime/bugreport.vim | 2 +- runtime/doc/eval.txt | 7 - runtime/doc/options.txt | 10 +- runtime/doc/pi_matchit.txt | 16 +- runtime/doc/usr_05.txt | 58 +-- runtime/doc/usr_11.txt | 2 +- runtime/doc/usr_41.txt | 2 +- runtime/filetype.vim | 3 +- runtime/indent/sh.vim | 30 +- runtime/indent/xml.vim | 13 +- runtime/menu.vim | 22 +- runtime/optwin.vim | 74 ++- runtime/plugin/matchit.vim | 802 ++------------------------------ runtime/syntax/debchangelog.vim | 4 +- 15 files changed, 173 insertions(+), 918 deletions(-) diff --git a/runtime/autoload/paste.vim b/runtime/autoload/paste.vim index dd7b3ae54a..2d787e7a1d 100644 --- a/runtime/autoload/paste.vim +++ b/runtime/autoload/paste.vim @@ -1,35 +1,25 @@ " Vim support file to help with paste mappings and menus " Maintainer: Bram Moolenaar -" Last Change: 2017 Aug 30 +" Last Change: 2019 Jan 27 " Define the string to use for items that are present both in Edit, Popup and " Toolbar menu. Also used in mswin.vim and macmap.vim. -" Pasting blockwise and linewise selections is not possible in Insert and -" Visual mode without the +virtualedit feature. They are pasted as if they -" were characterwise instead. Add to that some tricks to leave the cursor in -" the right position, also for "gi". -if has("virtualedit") - let paste#paste_cmd = {'n': ":call paste#Paste()"} - let paste#paste_cmd['v'] = '"-c' . paste#paste_cmd['n'] - let paste#paste_cmd['i'] = "\\\"+gP" +let paste#paste_cmd = {'n': ":call paste#Paste()"} +let paste#paste_cmd['v'] = '"-c' . paste#paste_cmd['n'] +let paste#paste_cmd['i'] = "\\\"+gP" - func! paste#Paste() - let ove = &ve - set ve=all - normal! `^ - if @+ != '' - normal! "+gP - endif - let c = col(".") - normal! i - if col(".") < c " compensate for i moving the cursor left - normal! l - endif - let &ve = ove - endfunc -else - let paste#paste_cmd = {'n': "\"=@+.'xy'gPFx\"_2x"} - let paste#paste_cmd['v'] = '"-cgix' . paste#paste_cmd['n'] . '"_x' - let paste#paste_cmd['i'] = 'x' . paste#paste_cmd['n'] . '"_s' -endif +func! paste#Paste() + let ove = &ve + set ve=all + normal! `^ + if @+ != '' + normal! "+gP + endif + let c = col(".") + normal! i + if col(".") < c " compensate for i moving the cursor left + normal! l + endif + let &ve = ove +endfunc diff --git a/runtime/bugreport.vim b/runtime/bugreport.vim index 650e37940d..27761ca011 100644 --- a/runtime/bugreport.vim +++ b/runtime/bugreport.vim @@ -2,7 +2,7 @@ :" information about the environment of a possible bug in Vim. :" :" Maintainer: Bram Moolenaar -:" Last change: 2005 Jun 12 +:" Last change: 2019 Jan 27 :" :" To use inside Vim: :" :so $VIMRUNTIME/bugreport.vim diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index c73bd40cb6..1a5268faf3 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -5505,13 +5505,6 @@ line({expr}) The result is a Number, which is the line number of the file line(".") line number of the cursor line("'t") line number of mark t line("'" . marker) line number of mark marker -< *last-position-jump* - This autocommand jumps to the last known position in a file - just after opening it, if the '" mark is set: > - :au BufReadPost * - \ if line("'\"") > 1 && line("'\"") <= line("$") && &ft !~# 'commit' - \ | exe "normal! g`\"" - \ | endif line2byte({lnum}) *line2byte()* Return the byte count from the start of the buffer for line diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt index f27edef412..d0ead3c256 100644 --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -295,12 +295,12 @@ files. You use this command: > :setlocal makeprg=perlmake You can switch back to using the global value by making the local value empty: > :setlocal makeprg= -This only works for a string option. For a boolean option you need to use the -"<" flag, like this: > +This only works for a string option. For a number or boolean option you need +to use the "<" flag, like this: > :setlocal autoread< -Note that for non-boolean options using "<" copies the global value to the -local value, it doesn't switch back to using the global value (that matters -when the global value changes later). You can also use: > +Note that for non-boolean and non-number options using "<" copies the global +value to the local value, it doesn't switch back to using the global value +(that matters when the global value changes later). You can also use: > :set path< This will make the local value of 'path' empty, so that the global value is used. Thus it does the same as: > diff --git a/runtime/doc/pi_matchit.txt b/runtime/doc/pi_matchit.txt index 69d2fea0db..87dd72a54c 100644 --- a/runtime/doc/pi_matchit.txt +++ b/runtime/doc/pi_matchit.txt @@ -1,6 +1,6 @@ *pi_matchit.txt* Extended "%" matching -For Vim version 6.3. Last change: 2018 Dec 31 +For Vim version 8.1. Last change: 2019 Jan 28 *matchit* *matchit.vim* @@ -62,12 +62,8 @@ for how to specify matching patterns. MODES: *matchit-modes* *matchit-v_%* *matchit-o_%* -Mostly, % and related motions (|g%| and |[%| and |]%|) work just like built-in -motion commands in |Operator-pending| and |Visual| modes. However, you -cannot make these motions |linewise| or |characterwise|, since the |:omap|s -that define them start with "v" in order to make the default behavior -inclusive. (See |o_v|.) In other words, "dV%" will not work. The -work-around is to go through Visual mode: "V%d" will work. +Mostly, % and related motions (|g%| and |[%| and |]%|) should just work like built-in +|motion| commands in |Operator-pending| and |Visual| modes (as of 8.1.648) LANGUAGES: *matchit-languages* @@ -353,12 +349,6 @@ The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in ============================================================================== 5. Known Bugs and Limitations *matchit-bugs* -The various |:vmap|s defined in the script (%, |g%|, |[%|, |]%|, |a%|) may -have undesired effects in Select mode |Select-mode-mapping|. At least, if you -want to replace the selection with any character in "ag%[]" there will be a -pause of |'updatetime'| first. E.g., "yV%" would normally work linewise, but -the plugin mapping makes it characterwise. - It would be nice if "\0" were recognized as the entire pattern. That is, it would be nice if "foo:\end\0" had the same effect as "\(foo\):\end\1". diff --git a/runtime/doc/usr_05.txt b/runtime/doc/usr_05.txt index af17d75656..d85be4ccae 100644 --- a/runtime/doc/usr_05.txt +++ b/runtime/doc/usr_05.txt @@ -11,12 +11,13 @@ Vim's capabilities. Or define your own macros. |05.1| The vimrc file |05.2| The example vimrc file explained -|05.3| Simple mappings -|05.4| Adding a package -|05.5| Adding a plugin -|05.6| Adding a help file -|05.7| The option window -|05.8| Often used options +|05.3| The defaults.vim file explained +|05.4| Simple mappings +|05.5| Adding a package +|05.6| Adding a plugin +|05.7| Adding a help file +|05.8| The option window +|05.9| Often used options Next chapter: |usr_06.txt| Using syntax highlighting Previous chapter: |usr_04.txt| Making small changes @@ -172,21 +173,12 @@ This switches on three very clever mechanisms: automatically. Vim comes with these indent rules for a number of filetypes. See |:filetype-indent-on| and 'indentexpr'. -> - autocmd FileType text setlocal textwidth=78 -This makes Vim break text to avoid lines getting longer than 78 characters. -But only for files that have been detected to be plain text. There are -actually two parts here. "autocmd FileType text" is an autocommand. This -defines that when the file type is set to "text" the following command is -automatically executed. "setlocal textwidth=78" sets the 'textwidth' option -to 78, but only locally in one file. - - *restore-cursor* > - autocmd BufReadPost * - \ if line("'\"") > 1 && line("'\"") <= line("$") | - \ exe "normal! g`\"" | - \ endif + *restore-cursor* *last-position-jump* > + autocmd BufReadPost * + \ if line("'\"") >= 1 && line("'\"") <= line("$") && &ft !~# 'commit' + \ | exe "normal! g`\"" + \ | endif Another autocommand. This time it is used after reading any file. The complicated stuff after it checks if the '" mark is defined, and jumps to it @@ -195,8 +187,22 @@ from the previous line. That avoids a line getting very long. See |line-continuation|. This only works in a Vim script file, not when typing commands at the command-line. +> + command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ | diffthis + \ | wincmd p | diffthis + +This adds the ":DiffOrig" command. Use this in a modified buffer to see the +differences with the file it was loaded from. See |diff|. + +> + set nolangremap + +Prevent that the langmap option applies to characters that result from a +mapping. If set (default), this may break plugins (but it's backward +compatible). See 'langremap'. + ============================================================================== -*05.3* Simple mappings +*05.4* Simple mappings A mapping enables you to bind a set of Vim commands to a single key. Suppose, for example, that you need to surround certain words with curly braces. In @@ -243,7 +249,7 @@ The ":map" command (with no arguments) lists your current mappings. At least the ones for Normal mode. More about mappings in section |40.1|. ============================================================================== -*05.4* Adding a package *add-package* *vimball-install* +*05.5* Adding a package *add-package* *vimball-install* A package is a set of files that you can add to Vim. There are two kinds of packages: optional and automatically loaded on startup. @@ -283,7 +289,7 @@ an archive or as a repository. For an archive you can follow these steps: More information about packages can be found here: |packages|. ============================================================================== -*05.5* Adding a plugin *add-plugin* *plugin* +*05.6* Adding a plugin *add-plugin* *plugin* Vim's functionality can be extended by adding plugins. A plugin is nothing more than a Vim script file that is loaded automatically when Vim starts. You @@ -420,7 +426,7 @@ Further reading: |new-filetype| How to detect a new file type. ============================================================================== -*05.6* Adding a help file *add-local-help* +*05.7* Adding a help file *add-local-help* If you are lucky, the plugin you installed also comes with a help file. We will explain how to install the help file, so that you can easily find help @@ -453,7 +459,7 @@ them through the tag. For writing a local help file, see |write-local-help|. ============================================================================== -*05.7* The option window +*05.8* The option window If you are looking for an option that does what you want, you can search in the help files here: |options|. Another way is by using this command: > @@ -492,7 +498,7 @@ border. This is what the 'scrolloff' option does, it specifies an offset from the window border where scrolling starts. ============================================================================== -*05.8* Often used options +*05.9* Often used options There are an awful lot of options. Most of them you will hardly ever use. Some of the more useful ones will be mentioned here. Don't forget you can diff --git a/runtime/doc/usr_11.txt b/runtime/doc/usr_11.txt index 42b564e962..c26f1e8f09 100644 --- a/runtime/doc/usr_11.txt +++ b/runtime/doc/usr_11.txt @@ -120,7 +120,7 @@ the resulting files if they are what you expected. USING A SPECIFIC SWAP FILE If you know which swap file needs to be used, you can recover by giving the -swap file name. Vim will then finds out the name of the original file from +swap file name. Vim will then find out the name of the original file from the swap file. Example: > diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt index eb50dc421a..2c38c6fef2 100644 --- a/runtime/doc/usr_41.txt +++ b/runtime/doc/usr_41.txt @@ -770,7 +770,7 @@ System functions and manipulation of files: systemlist() get the result of a shell command as a list hostname() name of the system readfile() read a file into a List of lines - writefile() write a List of lines into a file + writefile() write a List of lines or Blob into a file Date and Time: *date-functions* *time-functions* getftime() get last modification time of a file diff --git a/runtime/filetype.vim b/runtime/filetype.vim index 49dcea7011..9c92023e93 100644 --- a/runtime/filetype.vim +++ b/runtime/filetype.vim @@ -1,7 +1,7 @@ " Vim support file to detect file types " " Maintainer: Bram Moolenaar -" Last Change: 2019 Jan 18 +" Last Change: 2019 Jan 28 " Listen very carefully, I will say this only once if exists("did_load_filetypes") @@ -93,6 +93,7 @@ au BufNewFile,BufRead proftpd.conf* call s:StarSetf('apachestyle') " Apache config file au BufNewFile,BufRead .htaccess,*/etc/httpd/*.conf setf apache +au BufNewFile,BufRead */etc/apache2/sites-*/*.com setf apache " XA65 MOS6510 cross assembler au BufNewFile,BufRead *.a65 setf a65 diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim index 32bc9f35bb..c93be31958 100644 --- a/runtime/indent/sh.vim +++ b/runtime/indent/sh.vim @@ -3,10 +3,11 @@ " Maintainer: Christian Brabandt " Original Author: Nikolai Weibull " Previous Maintainer: Peter Aronoff -" Latest Revision: 2018-03-26 +" Latest Revision: 2019-02-02 " License: Vim (see :h license) " Repository: https://github.com/chrisbra/vim-sh-indent " Changelog: +" 20190201 - Better check for closing if sections " 20180724 - make check for zsh syntax more rigid (needs word-boundaries) " 20180326 - better support for line continuation " 20180325 - better detection of function definitions @@ -59,6 +60,7 @@ function! s:indent_value(option) endfunction function! GetShIndent() + let curline = getline(v:lnum) let lnum = prevnonblank(v:lnum - 1) if lnum == 0 return 0 @@ -72,7 +74,7 @@ function! GetShIndent() " Check contents of previous lines if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' || \ (&ft is# 'zsh' && line =~ '\<\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>') - if line !~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$' + if !s:is_end_expression(line) let ind += s:indent_value('default') endif elseif s:is_case_label(line, pnum) @@ -90,7 +92,10 @@ function! GetShIndent() endif elseif s:end_block(line) && !s:start_block(line) let ind -= s:indent_value('default') - elseif pnum != 0 && s:is_continuation_line(pline) && !s:end_block(getline(v:lnum)) + elseif pnum != 0 && + \ s:is_continuation_line(pline) && + \ !s:end_block(curline) && + \ !s:is_end_expression(curline) " only add indent, if line and pline is in the same block let i = v:lnum let ind2 = indent(s:find_continued_lnum(pnum)) @@ -106,8 +111,15 @@ function! GetShIndent() let pine = line " Check content of current line - let line = getline(v:lnum) - if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || s:end_block(line) + let line = curline + " Current line is a endif line, so get indent from start of "if condition" line + " TODO: should we do the same for other "end" lines? + if curline =~ '^\s*\%(fi\)\s*\%(#.*\)\=$' + let previous_line = search('if.\{-\};\s*then\s*\%(#.*\)\=$', 'bnW') + if previous_line > 0 + let ind = indent(previous_line) + endif + elseif line =~ '^\s*\%(then\|do\|else\|elif\|done\|end\)\>' || s:end_block(line) let ind -= s:indent_value('default') elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1)) let ind -= s:indent_value('default') @@ -210,8 +222,8 @@ endfunction function! s:is_here_doc(line) if a:line =~ '^\w\+$' - let here_pat = '<<-\?'. s:escape(a:line). '\$' - return search(here_pat, 'bnW') > 0 + let here_pat = '<<-\?'. s:escape(a:line). '\$' + return search(here_pat, 'bnW') > 0 endif return 0 endfunction @@ -256,5 +268,9 @@ function! s:is_comment(line) return a:line =~ '^\s*#' endfunction +function! s:is_end_expression(line) + return a:line =~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$' +endfunction + let &cpo = s:cpo_save unlet s:cpo_save diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim index bc64aacfe1..29069bab84 100644 --- a/runtime/indent/xml.vim +++ b/runtime/indent/xml.vim @@ -1,9 +1,11 @@ " Language: xml " Repository: https://github.com/chrisbra/vim-xml-ftplugin -" Last Changed: Dec 07th, 2018 +" Last Changed: Jan 28, 2019 " Maintainer: Christian Brabandt " Previous Maintainer: Johannes Zellner " Last Change: +" 20190128 - Make sure to find previous tag +" https://github.com/chrisbra/vim-xml-ftplugin/issues/4 " 20181116 - Fix indentation when tags start with a colon or an underscore " https://github.com/vim/vim/pull/926 " 20181022 - Do not overwrite indentkeys setting @@ -88,15 +90,16 @@ endfun fun! XmlIndentGet(lnum, use_syntax_check) " Find a non-empty line above the current line. let plnum = prevnonblank(a:lnum - 1) - " Find previous line with a tag (regardless whether open or closed) - let ptag = search('.\{-}<[/:A-Z_a-z]', 'bnw') - " Hit the start of the file, use zero indent. if plnum == 0 return 0 endif - let syn_name = '' + " Find previous line with a tag (regardless whether open or closed, + " but always start restrict the match to a line before the current one + let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. line('.').'l\)' + let ptag = search(ptag_pattern, 'bnw') + let syn_name = '' if a:use_syntax_check let check_lnum = XmlIndentSynCheck(plnum) let check_alnum = XmlIndentSynCheck(a:lnum) diff --git a/runtime/menu.vim b/runtime/menu.vim index 5e4bd1f11b..3756787e7f 100644 --- 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 -" Last Change: 2018 May 17 +" Last Change: 2019 Jan 27 " 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. @@ -853,17 +853,15 @@ an 70.300 &Window.&New^Wn n an 70.310 &Window.S&plit^Ws s an 70.320 &Window.Sp&lit\ To\ #^W^^ an 70.330 &Window.Split\ &Vertically^Wv v -if has("vertsplit") - an 70.332 &Window.Split\ File\ E&xplorer :call MenuExplOpen() - if !exists("*MenuExplOpen") - fun MenuExplOpen() - if @% == "" - 20vsp . - else - exe "20vsp " . s:FnameEscape(expand("%:p:h")) - endif - endfun - endif +an 70.332 &Window.Split\ File\ E&xplorer :call MenuExplOpen() +if !exists("*MenuExplOpen") + fun MenuExplOpen() + if @% == "" + 20vsp . + else + exe "20vsp " . s:FnameEscape(expand("%:p:h")) + endif + endfun endif an 70.335 &Window.-SEP1- an 70.340 &Window.&Close^Wc :confirm close diff --git a/runtime/optwin.vim b/runtime/optwin.vim index f3d7d3729b..a590cf8bfc 100644 --- a/runtime/optwin.vim +++ b/runtime/optwin.vim @@ -1,7 +1,7 @@ " These commands create the option window. " " Maintainer: Bram Moolenaar -" Last Change: 2018 May 15 +" Last Change: 2019 Jan 27 " If there already is an option window, jump to that one. let buf = bufnr('option-window') @@ -395,11 +395,9 @@ endif call Header("syntax, highlighting and spelling") call append("$", "background\t\"dark\" or \"light\"; the background color brightness") call OptionG("bg", &bg) -if has("autocmd") - call append("$", "filetype\ttype of file; triggers the FileType event when set") - call append("$", "\t(local to buffer)") - call OptionL("ft") -endif +call append("$", "filetype\ttype of file; triggers the FileType event when set") +call append("$", "\t(local to buffer)") +call OptionL("ft") if has("syntax") call append("$", "syntax\tname of syntax highlighting used") call append("$", "\t(local to buffer)") @@ -454,10 +452,8 @@ if has("statusline") endif call append("$", "equalalways\tmake all windows the same size when adding/removing windows") call BinOptionG("ea", &ea) -if has("vertsplit") - call append("$", "eadirection\tin which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"") - call OptionG("ead", &ead) -endif +call append("$", "eadirection\tin which direction 'equalalways' works: \"ver\", \"hor\" or \"both\"") +call OptionG("ead", &ead) call append("$", "winheight\tminimal number of lines used for the current window") call append("$", " \tset wh=" . &wh) call append("$", "winminheight\tminimal number of lines used for any window") @@ -465,15 +461,13 @@ call append("$", " \tset wmh=" . &wmh) call append("$", "winfixheight\tkeep the height of the window") call append("$", "\t(local to window)") call BinOptionL("wfh") -if has("vertsplit") call append("$", "winfixwidth\tkeep the width of the window") call append("$", "\t(local to window)") call BinOptionL("wfw") - call append("$", "winwidth\tminimal number of columns used for the current window") - call append("$", " \tset wiw=" . &wiw) - call append("$", "winminwidth\tminimal number of columns used for any window") - call append("$", " \tset wmw=" . &wmw) -endif +call append("$", "winwidth\tminimal number of columns used for the current window") +call append("$", " \tset wiw=" . &wiw) +call append("$", "winminwidth\tminimal number of columns used for any window") +call append("$", " \tset wmw=" . &wmw) call append("$", "helpheight\tinitial height of the help window") call append("$", " \tset hh=" . &hh) if has("quickfix") @@ -490,22 +484,16 @@ call append("$", "\tto a buffer") call OptionG("swb", &swb) call append("$", "splitbelow\ta new window is put below the current one") call BinOptionG("sb", &sb) -if has("vertsplit") - call append("$", "splitright\ta new window is put right of the current one") - call BinOptionG("spr", &spr) -endif -if has("scrollbind") - call append("$", "scrollbind\tthis window scrolls together with other bound windows") - call append("$", "\t(local to window)") - call BinOptionL("scb") - call append("$", "scrollopt\t\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'") - call OptionG("sbo", &sbo) -endif -if has("cursorbind") - call append("$", "cursorbind\tthis window's cursor moves together with other bound windows") - call append("$", "\t(local to window)") - call BinOptionL("crb") -endif +call append("$", "splitright\ta new window is put right of the current one") +call BinOptionG("spr", &spr) +call append("$", "scrollbind\tthis window scrolls together with other bound windows") +call append("$", "\t(local to window)") +call BinOptionL("scb") +call append("$", "scrollopt\t\"ver\", \"hor\" and/or \"jump\"; list of options for 'scrollbind'") +call OptionG("sbo", &sbo) +call append("$", "cursorbind\tthis window's cursor moves together with other bound windows") +call append("$", "\t(local to window)") +call BinOptionL("crb") if has("terminal") call append("$", "termsize\tsize of a terminal window") call append("$", "\t(local to window)") @@ -1040,12 +1028,10 @@ if has("wildmenu") call append("$", "wildmenu\tcommand-line completion shows a list of matches") call BinOptionG("wmnu", &wmnu) endif -if has("vertsplit") - call append("$", "cedit\tkey used to open the command-line window") - call OptionG("cedit", &cedit) - call append("$", "cmdwinheight\theight of the command-line window") - call OptionG("cwh", &cwh) -endif +call append("$", "cedit\tkey used to open the command-line window") +call OptionG("cedit", &cedit) +call append("$", "cmdwinheight\theight of the command-line window") +call OptionG("cwh", &cwh) call Header("executing external commands") @@ -1208,14 +1194,10 @@ endif call Header("various") -if has("virtualedit") - call append("$", "virtualedit\twhen to use virtual editing: \"block\", \"insert\" and/or \"all\"") - call OptionG("ve", &ve) -endif -if has("autocmd") - call append("$", "eventignore\tlist of autocommand events which are to be ignored") - call OptionG("ei", &ei) -endif +call append("$", "virtualedit\twhen to use virtual editing: \"block\", \"insert\" and/or \"all\"") +call OptionG("ve", &ve) +call append("$", "eventignore\tlist of autocommand events which are to be ignored") +call OptionG("ei", &ei) call append("$", "loadplugins\tload plugin scripts when starting up") call BinOptionG("lpl", &lpl) call append("$", "exrc\tenable reading .vimrc/.exrc/.gvimrc in the current directory") diff --git a/runtime/plugin/matchit.vim b/runtime/plugin/matchit.vim index f4233730b3..84147f1fc8 100644 --- a/runtime/plugin/matchit.vim +++ b/runtime/plugin/matchit.vim @@ -1,14 +1,13 @@ " matchit.vim: (global plugin) Extended "%" matching -" Last Change: 2018 Dec 31 -" Maintainer: Benji Fisher PhD -" Version: 1.13.3, for Vim 6.3+ -" Fix from Tommy Allen included. -" Fix from Fernando Torres included. -" Improvement from Ken Takata included. -" URL: http://www.vim.org/script.php?script_id=39 +" Maintainer: Christian Brabandt +" Version: 1.15 +" Last Change: 2019 Jan 28 +" Repository: https://github.com/chrisbra/matchit +" Previous URL:http://www.vim.org/script.php?script_id=39 +" Previous Maintainer: Benji Fisher PhD " Documentation: -" The documentation is in a separate file, matchit.txt . +" The documentation is in a separate file: ../doc/matchit.txt . " Credits: " Vim editor by Bram Moolenaar (Thanks, Bram!) @@ -39,778 +38,55 @@ " work but extend it. " Allow user to prevent loading and prevent duplicate loading. -if exists("loaded_matchit") || &cp +if exists("g:loaded_matchit") || &cp finish endif -let loaded_matchit = 1 -let s:last_mps = "" -let s:last_words = ":" -let s:patBR = "" +let g:loaded_matchit = 1 let s:save_cpo = &cpo set cpo&vim -nnoremap % :call Match_wrapper('',1,'n') -nnoremap g% :call Match_wrapper('',0,'n') -vnoremap % :call Match_wrapper('',1,'v') m'gv`` -vnoremap g% :call Match_wrapper('',0,'v') m'gv`` -onoremap % v:call Match_wrapper('',1,'o') -onoremap g% v:call Match_wrapper('',0,'o') +nnoremap (MatchitNormalForward) :call matchit#Match_wrapper('',1,'n') +nnoremap (MatchitNormalBackward) :call matchit#Match_wrapper('',0,'n') +vnoremap (MatchitVisualForward) :call matchit#Match_wrapper('',1,'v')m'gv`` +vnoremap (MatchitVisualBackward) :call matchit#Match_wrapper('',0,'v')m'gv`` +onoremap (MatchitOperationForward) :call matchit#Match_wrapper('',1,'o') +onoremap (MatchitOperationBackward) :call matchit#Match_wrapper('',0,'o') + +nmap % (MatchitNormalForward) +nmap g% (MatchitNormalBackward) +xmap % (MatchitVisualForward) +xmap g% (MatchitVisualBackward) +omap % (MatchitOperationForward) +omap g% (MatchitOperationBackward) " Analogues of [{ and ]} using matching patterns: -nnoremap [% :call MultiMatch("bW", "n") -nnoremap ]% :call MultiMatch("W", "n") -vmap [% [%m'gv`` -vmap ]% ]%m'gv`` -" vnoremap [% :call MultiMatch("bW", "v") m'gv`` -" vnoremap ]% :call MultiMatch("W", "v") m'gv`` -onoremap [% v:call MultiMatch("bW", "o") -onoremap ]% v:call MultiMatch("W", "o") +nnoremap (MatchitNormalMultiBackward) :call matchit#MultiMatch("bW", "n") +nnoremap (MatchitNormalMultiForward) :call matchit#MultiMatch("W", "n") +vnoremap (MatchitVisualMultiBackward) :call matchit#MultiMatch("bW", "n")m'gv`` +vnoremap (MatchitVisualMultiForward) :call matchit#MultiMatch("W", "n")m'gv`` +onoremap (MatchitOperationMultiBackward) :call matchit#MultiMatch("bW", "o") +onoremap (MatchitOperationMultiForward) :call matchit#MultiMatch("W", "o") + +nmap [% (MatchitNormalMultiBackward) +nmap ]% (MatchitNormalMultiForward) +xmap [% (MatchitVisualMultiBackward) +xmap ]% (MatchitVisualMultiForward) +omap [% (MatchitOperationMultiBackward) +omap ]% (MatchitOperationMultiForward) " text object: -vmap a% [%v]% - -" Auto-complete mappings: (not yet "ready for prime time") -" TODO Read :help write-plugin for the "right" way to let the user -" specify a key binding. -" let g:match_auto = '' -" let g:match_autoCR = '' -" if exists("g:match_auto") -" execute "inoremap " . g:match_auto . ' x"=Autocomplete()Pls' -" endif -" if exists("g:match_autoCR") -" execute "inoremap " . g:match_autoCR . ' =Autocomplete()' -" endif -" if exists("g:match_gthhoh") -" execute "inoremap " . g:match_gthhoh . ' :call Gthhoh()' -" endif " gthhoh = "Get the heck out of here!" - -let s:notslash = '\\\@" - endif - " In s:CleanUp(), we may need to check whether the cursor moved forward. - let startline = line(".") - let startcol = col(".") - " Use default behavior if called with a count. - if v:count - exe "normal! " . v:count . "%" - return s:CleanUp(restore_options, a:mode, startline, startcol) - end - - " First step: if not already done, set the script variables - " s:do_BR flag for whether there are backrefs - " s:pat parsed version of b:match_words - " s:all regexp based on s:pat and the default groups - " - if !exists("b:match_words") || b:match_words == "" - let match_words = "" - " Allow b:match_words = "GetVimMatchWords()" . - elseif b:match_words =~ ":" - let match_words = b:match_words - else - execute "let match_words =" b:match_words - endif -" Thanks to Preben "Peppe" Guldberg and Bram Moolenaar for this suggestion! - if (match_words != s:last_words) || (&mps != s:last_mps) - \ || exists("b:match_debug") - let s:last_mps = &mps - " The next several lines were here before - " BF started messing with this script. - " quote the special chars in 'matchpairs', replace [,:] with \| and then - " append the builtin pairs (/*, */, #if, #ifdef, #else, #elif, #endif) - " let default = substitute(escape(&mps, '[$^.*~\\/?]'), '[,:]\+', - " \ '\\|', 'g').'\|\/\*\|\*\/\|#if\>\|#ifdef\>\|#else\>\|#elif\>\|#endif\>' - let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . - \ '\/\*:\*\/,#\s*if\%(def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>' - " s:all = pattern with all the keywords - let match_words = match_words . (strlen(match_words) ? "," : "") . default - let s:last_words = match_words - if match_words !~ s:notslash . '\\\d' - let s:do_BR = 0 - let s:pat = match_words - else - let s:do_BR = 1 - let s:pat = s:ParseWords(match_words) - endif - let s:all = substitute(s:pat, s:notslash . '\zs[,:]\+', '\\|', 'g') - let s:all = '\%(' . s:all . '\)' - " let s:all = '\%(' . substitute(s:all, '\\\ze[,:]', '', 'g') . '\)' - if exists("b:match_debug") - let b:match_pat = s:pat - endif - " Reconstruct the version with unresolved backrefs. - let s:patBR = substitute(match_words.',', - \ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') - let s:patBR = substitute(s:patBR, s:notslash.'\zs:\{2,}', ':', 'g') - endif - - " Second step: set the following local variables: - " matchline = line on which the cursor started - " curcol = number of characters before match - " prefix = regexp for start of line to start of match - " suffix = regexp for end of match to end of line - " Require match to end on or after the cursor and prefer it to - " start on or before the cursor. - let matchline = getline(startline) - if a:word != '' - " word given - if a:word !~ s:all - echohl WarningMsg|echo 'Missing rule for word:"'.a:word.'"'|echohl NONE - return s:CleanUp(restore_options, a:mode, startline, startcol) - endif - let matchline = a:word - let curcol = 0 - let prefix = '^\%(' - let suffix = '\)$' - " Now the case when "word" is not given - else " Find the match that ends on or after the cursor and set curcol. - let regexp = s:Wholematch(matchline, s:all, startcol-1) - let curcol = match(matchline, regexp) - " If there is no match, give up. - if curcol == -1 - return s:CleanUp(restore_options, a:mode, startline, startcol) - endif - let endcol = matchend(matchline, regexp) - let suf = strlen(matchline) - endcol - let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') - let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') - endif - if exists("b:match_debug") - let b:match_match = matchstr(matchline, regexp) - let b:match_col = curcol+1 - endif - - " Third step: Find the group and single word that match, and the original - " (backref) versions of these. Then, resolve the backrefs. - " Set the following local variable: - " group = colon-separated list of patterns, one of which matches - " = ini:mid:fin or ini:fin - " - " Now, set group and groupBR to the matching group: 'if:endif' or - " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns - " group . "," . groupBR, and we pick it apart. - let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, s:patBR) - let i = matchend(group, s:notslash . ",") - let groupBR = strpart(group, i) - let group = strpart(group, 0, i-1) - " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix - if s:do_BR " Do the hard part: resolve those backrefs! - let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) - endif - if exists("b:match_debug") - let b:match_wholeBR = groupBR - let i = matchend(groupBR, s:notslash . ":") - let b:match_iniBR = strpart(groupBR, 0, i-1) - endif - - " Fourth step: Set the arguments for searchpair(). - let i = matchend(group, s:notslash . ":") - let j = matchend(group, '.*' . s:notslash . ":") - let ini = strpart(group, 0, i-1) - let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') - let fin = strpart(group, j) - "Un-escape the remaining , and : characters. - let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') - let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') - let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') - " searchpair() requires that these patterns avoid \(\) groups. - let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') - let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') - let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') - " Set mid. This is optimized for readability, not micro-efficiency! - if a:forward && matchline =~ prefix . fin . suffix - \ || !a:forward && matchline =~ prefix . ini . suffix - let mid = "" - endif - " Set flag. This is optimized for readability, not micro-efficiency! - if a:forward && matchline =~ prefix . fin . suffix - \ || !a:forward && matchline !~ prefix . ini . suffix - let flag = "bW" - else - let flag = "W" - endif - " Set skip. - if exists("b:match_skip") - let skip = b:match_skip - elseif exists("b:match_comment") " backwards compatibility and testing! - let skip = "r:" . b:match_comment - else - let skip = 's:comment\|string' - endif - let skip = s:ParseSkip(skip) - if exists("b:match_debug") - let b:match_ini = ini - let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin - endif - - " Fifth step: actually start moving the cursor and call searchpair(). - " Later, :execute restore_cursor to get to the original screen. - let view = winsaveview() - call cursor(0, curcol + 1) - " normal! 0 - " if curcol - " execute "normal!" . curcol . "l" - " endif - if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) - let skip = '0' - else - execute "if " . skip . "| let skip = '0' | endif" - endif - let sp_return = searchpair(ini, mid, fin, flag, skip) - let final_position = "call cursor(" . line(".") . "," . col(".") . ")" - " Restore cursor position and original screen. - call winrestview(view) - normal! m' - if sp_return > 0 - execute final_position - endif - return s:CleanUp(restore_options, a:mode, startline, startcol, mid.'\|'.fin) -endfun - -" Restore options and do some special handling for Operator-pending mode. -" The optional argument is the tail of the matching group. -fun! s:CleanUp(options, mode, startline, startcol, ...) - if strlen(a:options) - execute "set" a:options - endif - " Open folds, if appropriate. - if a:mode != "o" - if &foldopen =~ "percent" - normal! zv - endif - " In Operator-pending mode, we want to include the whole match - " (for example, d%). - " This is only a problem if we end up moving in the forward direction. - elseif (a:startline < line(".")) || - \ (a:startline == line(".") && a:startcol < col(".")) - if a:0 - " Check whether the match is a single character. If not, move to the - " end of the match. - let matchline = getline(".") - let currcol = col(".") - let regexp = s:Wholematch(matchline, a:1, currcol-1) - let endcol = matchend(matchline, regexp) - if endcol > currcol " This is NOT off by one! - call cursor(0, endcol) - endif - endif " a:0 - endif " a:mode != "o" && etc. - return 0 -endfun - -" Example (simplified HTML patterns): if -" a:groupBR = '<\(\k\+\)>:' -" a:prefix = '^.\{3}\(' -" a:group = '<\(\k\+\)>:' -" a:suffix = '\).\{2}$' -" a:matchline = "12312" or "12312" -" then extract "tag" from a:matchline and return ":" . -fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) - if a:matchline !~ a:prefix . - \ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix - return a:group - endif - let i = matchend(a:groupBR, s:notslash . ':') - let ini = strpart(a:groupBR, 0, i-1) - let tailBR = strpart(a:groupBR, i) - let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, - \ a:groupBR) - let i = matchend(word, s:notslash . ":") - let wordBR = strpart(word, i) - let word = strpart(word, 0, i-1) - " Now, a:matchline =~ a:prefix . word . a:suffix - if wordBR != ini - let table = s:Resolve(ini, wordBR, "table") - else - " let table = "----------" - let table = "" - let d = 0 - while d < 10 - if tailBR =~ s:notslash . '\\' . d - " let table[d] = d - let table = table . d - else - let table = table . "-" - endif - let d = d + 1 - endwhile - endif - let d = 9 - while d - if table[d] != "-" - let backref = substitute(a:matchline, a:prefix.word.a:suffix, - \ '\'.table[d], "") - " Are there any other characters that should be escaped? - let backref = escape(backref, '*,:') - execute s:Ref(ini, d, "start", "len") - let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) - let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, - \ escape(backref, '\\&'), 'g') - endif - let d = d-1 - endwhile - if exists("b:match_debug") - if s:do_BR - let b:match_table = table - let b:match_word = word - else - let b:match_table = "" - let b:match_word = "" - endif - endif - return ini . ":" . tailBR -endfun - -" Input a comma-separated list of groups with backrefs, such as -" a:groups = '\(foo\):end\1,\(bar\):end\1' -" and return a comma-separated list of groups with backrefs replaced: -" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' -fun! s:ParseWords(groups) - let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') - let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') - let parsed = "" - while groups =~ '[^,:]' - let i = matchend(groups, s:notslash . ':') - let j = matchend(groups, s:notslash . ',') - let ini = strpart(groups, 0, i-1) - let tail = strpart(groups, i, j-i-1) . ":" - let groups = strpart(groups, j) - let parsed = parsed . ini - let i = matchend(tail, s:notslash . ':') - while i != -1 - " In 'if:else:endif', ini='if' and word='else' and then word='endif'. - let word = strpart(tail, 0, i-1) - let tail = strpart(tail, i) - let i = matchend(tail, s:notslash . ':') - let parsed = parsed . ":" . s:Resolve(ini, word, "word") - endwhile " Now, tail has been used up. - let parsed = parsed . "," - endwhile " groups =~ '[^,:]' - let parsed = substitute(parsed, ',$', '', '') - return parsed -endfun - -" TODO I think this can be simplified and/or made more efficient. -" TODO What should I do if a:start is out of range? -" Return a regexp that matches all of a:string, such that -" matchstr(a:string, regexp) represents the match for a:pat that starts -" as close to a:start as possible, before being preferred to after, and -" ends after a:start . -" Usage: -" let regexp = s:Wholematch(getline("."), 'foo\|bar', col(".")-1) -" let i = match(getline("."), regexp) -" let j = matchend(getline("."), regexp) -" let match = matchstr(getline("."), regexp) -fun! s:Wholematch(string, pat, start) - let group = '\%(' . a:pat . '\)' - let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') - let len = strlen(a:string) - let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') - if a:string !~ prefix . group . suffix - let prefix = '' - endif - return prefix . group . suffix -endfun - -" No extra arguments: s:Ref(string, d) will -" find the d'th occurrence of '\(' and return it, along with everything up -" to and including the matching '\)'. -" One argument: s:Ref(string, d, "start") returns the index of the start -" of the d'th '\(' and any other argument returns the length of the group. -" Two arguments: s:Ref(string, d, "foo", "bar") returns a string to be -" executed, having the effect of -" :let foo = s:Ref(string, d, "start") -" :let bar = s:Ref(string, d, "len") -fun! s:Ref(string, d, ...) - let len = strlen(a:string) - if a:d == 0 - let start = 0 - else - let cnt = a:d - let match = a:string - while cnt - let cnt = cnt - 1 - let index = matchend(match, s:notslash . '\\(') - if index == -1 - return "" - endif - let match = strpart(match, index) - endwhile - let start = len - strlen(match) - if a:0 == 1 && a:1 == "start" - return start - 2 - endif - let cnt = 1 - while cnt - let index = matchend(match, s:notslash . '\\(\|\\)') - 1 - if index == -2 - return "" - endif - " Increment if an open, decrement if a ')': - let cnt = cnt + (match[index]=="(" ? 1 : -1) " ')' - " let cnt = stridx('0(', match[index]) + cnt - let match = strpart(match, index+1) - endwhile - let start = start - 2 - let len = len - start - strlen(match) - endif - if a:0 == 1 - return len - elseif a:0 == 2 - return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len - else - return strpart(a:string, start, len) - endif -endfun - -" Count the number of disjoint copies of pattern in string. -" If the pattern is a literal string and contains no '0' or '1' characters -" then s:Count(string, pattern, '0', '1') should be faster than -" s:Count(string, pattern). -fun! s:Count(string, pattern, ...) - let pat = escape(a:pattern, '\\') - if a:0 > 1 - let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") - let foo = substitute(a:string, pat, a:2, "g") - let foo = substitute(foo, '[^' . a:2 . ']', "", "g") - return strlen(foo) - endif - let result = 0 - let foo = a:string - let index = matchend(foo, pat) - while index != -1 - let result = result + 1 - let foo = strpart(foo, index) - let index = matchend(foo, pat) - endwhile - return result -endfun - -" s:Resolve('\(a\)\(b\)', '\(c\)\2\1\1\2') should return table.word, where -" word = '\(c\)\(b\)\(a\)\3\2' and table = '-32-------'. That is, the first -" '\1' in target is replaced by '\(a\)' in word, table[1] = 3, and this -" indicates that all other instances of '\1' in target are to be replaced -" by '\3'. The hard part is dealing with nesting... -" Note that ":" is an illegal character for source and target, -" unless it is preceded by "\". -fun! s:Resolve(source, target, output) - let word = a:target - let i = matchend(word, s:notslash . '\\\d') - 1 - let table = "----------" - while i != -2 " There are back references to be replaced. - let d = word[i] - let backref = s:Ref(a:source, d) - " The idea is to replace '\d' with backref. Before we do this, - " replace any \(\) groups in backref with :1, :2, ... if they - " correspond to the first, second, ... group already inserted - " into backref. Later, replace :1 with \1 and so on. The group - " number w+b within backref corresponds to the group number - " s within a:source. - " w = number of '\(' in word before the current one - let w = s:Count( - \ substitute(strpart(word, 0, i-1), '\\\\', '', 'g'), '\(', '1') - let b = 1 " number of the current '\(' in backref - let s = d " number of the current '\(' in a:source - while b <= s:Count(substitute(backref, '\\\\', '', 'g'), '\(', '1') - \ && s < 10 - if table[s] == "-" - if w + b < 10 - " let table[s] = w + b - let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) - endif - let b = b + 1 - let s = s + 1 - else - execute s:Ref(backref, b, "start", "len") - let ref = strpart(backref, start, len) - let backref = strpart(backref, 0, start) . ":". table[s] - \ . strpart(backref, start+len) - let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') - endif - endwhile - let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) - let i = matchend(word, s:notslash . '\\\d') - 1 - endwhile - let word = substitute(word, s:notslash . '\zs:', '\\', 'g') - if a:output == "table" - return table - elseif a:output == "word" - return word - else - return table . word - endif -endfun - -" Assume a:comma = ",". Then the format for a:patterns and a:1 is -" a:patterns = ",,..." -" a:1 = ",,..." -" If is the first pattern that matches a:string then return -" if no optional arguments are given; return , if a:1 is given. -fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) - let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) - let i = matchend(tail, s:notslash . a:comma) - if a:0 - let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) - let j = matchend(alttail, s:notslash . a:comma) - endif - let current = strpart(tail, 0, i-1) - if a:branch == "" - let currpat = current - else - let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') - endif - while a:string !~ a:prefix . currpat . a:suffix - let tail = strpart(tail, i) - let i = matchend(tail, s:notslash . a:comma) - if i == -1 - return -1 - endif - let current = strpart(tail, 0, i-1) - if a:branch == "" - let currpat = current - else - let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') - endif - if a:0 - let alttail = strpart(alttail, j) - let j = matchend(alttail, s:notslash . a:comma) - endif - endwhile - if a:0 - let current = current . a:comma . strpart(alttail, 0, j-1) - endif - return current -endfun +vmap (MatchitVisualTextObject) (MatchitVisualMultiBackward)o(MatchitVisualMultiForward) +xmap a% (MatchitVisualTextObject) " Call this function to turn on debugging information. Every time the main " script is run, buffer variables will be saved. These can be used directly " or viewed using the menu items below. if !exists(":MatchDebug") - command! -nargs=0 MatchDebug call s:Match_debug() + command! -nargs=0 MatchDebug call matchit#Match_debug() endif -fun! s:Match_debug() - let b:match_debug = 1 " Save debugging information. - " pat = all of b:match_words with backrefs parsed - amenu &Matchit.&pat :echo b:match_pat - " match = bit of text that is recognized as a match - amenu &Matchit.&match :echo b:match_match - " curcol = cursor column of the start of the matching text - amenu &Matchit.&curcol :echo b:match_col - " wholeBR = matching group, original version - amenu &Matchit.wh&oleBR :echo b:match_wholeBR - " iniBR = 'if' piece, original version - amenu &Matchit.ini&BR :echo b:match_iniBR - " ini = 'if' piece, with all backrefs resolved from match - amenu &Matchit.&ini :echo b:match_ini - " tail = 'else\|endif' piece, with all backrefs resolved from match - amenu &Matchit.&tail :echo b:match_tail - " fin = 'endif' piece, with all backrefs resolved from match - amenu &Matchit.&word :echo b:match_word - " '\'.d in ini refers to the same thing as '\'.table[d] in word. - amenu &Matchit.t&able :echo '0:' . b:match_table . ':9' -endfun - -" Jump to the nearest unmatched "(" or "if" or "" if a:spflag == "bW" -" or the nearest unmatched "" or "endif" or ")" if a:spflag == "W". -" Return a "mark" for the original position, so that -" let m = MultiMatch("bW", "n") ... execute m -" will return to the original position. If there is a problem, do not -" move the cursor and return "", unless a count is given, in which case -" go up or down as many levels as possible and again return "". -" TODO This relies on the same patterns as % matching. It might be a good -" idea to give it its own matching patterns. -fun! s:MultiMatch(spflag, mode) - if !exists("b:match_words") || b:match_words == "" - return {} - end - let restore_options = "" - if exists("b:match_ignorecase") && b:match_ignorecase != &ic - let restore_options .= (&ic ? " " : " no") . "ignorecase" - let &ignorecase = b:match_ignorecase - endif - let startline = line(".") - let startcol = col(".") - - " First step: if not already done, set the script variables - " s:do_BR flag for whether there are backrefs - " s:pat parsed version of b:match_words - " s:all regexp based on s:pat and the default groups - " This part is copied and slightly modified from s:Match_wrapper(). - let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . - \ '\/\*:\*\/,#\s*if\%(def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>' - " Allow b:match_words = "GetVimMatchWords()" . - if b:match_words =~ ":" - let match_words = b:match_words - else - execute "let match_words =" b:match_words - endif - if (match_words != s:last_words) || (&mps != s:last_mps) || - \ exists("b:match_debug") - let s:last_words = match_words - let s:last_mps = &mps - let match_words = match_words . (strlen(match_words) ? "," : "") . default - if match_words !~ s:notslash . '\\\d' - let s:do_BR = 0 - let s:pat = match_words - else - let s:do_BR = 1 - let s:pat = s:ParseWords(match_words) - endif - let s:all = '\%(' . substitute(s:pat . (strlen(s:pat) ? "," : "") . default, - \ '[,:]\+', '\\|', 'g') . '\)' - if exists("b:match_debug") - let b:match_pat = s:pat - endif - endif - - " Second step: figure out the patterns for searchpair() - " and save the screen, cursor position, and 'ignorecase'. - " - TODO: A lot of this is copied from s:Match_wrapper(). - " - maybe even more functionality should be split off - " - into separate functions! - let cdefault = (s:pat =~ '[^,]$' ? "," : "") . default - let open = substitute(s:pat . cdefault, - \ s:notslash . '\zs:.\{-}' . s:notslash . ',', '\\),\\(', 'g') - let open = '\(' . substitute(open, s:notslash . '\zs:.*$', '\\)', '') - let close = substitute(s:pat . cdefault, - \ s:notslash . '\zs,.\{-}' . s:notslash . ':', '\\),\\(', 'g') - let close = substitute(close, '^.\{-}' . s:notslash . ':', '\\(', '') . '\)' - if exists("b:match_skip") - let skip = b:match_skip - elseif exists("b:match_comment") " backwards compatibility and testing! - let skip = "r:" . b:match_comment - else - let skip = 's:comment\|string' - endif - let skip = s:ParseSkip(skip) - let view = winsaveview() - - " Third step: call searchpair(). - " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. - let openpat = substitute(open, '\(\\\@" or ... -" and return "endif" or "endwhile" or "" or ... . -" For now, this uses b:match_words and the same script variables -" as s:Match_wrapper() . Later, it may get its own patterns, -" either from a buffer variable or passed as arguments. -" fun! s:Autocomplete() -" echo "autocomplete not yet implemented :-(" -" if !exists("b:match_words") || b:match_words == "" -" return "" -" end -" let startpos = s:MultiMatch("bW") -" -" if startpos == "" -" return "" -" endif -" " - TODO: figure out whether 'if' or '' matched, and construct -" " - the appropriate closing. -" let matchline = getline(".") -" let curcol = col(".") - 1 -" " - TODO: Change the s:all argument if there is a new set of match pats. -" let regexp = s:Wholematch(matchline, s:all, curcol) -" let suf = strlen(matchline) - matchend(matchline, regexp) -" let prefix = (curcol ? '^.\{' . curcol . '}\%(' : '^\%(') -" let suffix = (suf ? '\).\{' . suf . '}$' : '\)$') -" " Reconstruct the version with unresolved backrefs. -" let patBR = substitute(b:match_words.',', '[,:]*,[,:]*', ',', 'g') -" let patBR = substitute(patBR, ':\{2,}', ':', "g") -" " Now, set group and groupBR to the matching group: 'if:endif' or -" " 'while:endwhile' or whatever. -" let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, patBR) -" let i = matchend(group, s:notslash . ",") -" let groupBR = strpart(group, i) -" let group = strpart(group, 0, i-1) -" " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix -" if s:do_BR -" let group = s:InsertRefs(groupBR, prefix, group, suffix, matchline) -" endif -" " let g:group = group -" -" " - TODO: Construct the closing from group. -" let fake = "end" . expand("") -" execute startpos -" return fake -" endfun - -" Close all open structures. "Get the heck out of here!" -" fun! s:Gthhoh() -" let close = s:Autocomplete() -" while strlen(close) -" put=close -" let close = s:Autocomplete() -" endwhile -" endfun - -" Parse special strings as typical skip arguments for searchpair(): -" s:foo becomes (current syntax item) =~ foo -" S:foo becomes (current syntax item) !~ foo -" r:foo becomes (line before cursor) =~ foo -" R:foo becomes (line before cursor) !~ foo -fun! s:ParseSkip(str) - let skip = a:str - if skip[1] == ":" - if skip[0] == "s" - let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . - \ strpart(skip,2) . "'" - elseif skip[0] == "S" - let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . - \ strpart(skip,2) . "'" - elseif skip[0] == "r" - let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" - elseif skip[0] == "R" - let skip = "strpart(getline('.'),0,col('.'))!~'" . strpart(skip,2). "'" - endif - endif - return skip -endfun - let &cpo = s:save_cpo unlet s:save_cpo -" vim:sts=2:sw=2: +" vim:sts=2:sw=2:et: diff --git a/runtime/syntax/debchangelog.vim b/runtime/syntax/debchangelog.vim index ce0339522b..4ca4c299b2 100644 --- a/runtime/syntax/debchangelog.vim +++ b/runtime/syntax/debchangelog.vim @@ -3,7 +3,7 @@ " Maintainer: Debian Vim Maintainers " Former Maintainers: Gerfried Fuchs " Wichert Akkerman -" Last Change: 2018 Oct 30 +" Last Change: 2019 Jan 26 " URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debchangelog.vim " Standard syntax initialization @@ -14,7 +14,7 @@ endif " Case doesn't matter for us syn case ignore -let s:urgency='urgency=\(low\|medium\|high\|critical\)\( [^[:space:],][^,]*\)\=' +let s:urgency='urgency=\(low\|medium\|high\|emergency\|critical\)\( [^[:space:],][^,]*\)\=' let s:binNMU='binary-only=yes' " Define some common expressions we can use later on