vim-patch:partial fa3b72348d88 (#16780)

Update runtime files
fa3b72348d

omit
doc/eval.txt (needs 8.2.3864)
doc/map.txt (needs 8.2.3619)
menu.vim (needs 8.2.0413)
This commit is contained in:
Christian Clason
2021-12-26 11:03:25 +01:00
committed by GitHub
parent 9dd8557921
commit 8c720f6b9d
18 changed files with 283 additions and 387 deletions

View File

@ -1,7 +1,7 @@
" Vim functions for file type detection " Vim functions for file type detection
" "
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2021 Nov 27 " Last Change: 2021 Dec 17
" These functions are moved here from runtime/filetype.vim to make startup " These functions are moved here from runtime/filetype.vim to make startup
" faster. " faster.

View File

@ -5437,8 +5437,9 @@ getreg([{regname} [, 1 [, {list}]]]) *getreg()*
The result is a String, which is the contents of register The result is a String, which is the contents of register
{regname}. Example: > {regname}. Example: >
:let cliptext = getreg('*') :let cliptext = getreg('*')
< When {regname} was not set the result is an empty string. < When register {regname} was not set the result is an empty
The {regname} argument is a string. string.
The {regname} argument must be a string.
getreg('=') returns the last evaluated value of the expression getreg('=') returns the last evaluated value of the expression
register. (For use in maps.) register. (For use in maps.)

View File

@ -837,8 +837,7 @@ g@{motion} Call the function set by the 'operatorfunc' option.
"line" {motion} was |linewise| "line" {motion} was |linewise|
"char" {motion} was |charwise| "char" {motion} was |charwise|
"block" {motion} was |blockwise-visual| "block" {motion} was |blockwise-visual|
Although "block" would rarely appear, since it can The type can be forced, see |forced-motion|.
only result from Visual mode where "g@" is not useful.
Here is an example that counts the number of spaces with <F4>: > Here is an example that counts the number of spaces with <F4>: >

View File

@ -391,6 +391,8 @@ GDB command *termdebug-customizing*
To change the name of the gdb command, set the "termdebugger" variable before To change the name of the gdb command, set the "termdebugger" variable before
invoking `:Termdebug`: > invoking `:Termdebug`: >
let termdebugger = "mygdb" let termdebugger = "mygdb"
If the command needs an argument use a List: >
let g:termdebugger = ['rr', 'replay', '--']
To not use neovim floating windows for previewing variable evaluation, set the To not use neovim floating windows for previewing variable evaluation, set the
`g:termdebug_useFloatingHover` variable like this: > `g:termdebug_useFloatingHover` variable like this: >

View File

@ -4455,7 +4455,7 @@ it marks the "\(\I\i*\)" sub-expression as external; in the end pattern, it
changes the \z1 back-reference into an external reference referring to the changes the \z1 back-reference into an external reference referring to the
first external sub-expression in the start pattern. External references can first external sub-expression in the start pattern. External references can
also be used in skip patterns: > also be used in skip patterns: >
:syn region foo start="start \(\I\i*\)" skip="not end \z1" end="end \z1" :syn region foo start="start \z(\I\i*\)" skip="not end \z1" end="end \z1"
Note that normal and external sub-expressions are completely orthogonal and Note that normal and external sub-expressions are completely orthogonal and
indexed separately; for instance, if the pattern "\z(..\)\(..\)" is applied indexed separately; for instance, if the pattern "\z(..\)\(..\)" is applied

View File

@ -1,7 +1,7 @@
" Vim support file to detect file types " Vim support file to detect file types
" "
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2021 Dec 14 " Last Change: 2021 Dec 22
" Listen very carefully, I will say this only once " Listen very carefully, I will say this only once
if exists("did_load_filetypes") if exists("did_load_filetypes")

View File

@ -18,13 +18,13 @@ setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
let b:undo_ftplugin = "setl com< cms< fo< " let b:undo_ftplugin = "setl com< cms< fo< "
if executable('zsh') if executable('zsh') && &shell !~# '/\%(nologin\|false\)$'
if !has('gui_running') && executable('less') if !has('gui_running') && executable('less')
command! -buffer -nargs=1 RunHelp silent exe '!MANPAGER= zsh -ic "autoload -Uz run-help; run-help <args> 2>/dev/null | LESS= less"' | redraw! command! -buffer -nargs=1 RunHelp silent exe '!MANPAGER= zsh -c "autoload -Uz run-help; run-help <args> 2>/dev/null | LESS= less"' | redraw!
elseif has('terminal') elseif has('terminal')
command! -buffer -nargs=1 RunHelp silent exe ':term zsh -ic "autoload -Uz run-help; run-help <args>"' command! -buffer -nargs=1 RunHelp silent exe ':term zsh -c "autoload -Uz run-help; run-help <args>"'
else else
command! -buffer -nargs=1 RunHelp echo system('zsh -ic "autoload -Uz run-help; run-help <args> 2>/dev/null"') command! -buffer -nargs=1 RunHelp echo system('zsh -c "autoload -Uz run-help; run-help <args> 2>/dev/null"')
endif endif
if !exists('current_compiler') if !exists('current_compiler')
compiler zsh compiler zsh

View File

@ -109,7 +109,7 @@ function! GetShIndent()
let ind += s:indent_value('continuation-line') let ind += s:indent_value('continuation-line')
endif endif
elseif s:end_block(line) && !s:start_block(line) elseif s:end_block(line) && !s:start_block(line)
let ind -= s:indent_value('default') let ind = indent(lnum)
elseif pnum != 0 && elseif pnum != 0 &&
\ s:is_continuation_line(pline) && \ s:is_continuation_line(pline) &&
\ !s:end_block(curline) && \ !s:end_block(curline) &&

View File

@ -39,6 +39,8 @@ setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,},!^F
" autoindent: used when the indentexpr returns -1 " autoindent: used when the indentexpr returns -1
setlocal autoindent setlocal autoindent
let b:undo_indent = "setl ai< inde< indk<"
if !exists('b:xml_indent_open') if !exists('b:xml_indent_open')
let b:xml_indent_open = '.\{-}<[:A-Z_a-z]' let b:xml_indent_open = '.\{-}<[:A-Z_a-z]'
" pre tag, e.g. <address> " pre tag, e.g. <address>
@ -51,6 +53,10 @@ if !exists('b:xml_indent_close')
" let b:xml_indent_close = '.\{-}</\(address\)\@!' " let b:xml_indent_close = '.\{-}</\(address\)\@!'
endif endif
if !exists('b:xml_indent_continuation_filetype')
let b:xml_indent_continuation_filetype = 'xml'
endif
let &cpo = s:keepcpo let &cpo = s:keepcpo
unlet s:keepcpo unlet s:keepcpo
@ -162,7 +168,7 @@ endfun
func! <SID>IsXMLContinuation(line) func! <SID>IsXMLContinuation(line)
" Checks, whether or not the line matches a start-of-tag " Checks, whether or not the line matches a start-of-tag
return a:line !~ '^\s*<' && &ft is# 'xml' return a:line !~ '^\s*<' && &ft =~# b:xml_indent_continuation_filetype
endfunc endfunc
func! <SID>HasNoTagEnd(line) func! <SID>HasNoTagEnd(line)

View File

@ -1,6 +1,11 @@
" matchit.vim: (global plugin) Extended "%" matching " matchit.vim: (global plugin) Extended "%" matching
" autload script of matchit plugin, see ../plugin/matchit.vim " autload script of matchit plugin, see ../plugin/matchit.vim
" Last Change: Mar 01, 2020 " Last Change: Jun 10, 2021
" Neovim does not support scriptversion
if has("vimscript-4")
scriptversion 4
endif
let s:last_mps = "" let s:last_mps = ""
let s:last_words = ":" let s:last_words = ":"
@ -30,11 +35,11 @@ function s:RestoreOptions()
" In s:CleanUp(), :execute "set" restore_options . " In s:CleanUp(), :execute "set" restore_options .
let restore_options = "" let restore_options = ""
if get(b:, 'match_ignorecase', &ic) != &ic if get(b:, 'match_ignorecase', &ic) != &ic
let restore_options .= (&ic ? " " : " no") . "ignorecase" let restore_options ..= (&ic ? " " : " no") .. "ignorecase"
let &ignorecase = b:match_ignorecase let &ignorecase = b:match_ignorecase
endif endif
if &ve != '' if &ve != ''
let restore_options = " ve=" . &ve . restore_options let restore_options = " ve=" .. &ve .. restore_options
set ve= set ve=
endif endif
return restore_options return restore_options
@ -42,22 +47,23 @@ endfunction
function matchit#Match_wrapper(word, forward, mode) range function matchit#Match_wrapper(word, forward, mode) range
let restore_options = s:RestoreOptions() let restore_options = s:RestoreOptions()
" If this function was called from Visual mode, make sure that the cursor
" is at the correct end of the Visual range:
if a:mode == "v"
execute "normal! gv\<Esc>"
elseif a:mode == "o" && mode(1) !~# '[vV]'
exe "norm! v"
elseif a:mode == "n" && mode(1) =~# 'ni'
exe "norm! v"
endif
" In s:CleanUp(), we may need to check whether the cursor moved forward. " In s:CleanUp(), we may need to check whether the cursor moved forward.
let startpos = [line("."), col(".")] let startpos = [line("."), col(".")]
" Use default behavior if called with a count. " if a count has been applied, use the default [count]% mode (see :h N%)
if v:count if v:count
exe "normal! " . v:count . "%" exe "normal! " .. v:count .. "%"
return s:CleanUp(restore_options, a:mode, startpos) return s:CleanUp(restore_options, a:mode, startpos)
end end
if a:mode =~# "v" && mode(1) =~# 'ni'
exe "norm! gv"
elseif a:mode == "o" && mode(1) !~# '[vV]'
exe "norm! v"
" If this function was called from Visual mode, make sure that the cursor
" is at the correct end of the Visual range:
elseif a:mode == "v"
execute "normal! gv\<Esc>"
let startpos = [line("."), col(".")]
endif
" First step: if not already done, set the script variables " First step: if not already done, set the script variables
" s:do_BR flag for whether there are backrefs " s:do_BR flag for whether there are backrefs
@ -78,30 +84,30 @@ function matchit#Match_wrapper(word, forward, mode) range
" quote the special chars in 'matchpairs', replace [,:] with \| and then " quote the special chars in 'matchpairs', replace [,:] with \| and then
" append the builtin pairs (/*, */, #if, #ifdef, #ifndef, #else, #elif, " append the builtin pairs (/*, */, #if, #ifdef, #ifndef, #else, #elif,
" #endif) " #endif)
let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . let default = escape(&mps, '[$^.*~\\/?]') .. (strlen(&mps) ? "," : "") ..
\ '\/\*:\*\/,#\s*if\%(n\=def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>' \ '\/\*:\*\/,#\s*if\%(n\=def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'
" s:all = pattern with all the keywords " s:all = pattern with all the keywords
let match_words = match_words . (strlen(match_words) ? "," : "") . default let match_words = match_words .. (strlen(match_words) ? "," : "") .. default
let s:last_words = match_words let s:last_words = match_words
if match_words !~ s:notslash . '\\\d' if match_words !~ s:notslash .. '\\\d'
let s:do_BR = 0 let s:do_BR = 0
let s:pat = match_words let s:pat = match_words
else else
let s:do_BR = 1 let s:do_BR = 1
let s:pat = s:ParseWords(match_words) let s:pat = s:ParseWords(match_words)
endif endif
let s:all = substitute(s:pat, s:notslash . '\zs[,:]\+', '\\|', 'g') let s:all = substitute(s:pat, s:notslash .. '\zs[,:]\+', '\\|', 'g')
" Just in case there are too many '\(...)' groups inside the pattern, make " Just in case there are too many '\(...)' groups inside the pattern, make
" sure to use \%(...) groups, so that error E872 can be avoided " sure to use \%(...) groups, so that error E872 can be avoided
let s:all = substitute(s:all, '\\(', '\\%(', 'g') let s:all = substitute(s:all, '\\(', '\\%(', 'g')
let s:all = '\%(' . s:all . '\)' let s:all = '\%(' .. s:all .. '\)'
if exists("b:match_debug") if exists("b:match_debug")
let b:match_pat = s:pat let b:match_pat = s:pat
endif endif
" Reconstruct the version with unresolved backrefs. " Reconstruct the version with unresolved backrefs.
let s:patBR = substitute(match_words.',', let s:patBR = substitute(match_words .. ',',
\ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') \ s:notslash .. '\zs[,:]*,[,:]*', ',', 'g')
let s:patBR = substitute(s:patBR, s:notslash.'\zs:\{2,}', ':', 'g') let s:patBR = substitute(s:patBR, s:notslash .. '\zs:\{2,}', ':', 'g')
endif endif
" Second step: set the following local variables: " Second step: set the following local variables:
@ -128,12 +134,15 @@ function matchit#Match_wrapper(word, forward, mode) range
let curcol = match(matchline, regexp) let curcol = match(matchline, regexp)
" If there is no match, give up. " If there is no match, give up.
if curcol == -1 if curcol == -1
" Make sure macros abort properly
"exe "norm! \<esc>"
call feedkeys("\e", 'tni')
return s:CleanUp(restore_options, a:mode, startpos) return s:CleanUp(restore_options, a:mode, startpos)
endif endif
let endcol = matchend(matchline, regexp) let endcol = matchend(matchline, regexp)
let suf = strlen(matchline) - endcol let suf = strlen(matchline) - endcol
let prefix = (curcol ? '^.*\%' . (curcol + 1) . 'c\%(' : '^\%(') let prefix = (curcol ? '^.*\%' .. (curcol + 1) .. 'c\%(' : '^\%(')
let suffix = (suf ? '\)\%' . (endcol + 1) . 'c.*$' : '\)$') let suffix = (suf ? '\)\%' .. (endcol + 1) .. 'c.*$' : '\)$')
endif endif
if exists("b:match_debug") if exists("b:match_debug")
let b:match_match = matchstr(matchline, regexp) let b:match_match = matchstr(matchline, regexp)
@ -150,7 +159,7 @@ function matchit#Match_wrapper(word, forward, mode) range
" 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns " 'while:endwhile' or whatever. A bit of a kluge: s:Choose() returns
" group . "," . groupBR, and we pick it apart. " group . "," . groupBR, and we pick it apart.
let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, s:patBR) let group = s:Choose(s:pat, matchline, ",", ":", prefix, suffix, s:patBR)
let i = matchend(group, s:notslash . ",") let i = matchend(group, s:notslash .. ",")
let groupBR = strpart(group, i) let groupBR = strpart(group, i)
let group = strpart(group, 0, i-1) let group = strpart(group, 0, i-1)
" Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix " Now, matchline =~ prefix . substitute(group,':','\|','g') . suffix
@ -159,32 +168,32 @@ function matchit#Match_wrapper(word, forward, mode) range
endif endif
if exists("b:match_debug") if exists("b:match_debug")
let b:match_wholeBR = groupBR let b:match_wholeBR = groupBR
let i = matchend(groupBR, s:notslash . ":") let i = matchend(groupBR, s:notslash .. ":")
let b:match_iniBR = strpart(groupBR, 0, i-1) let b:match_iniBR = strpart(groupBR, 0, i-1)
endif endif
" Fourth step: Set the arguments for searchpair(). " Fourth step: Set the arguments for searchpair().
let i = matchend(group, s:notslash . ":") let i = matchend(group, s:notslash .. ":")
let j = matchend(group, '.*' . s:notslash . ":") let j = matchend(group, '.*' .. s:notslash .. ":")
let ini = strpart(group, 0, i-1) let ini = strpart(group, 0, i-1)
let mid = substitute(strpart(group, i,j-i-1), s:notslash.'\zs:', '\\|', 'g') let mid = substitute(strpart(group, i,j-i-1), s:notslash .. '\zs:', '\\|', 'g')
let fin = strpart(group, j) let fin = strpart(group, j)
"Un-escape the remaining , and : characters. "Un-escape the remaining , and : characters.
let ini = substitute(ini, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') let ini = substitute(ini, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
let mid = substitute(mid, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') let mid = substitute(mid, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
let fin = substitute(fin, s:notslash . '\zs\\\(:\|,\)', '\1', 'g') let fin = substitute(fin, s:notslash .. '\zs\\\(:\|,\)', '\1', 'g')
" searchpair() requires that these patterns avoid \(\) groups. " searchpair() requires that these patterns avoid \(\) groups.
let ini = substitute(ini, s:notslash . '\zs\\(', '\\%(', 'g') let ini = substitute(ini, s:notslash .. '\zs\\(', '\\%(', 'g')
let mid = substitute(mid, s:notslash . '\zs\\(', '\\%(', 'g') let mid = substitute(mid, s:notslash .. '\zs\\(', '\\%(', 'g')
let fin = substitute(fin, s:notslash . '\zs\\(', '\\%(', 'g') let fin = substitute(fin, s:notslash .. '\zs\\(', '\\%(', 'g')
" Set mid. This is optimized for readability, not micro-efficiency! " Set mid. This is optimized for readability, not micro-efficiency!
if a:forward && matchline =~ prefix . fin . suffix if a:forward && matchline =~ prefix .. fin .. suffix
\ || !a:forward && matchline =~ prefix . ini . suffix \ || !a:forward && matchline =~ prefix .. ini .. suffix
let mid = "" let mid = ""
endif endif
" Set flag. This is optimized for readability, not micro-efficiency! " Set flag. This is optimized for readability, not micro-efficiency!
if a:forward && matchline =~ prefix . fin . suffix if a:forward && matchline =~ prefix .. fin .. suffix
\ || !a:forward && matchline !~ prefix . ini . suffix \ || !a:forward && matchline !~ prefix .. ini .. suffix
let flag = "bW" let flag = "bW"
else else
let flag = "W" let flag = "W"
@ -193,14 +202,14 @@ function matchit#Match_wrapper(word, forward, mode) range
if exists("b:match_skip") if exists("b:match_skip")
let skip = b:match_skip let skip = b:match_skip
elseif exists("b:match_comment") " backwards compatibility and testing! elseif exists("b:match_comment") " backwards compatibility and testing!
let skip = "r:" . b:match_comment let skip = "r:" .. b:match_comment
else else
let skip = 's:comment\|string' let skip = 's:comment\|string'
endif endif
let skip = s:ParseSkip(skip) let skip = s:ParseSkip(skip)
if exists("b:match_debug") if exists("b:match_debug")
let b:match_ini = ini let b:match_ini = ini
let b:match_tail = (strlen(mid) ? mid.'\|' : '') . fin let b:match_tail = (strlen(mid) ? mid .. '\|' : '') .. fin
endif endif
" Fifth step: actually start moving the cursor and call searchpair(). " Fifth step: actually start moving the cursor and call searchpair().
@ -210,25 +219,29 @@ function matchit#Match_wrapper(word, forward, mode) range
if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
let skip = "0" let skip = "0"
else else
execute "if " . skip . "| let skip = '0' | endif" execute "if " .. skip .. "| let skip = '0' | endif"
endif endif
let sp_return = searchpair(ini, mid, fin, flag, skip) let sp_return = searchpair(ini, mid, fin, flag, skip)
if &selection isnot# 'inclusive' && a:mode == 'v' if &selection isnot# 'inclusive' && a:mode == 'v'
" move cursor one pos to the right, because selection is not inclusive " move cursor one pos to the right, because selection is not inclusive
" add virtualedit=onemore, to make it work even when the match ends the " line " add virtualedit=onemore, to make it work even when the match ends the
" line
if !(col('.') < col('$')-1) if !(col('.') < col('$')-1)
set ve=onemore let eolmark=1 " flag to set a mark on eol (since we cannot move there)
endif endif
norm! l norm! l
endif endif
let final_position = "call cursor(" . line(".") . "," . col(".") . ")" let final_position = "call cursor(" .. line(".") .. "," .. col(".") .. ")"
" Restore cursor position and original screen. " Restore cursor position and original screen.
call winrestview(view) call winrestview(view)
normal! m' normal! m'
if sp_return > 0 if sp_return > 0
execute final_position execute final_position
endif endif
return s:CleanUp(restore_options, a:mode, startpos, mid.'\|'.fin) if exists('eolmark') && eolmark
call setpos("''", [0, line('.'), col('$'), 0]) " set mark on the eol
endif
return s:CleanUp(restore_options, a:mode, startpos, mid .. '\|' .. fin)
endfun endfun
" Restore options and do some special handling for Operator-pending mode. " Restore options and do some special handling for Operator-pending mode.
@ -270,16 +283,16 @@ endfun
" a:matchline = "123<tag>12" or "123</tag>12" " a:matchline = "123<tag>12" or "123</tag>12"
" then extract "tag" from a:matchline and return "<tag>:</tag>" . " then extract "tag" from a:matchline and return "<tag>:</tag>" .
fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline) fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)
if a:matchline !~ a:prefix . if a:matchline !~ a:prefix ..
\ substitute(a:group, s:notslash . '\zs:', '\\|', 'g') . a:suffix \ substitute(a:group, s:notslash .. '\zs:', '\\|', 'g') .. a:suffix
return a:group return a:group
endif endif
let i = matchend(a:groupBR, s:notslash . ':') let i = matchend(a:groupBR, s:notslash .. ':')
let ini = strpart(a:groupBR, 0, i-1) let ini = strpart(a:groupBR, 0, i-1)
let tailBR = strpart(a:groupBR, i) let tailBR = strpart(a:groupBR, i)
let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix, let word = s:Choose(a:group, a:matchline, ":", "", a:prefix, a:suffix,
\ a:groupBR) \ a:groupBR)
let i = matchend(word, s:notslash . ":") let i = matchend(word, s:notslash .. ":")
let wordBR = strpart(word, i) let wordBR = strpart(word, i)
let word = strpart(word, 0, i-1) let word = strpart(word, 0, i-1)
" Now, a:matchline =~ a:prefix . word . a:suffix " Now, a:matchline =~ a:prefix . word . a:suffix
@ -289,10 +302,10 @@ fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)
let table = "" let table = ""
let d = 0 let d = 0
while d < 10 while d < 10
if tailBR =~ s:notslash . '\\' . d if tailBR =~ s:notslash .. '\\' .. d
let table = table . d let table = table .. d
else else
let table = table . "-" let table = table .. "-"
endif endif
let d = d + 1 let d = d + 1
endwhile endwhile
@ -300,13 +313,13 @@ fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)
let d = 9 let d = 9
while d while d
if table[d] != "-" if table[d] != "-"
let backref = substitute(a:matchline, a:prefix.word.a:suffix, let backref = substitute(a:matchline, a:prefix .. word .. a:suffix,
\ '\'.table[d], "") \ '\' .. table[d], "")
" Are there any other characters that should be escaped? " Are there any other characters that should be escaped?
let backref = escape(backref, '*,:') let backref = escape(backref, '*,:')
execute s:Ref(ini, d, "start", "len") execute s:Ref(ini, d, "start", "len")
let ini = strpart(ini, 0, start) . backref . strpart(ini, start+len) let ini = strpart(ini, 0, start) .. backref .. strpart(ini, start+len)
let tailBR = substitute(tailBR, s:notslash . '\zs\\' . d, let tailBR = substitute(tailBR, s:notslash .. '\zs\\' .. d,
\ escape(backref, '\\&'), 'g') \ escape(backref, '\\&'), 'g')
endif endif
let d = d-1 let d = d-1
@ -320,7 +333,7 @@ fun! s:InsertRefs(groupBR, prefix, group, suffix, matchline)
let b:match_word = "" let b:match_word = ""
endif endif
endif endif
return ini . ":" . tailBR return ini .. ":" .. tailBR
endfun endfun
" Input a comma-separated list of groups with backrefs, such as " Input a comma-separated list of groups with backrefs, such as
@ -328,25 +341,25 @@ endfun
" and return a comma-separated list of groups with backrefs replaced: " and return a comma-separated list of groups with backrefs replaced:
" return '\(foo\):end\(foo\),\(bar\):end\(bar\)' " return '\(foo\):end\(foo\),\(bar\):end\(bar\)'
fun! s:ParseWords(groups) fun! s:ParseWords(groups)
let groups = substitute(a:groups.",", s:notslash.'\zs[,:]*,[,:]*', ',', 'g') let groups = substitute(a:groups .. ",", s:notslash .. '\zs[,:]*,[,:]*', ',', 'g')
let groups = substitute(groups, s:notslash . '\zs:\{2,}', ':', 'g') let groups = substitute(groups, s:notslash .. '\zs:\{2,}', ':', 'g')
let parsed = "" let parsed = ""
while groups =~ '[^,:]' while groups =~ '[^,:]'
let i = matchend(groups, s:notslash . ':') let i = matchend(groups, s:notslash .. ':')
let j = matchend(groups, s:notslash . ',') let j = matchend(groups, s:notslash .. ',')
let ini = strpart(groups, 0, i-1) let ini = strpart(groups, 0, i-1)
let tail = strpart(groups, i, j-i-1) . ":" let tail = strpart(groups, i, j-i-1) .. ":"
let groups = strpart(groups, j) let groups = strpart(groups, j)
let parsed = parsed . ini let parsed = parsed .. ini
let i = matchend(tail, s:notslash . ':') let i = matchend(tail, s:notslash .. ':')
while i != -1 while i != -1
" In 'if:else:endif', ini='if' and word='else' and then word='endif'. " In 'if:else:endif', ini='if' and word='else' and then word='endif'.
let word = strpart(tail, 0, i-1) let word = strpart(tail, 0, i-1)
let tail = strpart(tail, i) let tail = strpart(tail, i)
let i = matchend(tail, s:notslash . ':') let i = matchend(tail, s:notslash .. ':')
let parsed = parsed . ":" . s:Resolve(ini, word, "word") let parsed = parsed .. ":" .. s:Resolve(ini, word, "word")
endwhile " Now, tail has been used up. endwhile " Now, tail has been used up.
let parsed = parsed . "," let parsed = parsed .. ","
endwhile " groups =~ '[^,:]' endwhile " groups =~ '[^,:]'
let parsed = substitute(parsed, ',$', '', '') let parsed = substitute(parsed, ',$', '', '')
return parsed return parsed
@ -364,14 +377,14 @@ endfun
" let j = matchend(getline("."), regexp) " let j = matchend(getline("."), regexp)
" let match = matchstr(getline("."), regexp) " let match = matchstr(getline("."), regexp)
fun! s:Wholematch(string, pat, start) fun! s:Wholematch(string, pat, start)
let group = '\%(' . a:pat . '\)' let group = '\%(' .. a:pat .. '\)'
let prefix = (a:start ? '\(^.*\%<' . (a:start + 2) . 'c\)\zs' : '^') let prefix = (a:start ? '\(^.*\%<' .. (a:start + 2) .. 'c\)\zs' : '^')
let len = strlen(a:string) let len = strlen(a:string)
let suffix = (a:start+1 < len ? '\(\%>'.(a:start+1).'c.*$\)\@=' : '$') let suffix = (a:start+1 < len ? '\(\%>' .. (a:start+1) .. 'c.*$\)\@=' : '$')
if a:string !~ prefix . group . suffix if a:string !~ prefix .. group .. suffix
let prefix = '' let prefix = ''
endif endif
return prefix . group . suffix return prefix .. group .. suffix
endfun endfun
" No extra arguments: s:Ref(string, d) will " No extra arguments: s:Ref(string, d) will
@ -392,7 +405,7 @@ fun! s:Ref(string, d, ...)
let match = a:string let match = a:string
while cnt while cnt
let cnt = cnt - 1 let cnt = cnt - 1
let index = matchend(match, s:notslash . '\\(') let index = matchend(match, s:notslash .. '\\(')
if index == -1 if index == -1
return "" return ""
endif endif
@ -404,7 +417,7 @@ fun! s:Ref(string, d, ...)
endif endif
let cnt = 1 let cnt = 1
while cnt while cnt
let index = matchend(match, s:notslash . '\\(\|\\)') - 1 let index = matchend(match, s:notslash .. '\\(\|\\)') - 1
if index == -2 if index == -2
return "" return ""
endif endif
@ -418,7 +431,7 @@ fun! s:Ref(string, d, ...)
if a:0 == 1 if a:0 == 1
return len return len
elseif a:0 == 2 elseif a:0 == 2
return "let " . a:1 . "=" . start . "| let " . a:2 . "=" . len return "let " .. a:1 .. "=" .. start .. "| let " .. a:2 .. "=" .. len
else else
return strpart(a:string, start, len) return strpart(a:string, start, len)
endif endif
@ -431,9 +444,9 @@ endfun
fun! s:Count(string, pattern, ...) fun! s:Count(string, pattern, ...)
let pat = escape(a:pattern, '\\') let pat = escape(a:pattern, '\\')
if a:0 > 1 if a:0 > 1
let foo = substitute(a:string, '[^'.a:pattern.']', "a:1", "g") let foo = substitute(a:string, '[^' .. a:pattern .. ']', "a:1", "g")
let foo = substitute(a:string, pat, a:2, "g") let foo = substitute(a:string, pat, a:2, "g")
let foo = substitute(foo, '[^' . a:2 . ']', "", "g") let foo = substitute(foo, '[^' .. a:2 .. ']', "", "g")
return strlen(foo) return strlen(foo)
endif endif
let result = 0 let result = 0
@ -456,7 +469,7 @@ endfun
" unless it is preceded by "\". " unless it is preceded by "\".
fun! s:Resolve(source, target, output) fun! s:Resolve(source, target, output)
let word = a:target let word = a:target
let i = matchend(word, s:notslash . '\\\d') - 1 let i = matchend(word, s:notslash .. '\\\d') - 1
let table = "----------" let table = "----------"
while i != -2 " There are back references to be replaced. while i != -2 " There are back references to be replaced.
let d = word[i] let d = word[i]
@ -477,28 +490,28 @@ fun! s:Resolve(source, target, output)
if table[s] == "-" if table[s] == "-"
if w + b < 10 if w + b < 10
" let table[s] = w + b " let table[s] = w + b
let table = strpart(table, 0, s) . (w+b) . strpart(table, s+1) let table = strpart(table, 0, s) .. (w+b) .. strpart(table, s+1)
endif endif
let b = b + 1 let b = b + 1
let s = s + 1 let s = s + 1
else else
execute s:Ref(backref, b, "start", "len") execute s:Ref(backref, b, "start", "len")
let ref = strpart(backref, start, len) let ref = strpart(backref, start, len)
let backref = strpart(backref, 0, start) . ":". table[s] let backref = strpart(backref, 0, start) .. ":" .. table[s]
\ . strpart(backref, start+len) \ .. strpart(backref, start+len)
let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1') let s = s + s:Count(substitute(ref, '\\\\', '', 'g'), '\(', '1')
endif endif
endwhile endwhile
let word = strpart(word, 0, i-1) . backref . strpart(word, i+1) let word = strpart(word, 0, i-1) .. backref .. strpart(word, i+1)
let i = matchend(word, s:notslash . '\\\d') - 1 let i = matchend(word, s:notslash .. '\\\d') - 1
endwhile endwhile
let word = substitute(word, s:notslash . '\zs:', '\\', 'g') let word = substitute(word, s:notslash .. '\zs:', '\\', 'g')
if a:output == "table" if a:output == "table"
return table return table
elseif a:output == "word" elseif a:output == "word"
return word return word
else else
return table . word return table .. word
endif endif
endfun endfun
@ -508,21 +521,21 @@ endfun
" If <patn> is the first pattern that matches a:string then return <patn> " If <patn> is the first pattern that matches a:string then return <patn>
" if no optional arguments are given; return <patn>,<altn> if a:1 is given. " if no optional arguments are given; return <patn>,<altn> if a:1 is given.
fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...) fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...)
let tail = (a:patterns =~ a:comma."$" ? a:patterns : a:patterns . a:comma) let tail = (a:patterns =~ a:comma .. "$" ? a:patterns : a:patterns .. a:comma)
let i = matchend(tail, s:notslash . a:comma) let i = matchend(tail, s:notslash .. a:comma)
if a:0 if a:0
let alttail = (a:1 =~ a:comma."$" ? a:1 : a:1 . a:comma) let alttail = (a:1 =~ a:comma .. "$" ? a:1 : a:1 .. a:comma)
let j = matchend(alttail, s:notslash . a:comma) let j = matchend(alttail, s:notslash .. a:comma)
endif endif
let current = strpart(tail, 0, i-1) let current = strpart(tail, 0, i-1)
if a:branch == "" if a:branch == ""
let currpat = current let currpat = current
else else
let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') let currpat = substitute(current, s:notslash .. a:branch, '\\|', 'g')
endif endif
while a:string !~ a:prefix . currpat . a:suffix while a:string !~ a:prefix .. currpat .. a:suffix
let tail = strpart(tail, i) let tail = strpart(tail, i)
let i = matchend(tail, s:notslash . a:comma) let i = matchend(tail, s:notslash .. a:comma)
if i == -1 if i == -1
return -1 return -1
endif endif
@ -530,15 +543,15 @@ fun! s:Choose(patterns, string, comma, branch, prefix, suffix, ...)
if a:branch == "" if a:branch == ""
let currpat = current let currpat = current
else else
let currpat = substitute(current, s:notslash . a:branch, '\\|', 'g') let currpat = substitute(current, s:notslash .. a:branch, '\\|', 'g')
endif endif
if a:0 if a:0
let alttail = strpart(alttail, j) let alttail = strpart(alttail, j)
let j = matchend(alttail, s:notslash . a:comma) let j = matchend(alttail, s:notslash .. a:comma)
endif endif
endwhile endwhile
if a:0 if a:0
let current = current . a:comma . strpart(alttail, 0, j-1) let current = current .. a:comma .. strpart(alttail, 0, j-1)
endif endif
return current return current
endfun endfun
@ -562,7 +575,7 @@ fun! matchit#Match_debug()
" fin = 'endif' piece, with all backrefs resolved from match " fin = 'endif' piece, with all backrefs resolved from match
amenu &Matchit.&word :echo b:match_word<CR> amenu &Matchit.&word :echo b:match_word<CR>
" '\'.d in ini refers to the same thing as '\'.table[d] in word. " '\'.d in ini refers to the same thing as '\'.table[d] in word.
amenu &Matchit.t&able :echo '0:' . b:match_table . ':9'<CR> amenu &Matchit.t&able :echo '0:' .. b:match_table .. ':9'<CR>
endfun endfun
" Jump to the nearest unmatched "(" or "if" or "<tag>" if a:spflag == "bW" " Jump to the nearest unmatched "(" or "if" or "<tag>" if a:spflag == "bW"
@ -598,26 +611,26 @@ fun! matchit#MultiMatch(spflag, mode)
endif endif
if (match_words != s:last_words) || (&mps != s:last_mps) || if (match_words != s:last_words) || (&mps != s:last_mps) ||
\ exists("b:match_debug") \ exists("b:match_debug")
let default = escape(&mps, '[$^.*~\\/?]') . (strlen(&mps) ? "," : "") . let default = escape(&mps, '[$^.*~\\/?]') .. (strlen(&mps) ? "," : "") ..
\ '\/\*:\*\/,#\s*if\%(n\=def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>' \ '\/\*:\*\/,#\s*if\%(n\=def\)\=:#\s*else\>:#\s*elif\>:#\s*endif\>'
let s:last_mps = &mps let s:last_mps = &mps
let match_words = match_words . (strlen(match_words) ? "," : "") . default let match_words = match_words .. (strlen(match_words) ? "," : "") .. default
let s:last_words = match_words let s:last_words = match_words
if match_words !~ s:notslash . '\\\d' if match_words !~ s:notslash .. '\\\d'
let s:do_BR = 0 let s:do_BR = 0
let s:pat = match_words let s:pat = match_words
else else
let s:do_BR = 1 let s:do_BR = 1
let s:pat = s:ParseWords(match_words) let s:pat = s:ParseWords(match_words)
endif endif
let s:all = '\%(' . substitute(s:pat, '[,:]\+', '\\|', 'g') . '\)' let s:all = '\%(' .. substitute(s:pat, '[,:]\+', '\\|', 'g') .. '\)'
if exists("b:match_debug") if exists("b:match_debug")
let b:match_pat = s:pat let b:match_pat = s:pat
endif endif
" Reconstruct the version with unresolved backrefs. " Reconstruct the version with unresolved backrefs.
let s:patBR = substitute(match_words.',', let s:patBR = substitute(match_words .. ',',
\ s:notslash.'\zs[,:]*,[,:]*', ',', 'g') \ s:notslash .. '\zs[,:]*,[,:]*', ',', 'g')
let s:patBR = substitute(s:patBR, s:notslash.'\zs:\{2,}', ':', 'g') let s:patBR = substitute(s:patBR, s:notslash .. '\zs:\{2,}', ':', 'g')
endif endif
" Second step: figure out the patterns for searchpair() " Second step: figure out the patterns for searchpair()
@ -625,23 +638,23 @@ fun! matchit#MultiMatch(spflag, mode)
" - TODO: A lot of this is copied from matchit#Match_wrapper(). " - TODO: A lot of this is copied from matchit#Match_wrapper().
" - maybe even more functionality should be split off " - maybe even more functionality should be split off
" - into separate functions! " - into separate functions!
let openlist = split(s:pat . ',', s:notslash . '\zs:.\{-}' . s:notslash . ',') let openlist = split(s:pat .. ',', s:notslash .. '\zs:.\{-}' .. s:notslash .. ',')
let midclolist = split(',' . s:pat, s:notslash . '\zs,.\{-}' . s:notslash . ':') let midclolist = split(',' .. s:pat, s:notslash .. '\zs,.\{-}' .. s:notslash .. ':')
call map(midclolist, {-> split(v:val, s:notslash . ':')}) call map(midclolist, {-> split(v:val, s:notslash .. ':')})
let closelist = [] let closelist = []
let middlelist = [] let middlelist = []
call map(midclolist, {i,v -> [extend(closelist, v[-1 : -1]), call map(midclolist, {i,v -> [extend(closelist, v[-1 : -1]),
\ extend(middlelist, v[0 : -2])]}) \ extend(middlelist, v[0 : -2])]})
call map(openlist, {i,v -> v =~# s:notslash . '\\|' ? '\%(' . v . '\)' : v}) call map(openlist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
call map(middlelist, {i,v -> v =~# s:notslash . '\\|' ? '\%(' . v . '\)' : v}) call map(middlelist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
call map(closelist, {i,v -> v =~# s:notslash . '\\|' ? '\%(' . v . '\)' : v}) call map(closelist, {i,v -> v =~# s:notslash .. '\\|' ? '\%(' .. v .. '\)' : v})
let open = join(openlist, ',') let open = join(openlist, ',')
let middle = join(middlelist, ',') let middle = join(middlelist, ',')
let close = join(closelist, ',') let close = join(closelist, ',')
if exists("b:match_skip") if exists("b:match_skip")
let skip = b:match_skip let skip = b:match_skip
elseif exists("b:match_comment") " backwards compatibility and testing! elseif exists("b:match_comment") " backwards compatibility and testing!
let skip = "r:" . b:match_comment let skip = "r:" .. b:match_comment
else else
let skip = 's:comment\|string' let skip = 's:comment\|string'
endif endif
@ -650,18 +663,18 @@ fun! matchit#MultiMatch(spflag, mode)
" Third step: call searchpair(). " Third step: call searchpair().
" Replace '\('--but not '\\('--with '\%(' and ',' with '\|'. " Replace '\('--but not '\\('--with '\%(' and ',' with '\|'.
let openpat = substitute(open, '\%(' . s:notslash . '\)\@<=\\(', '\\%(', 'g') let openpat = substitute(open, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
let openpat = substitute(openpat, ',', '\\|', 'g') let openpat = substitute(openpat, ',', '\\|', 'g')
let closepat = substitute(close, '\%(' . s:notslash . '\)\@<=\\(', '\\%(', 'g') let closepat = substitute(close, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
let closepat = substitute(closepat, ',', '\\|', 'g') let closepat = substitute(closepat, ',', '\\|', 'g')
let middlepat = substitute(middle, '\%(' . s:notslash . '\)\@<=\\(', '\\%(', 'g') let middlepat = substitute(middle, '\%(' .. s:notslash .. '\)\@<=\\(', '\\%(', 'g')
let middlepat = substitute(middlepat, ',', '\\|', 'g') let middlepat = substitute(middlepat, ',', '\\|', 'g')
if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on")) if skip =~ 'synID' && !(has("syntax") && exists("g:syntax_on"))
let skip = '0' let skip = '0'
else else
try try
execute "if " . skip . "| let skip = '0' | endif" execute "if " .. skip .. "| let skip = '0' | endif"
catch /^Vim\%((\a\+)\)\=:E363/ catch /^Vim\%((\a\+)\)\=:E363/
" We won't find anything, so skip searching, should keep Vim responsive. " We won't find anything, so skip searching, should keep Vim responsive.
return {} return {}
@ -744,11 +757,11 @@ fun! s:ParseSkip(str)
let skip = a:str let skip = a:str
if skip[1] == ":" if skip[1] == ":"
if skip[0] == "s" if skip[0] == "s"
let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" . let skip = "synIDattr(synID(line('.'),col('.'),1),'name') =~? '" ..
\ strpart(skip,2) . "'" \ strpart(skip,2) .. "'"
elseif skip[0] == "S" elseif skip[0] == "S"
let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" . let skip = "synIDattr(synID(line('.'),col('.'),1),'name') !~? '" ..
\ strpart(skip,2) . "'" \ strpart(skip,2) .. "'"
elseif skip[0] == "r" elseif skip[0] == "r"
let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'" let skip = "strpart(getline('.'),0,col('.'))=~'" . strpart(skip,2). "'"
elseif skip[0] == "R" elseif skip[0] == "R"

View File

@ -4,7 +4,7 @@ For instructions on installing this file, type
`:help matchit-install` `:help matchit-install`
inside Vim. inside Vim.
For Vim version 8.1. Last change: 2021 Nov 13 For Vim version 8.2. Last change: 2021 Dec 24
VIM REFERENCE MANUAL by Benji Fisher et al VIM REFERENCE MANUAL by Benji Fisher et al
@ -150,6 +150,10 @@ To use the matchit plugin add this line to your |vimrc|: >
The script should start working the next time you start Vim. The script should start working the next time you start Vim.
To use the matchit plugin after startup, you can use this command (note the
omitted '!'): >
packadd matchit
(Earlier versions of the script did nothing unless a |buffer-variable| named (Earlier versions of the script did nothing unless a |buffer-variable| named
|b:match_words| was defined. Even earlier versions contained autocommands |b:match_words| was defined. Even earlier versions contained autocommands
that set this variable for various file types. Now, |b:match_words| is that set this variable for various file types. Now, |b:match_words| is
@ -378,8 +382,8 @@ The back reference '\'.d refers to the same thing as '\'.b:match_table[d] in
5. Known Bugs and Limitations *matchit-bugs* 5. Known Bugs and Limitations *matchit-bugs*
Repository: https://github.com/chrisbra/matchit/ Repository: https://github.com/chrisbra/matchit/
Bugs can be reported at the repository (alternatively you can send me a mail). Bugs can be reported at the repository and the latest development snapshot can
The latest development snapshot can also be downloaded there. also be downloaded there.
Just because I know about a bug does not mean that it is on my todo list. I Just because I know about a bug does not mean that it is on my todo list. I
try to respond to reports of bugs that cause real problems. If it does not try to respond to reports of bugs that cause real problems. If it does not

View File

@ -1,7 +1,7 @@
" matchit.vim: (global plugin) Extended "%" matching " matchit.vim: (global plugin) Extended "%" matching
" Maintainer: Christian Brabandt " Maintainer: Christian Brabandt
" Version: 1.17 " Version: 1.18
" Last Change: 2019 Oct 24 " Last Change: 2020 Dec 23
" Repository: https://github.com/chrisbra/matchit " Repository: https://github.com/chrisbra/matchit
" Previous URL:http://www.vim.org/script.php?script_id=39 " Previous URL:http://www.vim.org/script.php?script_id=39
" Previous Maintainer: Benji Fisher PhD <benji@member.AMS.org> " Previous Maintainer: Benji Fisher PhD <benji@member.AMS.org>
@ -48,18 +48,12 @@ set cpo&vim
nnoremap <silent> <Plug>(MatchitNormalForward) :<C-U>call matchit#Match_wrapper('',1,'n')<CR> nnoremap <silent> <Plug>(MatchitNormalForward) :<C-U>call matchit#Match_wrapper('',1,'n')<CR>
nnoremap <silent> <Plug>(MatchitNormalBackward) :<C-U>call matchit#Match_wrapper('',0,'n')<CR> nnoremap <silent> <Plug>(MatchitNormalBackward) :<C-U>call matchit#Match_wrapper('',0,'n')<CR>
xnoremap <silent> <Plug>(MatchitVisualForward) :<C-U>call matchit#Match_wrapper('',1,'v')<CR>m'gv`` xnoremap <silent> <Plug>(MatchitVisualForward) :<C-U>call matchit#Match_wrapper('',1,'v')<CR>
\:if col("''") != col("$") \| exe ":normal! m'" \| endif<cr>gv``
xnoremap <silent> <Plug>(MatchitVisualBackward) :<C-U>call matchit#Match_wrapper('',0,'v')<CR>m'gv`` xnoremap <silent> <Plug>(MatchitVisualBackward) :<C-U>call matchit#Match_wrapper('',0,'v')<CR>m'gv``
onoremap <silent> <Plug>(MatchitOperationForward) :<C-U>call matchit#Match_wrapper('',1,'o')<CR> onoremap <silent> <Plug>(MatchitOperationForward) :<C-U>call matchit#Match_wrapper('',1,'o')<CR>
onoremap <silent> <Plug>(MatchitOperationBackward) :<C-U>call matchit#Match_wrapper('',0,'o')<CR> onoremap <silent> <Plug>(MatchitOperationBackward) :<C-U>call matchit#Match_wrapper('',0,'o')<CR>
nmap <silent> % <Plug>(MatchitNormalForward)
nmap <silent> g% <Plug>(MatchitNormalBackward)
xmap <silent> % <Plug>(MatchitVisualForward)
xmap <silent> g% <Plug>(MatchitVisualBackward)
omap <silent> % <Plug>(MatchitOperationForward)
omap <silent> g% <Plug>(MatchitOperationBackward)
" Analogues of [{ and ]} using matching patterns: " Analogues of [{ and ]} using matching patterns:
nnoremap <silent> <Plug>(MatchitNormalMultiBackward) :<C-U>call matchit#MultiMatch("bW", "n")<CR> nnoremap <silent> <Plug>(MatchitNormalMultiBackward) :<C-U>call matchit#MultiMatch("bW", "n")<CR>
nnoremap <silent> <Plug>(MatchitNormalMultiForward) :<C-U>call matchit#MultiMatch("W", "n")<CR> nnoremap <silent> <Plug>(MatchitNormalMultiForward) :<C-U>call matchit#MultiMatch("W", "n")<CR>
@ -68,16 +62,28 @@ xnoremap <silent> <Plug>(MatchitVisualMultiForward) :<C-U>call matchit#Multi
onoremap <silent> <Plug>(MatchitOperationMultiBackward) :<C-U>call matchit#MultiMatch("bW", "o")<CR> onoremap <silent> <Plug>(MatchitOperationMultiBackward) :<C-U>call matchit#MultiMatch("bW", "o")<CR>
onoremap <silent> <Plug>(MatchitOperationMultiForward) :<C-U>call matchit#MultiMatch("W", "o")<CR> onoremap <silent> <Plug>(MatchitOperationMultiForward) :<C-U>call matchit#MultiMatch("W", "o")<CR>
nmap <silent> [% <Plug>(MatchitNormalMultiBackward)
nmap <silent> ]% <Plug>(MatchitNormalMultiForward)
xmap <silent> [% <Plug>(MatchitVisualMultiBackward)
xmap <silent> ]% <Plug>(MatchitVisualMultiForward)
omap <silent> [% <Plug>(MatchitOperationMultiBackward)
omap <silent> ]% <Plug>(MatchitOperationMultiForward)
" text object: " text object:
xmap <silent> <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward) xmap <silent> <Plug>(MatchitVisualTextObject) <Plug>(MatchitVisualMultiBackward)o<Plug>(MatchitVisualMultiForward)
xmap a% <Plug>(MatchitVisualTextObject)
if !exists("g:no_plugin_maps")
nmap <silent> % <Plug>(MatchitNormalForward)
nmap <silent> g% <Plug>(MatchitNormalBackward)
xmap <silent> % <Plug>(MatchitVisualForward)
xmap <silent> g% <Plug>(MatchitVisualBackward)
omap <silent> % <Plug>(MatchitOperationForward)
omap <silent> g% <Plug>(MatchitOperationBackward)
" Analogues of [{ and ]} using matching patterns:
nmap <silent> [% <Plug>(MatchitNormalMultiBackward)
nmap <silent> ]% <Plug>(MatchitNormalMultiForward)
xmap <silent> [% <Plug>(MatchitVisualMultiBackward)
xmap <silent> ]% <Plug>(MatchitVisualMultiForward)
omap <silent> [% <Plug>(MatchitOperationMultiBackward)
omap <silent> ]% <Plug>(MatchitOperationMultiForward)
" Text object
xmap a% <Plug>(MatchitVisualTextObject)
endif
" Call this function to turn on debugging information. Every time the main " 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 " script is run, buffer variables will be saved. These can be used directly

View File

@ -104,6 +104,10 @@ call s:Highlight(1, '', &background)
hi default debugBreakpoint term=reverse ctermbg=red guibg=red hi default debugBreakpoint term=reverse ctermbg=red guibg=red
hi default debugBreakpointDisabled term=reverse ctermbg=gray guibg=gray hi default debugBreakpointDisabled term=reverse ctermbg=gray guibg=gray
func s:GetCommand()
return type(g:termdebugger) == v:t_list ? copy(g:termdebugger) : [g:termdebugger]
endfunc
func s:StartDebug(bang, ...) func s:StartDebug(bang, ...)
" First argument is the command to debug, second core file or process ID. " First argument is the command to debug, second core file or process ID.
call s:StartDebug_internal({'gdb_args': a:000, 'bang': a:bang}) call s:StartDebug_internal({'gdb_args': a:000, 'bang': a:bang})
@ -119,8 +123,9 @@ func s:StartDebug_internal(dict)
echoerr 'Terminal debugger already running, cannot run two' echoerr 'Terminal debugger already running, cannot run two'
return return
endif endif
if !executable(g:termdebugger) let gdbcmd = s:GetCommand()
echoerr 'Cannot execute debugger program "' .. g:termdebugger .. '"' if !executable(gdbcmd[0])
echoerr 'Cannot execute debugger program "' .. gdbcmd[0] .. '"'
return return
endif endif
@ -192,7 +197,7 @@ endfunc
func s:CheckGdbRunning() func s:CheckGdbRunning()
if nvim_get_chan_info(s:gdb_job_id) == {} if nvim_get_chan_info(s:gdb_job_id) == {}
echoerr string(g:termdebugger) . ' exited unexpectedly' echoerr string(s:GetCommand()[0]) . ' exited unexpectedly'
call s:CloseBuffers() call s:CloseBuffers()
return '' return ''
endif endif
@ -245,7 +250,7 @@ func s:StartDebug_term(dict)
let gdb_args = get(a:dict, 'gdb_args', []) let gdb_args = get(a:dict, 'gdb_args', [])
let proc_args = get(a:dict, 'proc_args', []) let proc_args = get(a:dict, 'proc_args', [])
let gdb_cmd = [g:termdebugger] let gdb_cmd = s:GetCommand()
" Add -quiet to avoid the intro message causing a hit-enter prompt. " Add -quiet to avoid the intro message causing a hit-enter prompt.
let gdb_cmd += ['-quiet'] let gdb_cmd += ['-quiet']
" Disable pagination, it causes everything to stop at the gdb " Disable pagination, it causes everything to stop at the gdb
@ -379,7 +384,7 @@ func s:StartDebug_prompt(dict)
let gdb_args = get(a:dict, 'gdb_args', []) let gdb_args = get(a:dict, 'gdb_args', [])
let proc_args = get(a:dict, 'proc_args', []) let proc_args = get(a:dict, 'proc_args', [])
let gdb_cmd = [g:termdebugger] let gdb_cmd = s:GetCommand()
" Add -quiet to avoid the intro message causing a hit-enter prompt. " Add -quiet to avoid the intro message causing a hit-enter prompt.
let gdb_cmd += ['-quiet'] let gdb_cmd += ['-quiet']
" Disable pagination, it causes everything to stop at the gdb, needs to be run early " Disable pagination, it causes everything to stop at the gdb, needs to be run early

View File

@ -3,7 +3,7 @@
" Maintainer: Debian Vim Maintainers " Maintainer: Debian Vim Maintainers
" Former Maintainers: Gerfried Fuchs <alfie@ist.org> " Former Maintainers: Gerfried Fuchs <alfie@ist.org>
" Wichert Akkerman <wakkerma@debian.org> " Wichert Akkerman <wakkerma@debian.org>
" Last Change: 2020 Oct 26 " Last Change: 2021 Nov 26
" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim " URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/debcontrol.vim
" Standard syntax initialization " Standard syntax initialization
@ -91,6 +91,11 @@ syn case ignore
" Handle all fields from deb-src-control(5) " Handle all fields from deb-src-control(5)
" Catch-all for the legal fields
syn region debcontrolField matchgroup=debcontrolKey start="^\%(\%(XSBC-Original-\)\=Maintainer\|Standards-Version\|Bugs\|Origin\|X[SB]-Python-Version\|\%(XS-\)\=Vcs-Mtn\|\%(XS-\)\=Testsuite\%(-Triggers\)\=\|Build-Profiles\|Tag\|Subarchitecture\|Kernel-Version\|Installer-Menu-Item\): " end="$" contains=debcontrolVariable,debcontrolEmail oneline
syn region debcontrolMultiField matchgroup=debcontrolKey start="^\%(Build-\%(Conflicts\|Depends\)\%(-Arch\|-Indep\)\=\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Breaks\|Enhances\|Replaces\|Conflicts\|Provides\|Built-Using\|Uploaders\|X[SBC]\{0,3\}\%(Private-\)\=-[-a-zA-Z0-9]\+\): *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment
syn region debcontrolMultiFieldSpell matchgroup=debcontrolKey start="^Description: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment,@Spell
" Fields for which we do strict syntax checking " Fields for which we do strict syntax checking
syn region debcontrolStrictField matchgroup=debcontrolKey start="^Architecture: *" end="$" contains=debcontrolArchitecture,debcontrolSpace oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^Architecture: *" end="$" contains=debcontrolArchitecture,debcontrolSpace oneline
syn region debcontrolStrictField matchgroup=debcontrolKey start="^Multi-Arch: *" end="$" contains=debcontrolMultiArch oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^Multi-Arch: *" end="$" contains=debcontrolMultiArch oneline
@ -99,20 +104,15 @@ syn region debcontrolStrictField matchgroup=debcontrolKey start="^Priority: *" e
syn region debcontrolStrictField matchgroup=debcontrolKey start="^Section: *" end="$" contains=debcontrolSection oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^Section: *" end="$" contains=debcontrolSection oneline
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XC-\)\=Package-Type: *" end="$" contains=debcontrolPackageType oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XC-\)\=Package-Type: *" end="$" contains=debcontrolPackageType oneline
syn region debcontrolStrictField matchgroup=debcontrolKey start="^Homepage: *" end="$" contains=debcontrolHTTPUrl oneline keepend syn region debcontrolStrictField matchgroup=debcontrolKey start="^Homepage: *" end="$" contains=debcontrolHTTPUrl oneline keepend
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\): *" end="$" contains=debcontrolHTTPUrl oneline keepend syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-\%(Browser\|Arch\|Bzr\|Darcs\|Hg\): *" end="$" contains=debcontrolHTTPUrl oneline keepend
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Svn: *" end="$" contains=debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-Svn: *" end="$" contains=debcontrolVcsSvn,debcontrolHTTPUrl oneline keepend
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Cvs: *" end="$" contains=debcontrolVcsCvs oneline keepend syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-Cvs: *" end="$" contains=debcontrolVcsCvs oneline keepend
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-\)\=Vcs-Git: *" end="$" contains=debcontrolVcsGit oneline keepend syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(XS-[-a-zA-Z0-9]\+-\)\=Vcs-Git: *" end="$" contains=debcontrolVcsGit oneline keepend
syn region debcontrolStrictField matchgroup=debcontrolKey start="^Rules-Requires-Root: *" end="$" contains=debcontrolR3 oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^Rules-Requires-Root: *" end="$" contains=debcontrolR3 oneline
syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Build-\)\=Essential: *" end="$" contains=debcontrolYesNo oneline syn region debcontrolStrictField matchgroup=debcontrolKey start="^\%(Build-\)\=Essential: *" end="$" contains=debcontrolYesNo oneline
syn region debcontrolStrictField matchgroup=debcontrolDeprecatedKey start="^\%(XS-\)\=DM-Upload-Allowed: *" end="$" contains=debcontrolDmUpload oneline syn region debcontrolStrictField matchgroup=debcontrolDeprecatedKey start="^\%(XS-\)\=DM-Upload-Allowed: *" end="$" contains=debcontrolDmUpload oneline
" Catch-all for the other legal fields
syn region debcontrolField matchgroup=debcontrolKey start="^\%(\%(XSBC-Original-\)\=Maintainer\|Standards-Version\|Bugs\|Origin\|X[SB]-Python-Version\|\%(XS-\)\=Vcs-Mtn\|\%(XS-\)\=Testsuite\%(-Triggers\)\=\|Build-Profiles\|Tag\|Subarchitecture\|Kernel-Version\|Installer-Menu-Item\): " end="$" contains=debcontrolVariable,debcontrolEmail oneline
syn region debcontrolMultiField matchgroup=debcontrolKey start="^\%(Build-\%(Conflicts\|Depends\)\%(-Arch\|-Indep\)\=\|\%(Pre-\)\=Depends\|Recommends\|Suggests\|Breaks\|Enhances\|Replaces\|Conflicts\|Provides\|Built-Using\|Uploaders\|X[SBC]\{0,3\}\%(Private-\)\=-[-a-zA-Z0-9]\+\): *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment
syn region debcontrolMultiFieldSpell matchgroup=debcontrolKey start="^Description: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contains=debcontrolEmail,debcontrolVariable,debcontrolComment,@Spell
" Associate our matches and regions with pretty colours " Associate our matches and regions with pretty colours
hi def link debcontrolKey Keyword hi def link debcontrolKey Keyword
hi def link debcontrolField Normal hi def link debcontrolField Normal

View File

@ -0,0 +1,57 @@
" Vim syntax file
" Language: Debian DEP3 Patch headers
" Maintainer: Gabriel Filion <gabster@lelutin.ca>
" Last Change: 2021-01-09
" URL: https://salsa.debian.org/vim-team/vim-debian/blob/master/syntax/dep3patch.vim
"
" Specification of the DEP3 patch header format is available at:
" https://dep-team.pages.debian.net/deps/dep3/
" Standard syntax initialization
if exists('b:current_syntax')
finish
endif
runtime! syntax/diff.vim
unlet! b:current_syntax
let s:cpo_save = &cpo
set cpo&vim
syn region dep3patchHeaders start="\%^" end="^\%(---\)\@=" contains=dep3patchKey,dep3patchMultiField
syn case ignore
syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Description\|Subject\)\ze: *" skip="^[ \t]" end="^$"me=s-1 end="^[^ \t#]"me=s-1 contained contains=@Spell
syn region dep3patchMultiField matchgroup=dep3patchKey start="^Origin\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchCommitID,dep3patchOriginCategory oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^Bug\%(-[[:graph:]]\+\)\?\ze: *" end="$" contained contains=dep3patchHTTPUrl oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^Forwarded\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchForwardedShort oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Author\|From\)\ze: *" end="$" contained contains=dep3patchEmail oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^\%(Reviewed-by\|Acked-by\)\ze: *" end="$" contained contains=dep3patchEmail oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^Last-Updated\ze: *" end="$" contained contains=dep3patchISODate oneline keepend
syn region dep3patchMultiField matchgroup=dep3patchKey start="^Applied-Upstream\ze: *" end="$" contained contains=dep3patchHTTPUrl,dep3patchCommitID oneline keepend
syn match dep3patchHTTPUrl contained "\vhttps?://[[:alnum:]][-[:alnum:]]*[[:alnum:]]?(\.[[:alnum:]][-[:alnum:]]*[[:alnum:]]?)*\.[[:alpha:]][-[:alnum:]]*[[:alpha:]]?(:\d+)?(/[^[:space:]]*)?$"
syn match dep3patchCommitID contained "commit:[[:alnum:]]\+"
syn match dep3patchOriginCategory contained "\%(upstream\|backport\|vendor\|other\), "
syn match dep3patchForwardedShort contained "\%(yes\|no\|not-needed\), "
syn match dep3patchEmail "[_=[:alnum:]\.+-]\+@[[:alnum:]\./\-]\+"
syn match dep3patchEmail "<.\{-}>"
syn match dep3patchISODate "[[:digit:]]\{4}-[[:digit:]]\{2}-[[:digit:]]\{2}"
" Associate our matches and regions with pretty colours
hi def link dep3patchKey Keyword
hi def link dep3patchOriginCategory Keyword
hi def link dep3patchForwardedShort Keyword
hi def link dep3patchMultiField Normal
hi def link dep3patchHTTPUrl Identifier
hi def link dep3patchCommitID Identifier
hi def link dep3patchEmail Identifier
hi def link dep3patchISODate Identifier
let b:current_syntax = 'dep3patch'
let &cpo = s:cpo_save
unlet s:cpo_save
" vim: ts=8 sw=2

View File

@ -45,7 +45,7 @@ if !exists("dtd_no_tag_errors")
syn region dtdError contained start=+<!+lc=2 end=+>+ syn region dtdError contained start=+<!+lc=2 end=+>+
endif endif
" if this is a html like comment hightlight also " if this is a html like comment highlight also
" the opening <! and the closing > as Comment. " the opening <! and the closing > as Comment.
syn region dtdComment start=+<![ \t]*--+ end=+-->+ contains=dtdTodo,@Spell syn region dtdComment start=+<![ \t]*--+ end=+-->+ contains=dtdTodo,@Spell
@ -99,8 +99,8 @@ syn match dtdEntity "&[^; \t]*;" contains=dtdEntityPunct
syn match dtdEntityPunct contained "[&.;]" syn match dtdEntityPunct contained "[&.;]"
" Strings are between quotes " Strings are between quotes
syn region dtdString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=dtdAttrDef,dtdAttrType,dtdEnum,dtdParamEntityInst,dtdEntity,dtdCard syn region dtdString start=+"+ skip=+\\\\\|\\"+ end=+"+ contains=dtdAttrDef,dtdAttrType,dtdParamEntityInst,dtdEntity,dtdCard
syn region dtdString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=dtdAttrDef,dtdAttrType,dtdEnum,dtdParamEntityInst,dtdEntity,dtdCard syn region dtdString start=+'+ skip=+\\\\\|\\'+ end=+'+ contains=dtdAttrDef,dtdAttrType,dtdParamEntityInst,dtdEntity,dtdCard
" Enumeration of elements or data between parenthesis " Enumeration of elements or data between parenthesis
" "

View File

@ -10,6 +10,7 @@
" 20190923 - Fix xmlEndTag to match xmlTag (vim/vim#884) " 20190923 - Fix xmlEndTag to match xmlTag (vim/vim#884)
" 20190924 - Fix xmlAttribute property (amadeus/vim-xml@d8ce1c946) " 20190924 - Fix xmlAttribute property (amadeus/vim-xml@d8ce1c946)
" 20191103 - Enable spell checking globally " 20191103 - Enable spell checking globally
" 20210428 - Improve syntax synchronizing
" CONFIGURATION: " CONFIGURATION:
" syntax folding can be turned on by " syntax folding can be turned on by
@ -302,9 +303,12 @@ unlet b:current_syntax
" synchronizing " synchronizing
" TODO !!! to be improved !!!
syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+ syn sync match xmlSyncComment grouphere xmlComment +<!--+
syn sync match xmlSyncComment groupthere NONE +-->+
" The following is slow on large documents (and the doctype is optional
" syn sync match xmlSyncDT grouphere xmlDocType +\_.\(<!DOCTYPE\)\@=+
" syn sync match xmlSyncDT groupthere NONE +]>+ " syn sync match xmlSyncDT groupthere NONE +]>+
if exists('g:xml_syntax_folding') if exists('g:xml_syntax_folding')
@ -313,7 +317,7 @@ if exists('g:xml_syntax_folding')
syn sync match xmlSync groupthere xmlRegion +</[^ /!?<>"']\+>+ syn sync match xmlSync groupthere xmlRegion +</[^ /!?<>"']\+>+
endif endif
syn sync minlines=100 syn sync minlines=100 maxlines=200
" The default highlighting. " The default highlighting.
@ -354,4 +358,4 @@ let b:current_syntax = "xml"
let &cpo = s:xml_cpo_save let &cpo = s:xml_cpo_save
unlet s:xml_cpo_save unlet s:xml_cpo_save
" vim: ts=8 " vim: ts=4

View File

@ -41,11 +41,12 @@ if get(g:, 'zsh_fold_enable', 0)
setlocal foldmethod=syntax setlocal foldmethod=syntax
endif endif
syn match zshQuoted '\\.'
syn match zshPOSIXQuoted '\\[xX][0-9a-fA-F]\{1,2}' syn match zshPOSIXQuoted '\\[xX][0-9a-fA-F]\{1,2}'
syn match zshPOSIXQuoted '\\[0-7]\{1,3}' syn match zshPOSIXQuoted '\\[0-7]\{1,3}'
syn match zshPOSIXQuoted '\\u[0-9a-fA-F]\{1,4}' syn match zshPOSIXQuoted '\\u[0-9a-fA-F]\{1,4}'
syn match zshPOSIXQuoted '\\U[1-9a-fA-F]\{1,8}' syn match zshPOSIXQuoted '\\U[1-9a-fA-F]\{1,8}'
syn match zshQuoted '\\.'
syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+ syn region zshString matchgroup=zshStringDelimiter start=+"+ end=+"+
\ contains=zshQuoted,@zshDerefs,@zshSubst fold \ contains=zshQuoted,@zshDerefs,@zshSubst fold
syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+ fold syn region zshString matchgroup=zshStringDelimiter start=+'+ end=+'+ fold
@ -133,217 +134,15 @@ syn keyword zshCommands alias autoload bg bindkey break bye cap cd
\ zmodload zparseopts zprof zpty zrecompile \ zmodload zparseopts zprof zpty zrecompile
\ zregexparse zsocket zstyle ztcp \ zregexparse zsocket zstyle ztcp
" Options, generated by: echo ${(j:\n:)options[(I)*]} | sort " Options, generated by from the zsh source with the make-options.zsh script.
" Create a list of option names from zsh source dir:
" #!/bin/zsh
" topdir=/path/to/zsh-xxx
" grep '^pindex([A-Za-z_]*)$' $topdir/Doc/Zsh/options.yo |
" while read opt
" do
" echo ${${(L)opt#pindex\(}%\)}
" done
syn case ignore syn case ignore
syn match zshOptStart
syn match zshOptStart /^\s*\%(\%(\%(un\)\?setopt\)\|set\s+[-+]o\)/ nextgroup=zshOption skipwhite \ /\v^\s*%(%(un)?setopt|set\s+[-+]o)/
syn match zshOption / \ nextgroup=zshOption skipwhite
\ \%(\%(\<no_\?\)\?aliases\>\)\| syn match zshOption nextgroup=zshOption,zshComment skipwhite contained /\v
\ \%(\%(\<no_\?\)\?aliasfuncdef\>\)\|\%(\%(no_\?\)\?alias_func_def\>\)\| \ <%(no_?)?%(
\ \%(\%(\<no_\?\)\?allexport\>\)\|\%(\%(no_\?\)\?all_export\>\)\| \ auto_?cd|auto_?pushd|cdable_?vars|cd_?silent|chase_?dots|chase_?links|posix_?cd|pushd_?ignore_?dups|pushd_?minus|pushd_?silent|pushd_?to_?home|always_?last_?prompt|always_?to_?end|auto_?list|auto_?menu|auto_?name_?dirs|auto_?param_?keys|auto_?param_?slash|auto_?remove_?slash|bash_?auto_?list|complete_?aliases|complete_?in_?word|glob_?complete|hash_?list_?all|list_?ambiguous|list_?beep|list_?packed|list_?rows_?first|list_?types|menu_?complete|rec_?exact|bad_?pattern|bare_?glob_?qual|brace_?ccl|case_?glob|case_?match|case_?paths|csh_?null_?glob|equals|extended_?glob|force_?float|glob|glob_?assign|glob_?dots|glob_?star_?short|glob_?subst|hist_?subst_?pattern|ignore_?braces|ignore_?close_?braces|ksh_?glob|magic_?equal_?subst|mark_?dirs|multibyte|nomatch|null_?glob|numeric_?glob_?sort|rc_?expand_?param|rematch_?pcre|sh_?glob|unset|warn_?create_?global|warn_?nested_?var|warnnestedvar|append_?history|bang_?hist|extended_?history|hist_?allow_?clobber|hist_?beep|hist_?expire_?dups_?first|hist_?fcntl_?lock|hist_?find_?no_?dups|hist_?ignore_?all_?dups|hist_?ignore_?dups|hist_?ignore_?space|hist_?lex_?words|hist_?no_?functions|hist_?no_?store|hist_?reduce_?blanks|hist_?save_?by_?copy|hist_?save_?no_?dups|hist_?verify|inc_?append_?history|inc_?append_?history_?time|share_?history|all_?export|global_?export|global_?rcs|rcs|aliases|clobber|clobber_?empty|correct|correct_?all|dvorak|flow_?control|ignore_?eof|interactive_?comments|hash_?cmds|hash_?dirs|hash_?executables_?only|mail_?warning|path_?dirs|path_?script|print_?eight_?bit|print_?exit_?value|rc_?quotes|rm_?star_?silent|rm_?star_?wait|short_?loops|short_?repeat|sun_?keyboard_?hack|auto_?continue|auto_?resume|bg_?nice|check_?jobs|check_?running_?jobs|hup|long_?list_?jobs|monitor|notify|posix_?jobs|prompt_?bang|prompt_?cr|prompt_?sp|prompt_?percent|prompt_?subst|transient_?rprompt|alias_?func_?def|c_?bases|c_?precedences|debug_?before_?cmd|err_?exit|err_?return|eval_?lineno|exec|function_?argzero|local_?loops|local_?options|local_?patterns|local_?traps|multi_?func_?def|multios|octal_?zeroes|pipe_?fail|source_?trace|typeset_?silent|typeset_?to_?unset|verbose|xtrace|append_?create|bash_?rematch|bsd_?echo|continue_?on_?error|csh_?junkie_?history|csh_?junkie_?loops|csh_?junkie_?quotes|csh_?nullcmd|ksh_?arrays|ksh_?autoload|ksh_?option_?print|ksh_?typeset|ksh_?zero_?subscript|posix_?aliases|posix_?argzero|posix_?builtins|posix_?identifiers|posix_?strings|posix_?traps|sh_?file_?expansion|sh_?nullcmd|sh_?option_?letters|sh_?word_?split|traps_?async|interactive|login|privileged|restricted|shin_?stdin|single_?command|beep|combining_?chars|emacs|overstrike|single_?line_?zle|vi|zle|brace_?expand|dot_?glob|hash_?all|hist_?append|hist_?expand|log|mail_?warn|one_?cmd|physical|prompt_?vars|stdin|track_?all|no_?match
\ \%(\%(\<no_\?\)\?alwayslastprompt\>\)\|\%(\%(no_\?\)\?always_last_prompt\>\)\|\%(\%(no_\?\)\?always_lastprompt\>\)\| \)>/
\ \%(\%(\<no_\?\)\?alwaystoend\>\)\|\%(\%(no_\?\)\?always_to_end\>\)\|
\ \%(\%(\<no_\?\)\?appendcreate\>\)\|\%(\%(no_\?\)\?append_create\>\)\|
\ \%(\%(\<no_\?\)\?appendhistory\>\)\|\%(\%(no_\?\)\?append_history\>\)\|
\ \%(\%(\<no_\?\)\?autocd\>\)\|\%(\%(no_\?\)\?auto_cd\>\)\|
\ \%(\%(\<no_\?\)\?autocontinue\>\)\|\%(\%(no_\?\)\?auto_continue\>\)\|
\ \%(\%(\<no_\?\)\?autolist\>\)\|\%(\%(no_\?\)\?auto_list\>\)\|
\ \%(\%(\<no_\?\)\?automenu\>\)\|\%(\%(no_\?\)\?auto_menu\>\)\|
\ \%(\%(\<no_\?\)\?autonamedirs\>\)\|\%(\%(no_\?\)\?auto_name_dirs\>\)\|
\ \%(\%(\<no_\?\)\?autoparamkeys\>\)\|\%(\%(no_\?\)\?auto_param_keys\>\)\|
\ \%(\%(\<no_\?\)\?autoparamslash\>\)\|\%(\%(no_\?\)\?auto_param_slash\>\)\|
\ \%(\%(\<no_\?\)\?autopushd\>\)\|\%(\%(no_\?\)\?auto_pushd\>\)\|
\ \%(\%(\<no_\?\)\?autoremoveslash\>\)\|\%(\%(no_\?\)\?auto_remove_slash\>\)\|
\ \%(\%(\<no_\?\)\?autoresume\>\)\|\%(\%(no_\?\)\?auto_resume\>\)\|
\ \%(\%(\<no_\?\)\?badpattern\>\)\|\%(\%(no_\?\)\?bad_pattern\>\)\|
\ \%(\%(\<no_\?\)\?banghist\>\)\|\%(\%(no_\?\)\?bang_hist\>\)\|
\ \%(\%(\<no_\?\)\?bareglobqual\>\)\|\%(\%(no_\?\)\?bare_glob_qual\>\)\|
\ \%(\%(\<no_\?\)\?bashautolist\>\)\|\%(\%(no_\?\)\?bash_auto_list\>\)\|
\ \%(\%(\<no_\?\)\?bashrematch\>\)\|\%(\%(no_\?\)\?bash_rematch\>\)\|
\ \%(\%(\<no_\?\)\?beep\>\)\|
\ \%(\%(\<no_\?\)\?bgnice\>\)\|\%(\%(no_\?\)\?bg_nice\>\)\|
\ \%(\%(\<no_\?\)\?braceccl\>\)\|\%(\%(no_\?\)\?brace_ccl\>\)\|
\ \%(\%(\<no_\?\)\?braceexpand\>\)\|\%(\%(no_\?\)\?brace_expand\>\)\|
\ \%(\%(\<no_\?\)\?bsdecho\>\)\|\%(\%(no_\?\)\?bsd_echo\>\)\|
\ \%(\%(\<no_\?\)\?caseglob\>\)\|\%(\%(no_\?\)\?case_glob\>\)\|
\ \%(\%(\<no_\?\)\?casematch\>\)\|\%(\%(no_\?\)\?case_match\>\)\|
\ \%(\%(\<no_\?\)\?cbases\>\)\|\%(\%(no_\?\)\?c_bases\>\)\|
\ \%(\%(\<no_\?\)\?cdablevars\>\)\|\%(\%(no_\?\)\?cdable_vars\>\)\|\%(\%(no_\?\)\?cd_able_vars\>\)\|
\ \%(\%(\<no_\?\)\?cdsilent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|\%(\%(no_\?\)\?cd_silent\>\)\|
\ \%(\%(\<no_\?\)\?chasedots\>\)\|\%(\%(no_\?\)\?chase_dots\>\)\|
\ \%(\%(\<no_\?\)\?chaselinks\>\)\|\%(\%(no_\?\)\?chase_links\>\)\|
\ \%(\%(\<no_\?\)\?checkjobs\>\)\|\%(\%(no_\?\)\?check_jobs\>\)\|
\ \%(\%(\<no_\?\)\?checkrunningjobs\>\)\|\%(\%(no_\?\)\?check_running_jobs\>\)\|
\ \%(\%(\<no_\?\)\?clobber\>\)\|
\ \%(\%(\<no_\?\)\?clobberempty\>\)\|\%(\%(no_\?\)\?clobber_empty\>\)\|
\ \%(\%(\<no_\?\)\?combiningchars\>\)\|\%(\%(no_\?\)\?combining_chars\>\)\|
\ \%(\%(\<no_\?\)\?completealiases\>\)\|\%(\%(no_\?\)\?complete_aliases\>\)\|
\ \%(\%(\<no_\?\)\?completeinword\>\)\|\%(\%(no_\?\)\?complete_in_word\>\)\|
\ \%(\%(\<no_\?\)\?continueonerror\>\)\|\%(\%(no_\?\)\?continue_on_error\>\)\|
\ \%(\%(\<no_\?\)\?correct\>\)\|
\ \%(\%(\<no_\?\)\?correctall\>\)\|\%(\%(no_\?\)\?correct_all\>\)\|
\ \%(\%(\<no_\?\)\?cprecedences\>\)\|\%(\%(no_\?\)\?c_precedences\>\)\|
\ \%(\%(\<no_\?\)\?cshjunkiehistory\>\)\|\%(\%(no_\?\)\?csh_junkie_history\>\)\|
\ \%(\%(\<no_\?\)\?cshjunkieloops\>\)\|\%(\%(no_\?\)\?csh_junkie_loops\>\)\|
\ \%(\%(\<no_\?\)\?cshjunkiequotes\>\)\|\%(\%(no_\?\)\?csh_junkie_quotes\>\)\|
\ \%(\%(\<no_\?\)\?csh_nullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|\%(\%(no_\?\)\?cshnullcmd\>\)\|\%(\%(no_\?\)\?csh_null_cmd\>\)\|
\ \%(\%(\<no_\?\)\?cshnullglob\>\)\|\%(\%(no_\?\)\?csh_null_glob\>\)\|
\ \%(\%(\<no_\?\)\?debugbeforecmd\>\)\|\%(\%(no_\?\)\?debug_before_cmd\>\)\|
\ \%(\%(\<no_\?\)\?dotglob\>\)\|\%(\%(no_\?\)\?dot_glob\>\)\|
\ \%(\%(\<no_\?\)\?dvorak\>\)\|
\ \%(\%(\<no_\?\)\?emacs\>\)\|
\ \%(\%(\<no_\?\)\?equals\>\)\|
\ \%(\%(\<no_\?\)\?errexit\>\)\|\%(\%(no_\?\)\?err_exit\>\)\|
\ \%(\%(\<no_\?\)\?errreturn\>\)\|\%(\%(no_\?\)\?err_return\>\)\|
\ \%(\%(\<no_\?\)\?evallineno\>\)\|\%(\%(no_\?\)\?eval_lineno\>\)\|
\ \%(\%(\<no_\?\)\?exec\>\)\|
\ \%(\%(\<no_\?\)\?extendedglob\>\)\|\%(\%(no_\?\)\?extended_glob\>\)\|
\ \%(\%(\<no_\?\)\?extendedhistory\>\)\|\%(\%(no_\?\)\?extended_history\>\)\|
\ \%(\%(\<no_\?\)\?flowcontrol\>\)\|\%(\%(no_\?\)\?flow_control\>\)\|
\ \%(\%(\<no_\?\)\?forcefloat\>\)\|\%(\%(no_\?\)\?force_float\>\)\|
\ \%(\%(\<no_\?\)\?functionargzero\>\)\|\%(\%(no_\?\)\?function_argzero\>\)\|\%(\%(no_\?\)\?function_arg_zero\>\)\|
\ \%(\%(\<no_\?\)\?glob\>\)\|
\ \%(\%(\<no_\?\)\?globalexport\>\)\|\%(\%(no_\?\)\?global_export\>\)\|
\ \%(\%(\<no_\?\)\?globalrcs\>\)\|\%(\%(no_\?\)\?global_rcs\>\)\|
\ \%(\%(\<no_\?\)\?globassign\>\)\|\%(\%(no_\?\)\?glob_assign\>\)\|
\ \%(\%(\<no_\?\)\?globcomplete\>\)\|\%(\%(no_\?\)\?glob_complete\>\)\|
\ \%(\%(\<no_\?\)\?globdots\>\)\|\%(\%(no_\?\)\?glob_dots\>\)\|
\ \%(\%(\<no_\?\)\?glob_subst\>\)\|\%(\%(no_\?\)\?globsubst\>\)\|
\ \%(\%(\<no_\?\)\?globstarshort\>\)\|\%(\%(no_\?\)\?glob_star_short\>\)\|
\ \%(\%(\<no_\?\)\?hashall\>\)\|\%(\%(no_\?\)\?hash_all\>\)\|
\ \%(\%(\<no_\?\)\?hashcmds\>\)\|\%(\%(no_\?\)\?hash_cmds\>\)\|
\ \%(\%(\<no_\?\)\?hashdirs\>\)\|\%(\%(no_\?\)\?hash_dirs\>\)\|
\ \%(\%(\<no_\?\)\?hashexecutablesonly\>\)\|\%(\%(no_\?\)\?hash_executables_only\>\)\|
\ \%(\%(\<no_\?\)\?hashlistall\>\)\|\%(\%(no_\?\)\?hash_list_all\>\)\|
\ \%(\%(\<no_\?\)\?histallowclobber\>\)\|\%(\%(no_\?\)\?hist_allow_clobber\>\)\|
\ \%(\%(\<no_\?\)\?histappend\>\)\|\%(\%(no_\?\)\?hist_append\>\)\|
\ \%(\%(\<no_\?\)\?histbeep\>\)\|\%(\%(no_\?\)\?hist_beep\>\)\|
\ \%(\%(\<no_\?\)\?hist_expand\>\)\|\%(\%(no_\?\)\?histexpand\>\)\|
\ \%(\%(\<no_\?\)\?hist_expire_dups_first\>\)\|\%(\%(no_\?\)\?histexpiredupsfirst\>\)\|
\ \%(\%(\<no_\?\)\?histfcntllock\>\)\|\%(\%(no_\?\)\?hist_fcntl_lock\>\)\|
\ \%(\%(\<no_\?\)\?histfindnodups\>\)\|\%(\%(no_\?\)\?hist_find_no_dups\>\)\|
\ \%(\%(\<no_\?\)\?histignorealldups\>\)\|\%(\%(no_\?\)\?hist_ignore_all_dups\>\)\|
\ \%(\%(\<no_\?\)\?histignoredups\>\)\|\%(\%(no_\?\)\?hist_ignore_dups\>\)\|
\ \%(\%(\<no_\?\)\?histignorespace\>\)\|\%(\%(no_\?\)\?hist_ignore_space\>\)\|
\ \%(\%(\<no_\?\)\?histlexwords\>\)\|\%(\%(no_\?\)\?hist_lex_words\>\)\|
\ \%(\%(\<no_\?\)\?histnofunctions\>\)\|\%(\%(no_\?\)\?hist_no_functions\>\)\|
\ \%(\%(\<no_\?\)\?histnostore\>\)\|\%(\%(no_\?\)\?hist_no_store\>\)\|
\ \%(\%(\<no_\?\)\?histreduceblanks\>\)\|\%(\%(no_\?\)\?hist_reduce_blanks\>\)\|
\ \%(\%(\<no_\?\)\?histsavebycopy\>\)\|\%(\%(no_\?\)\?hist_save_by_copy\>\)\|
\ \%(\%(\<no_\?\)\?histsavenodups\>\)\|\%(\%(no_\?\)\?hist_save_no_dups\>\)\|
\ \%(\%(\<no_\?\)\?histsubstpattern\>\)\|\%(\%(no_\?\)\?hist_subst_pattern\>\)\|
\ \%(\%(\<no_\?\)\?histverify\>\)\|\%(\%(no_\?\)\?hist_verify\>\)\|
\ \%(\%(\<no_\?\)\?hup\>\)\|
\ \%(\%(\<no_\?\)\?ignorebraces\>\)\|\%(\%(no_\?\)\?ignore_braces\>\)\|
\ \%(\%(\<no_\?\)\?ignoreclosebraces\>\)\|\%(\%(no_\?\)\?ignore_close_braces\>\)\|
\ \%(\%(\<no_\?\)\?ignoreeof\>\)\|\%(\%(no_\?\)\?ignore_eof\>\)\|
\ \%(\%(\<no_\?\)\?incappendhistory\>\)\|\%(\%(no_\?\)\?inc_append_history\>\)\|
\ \%(\%(\<no_\?\)\?incappendhistorytime\>\)\|\%(\%(no_\?\)\?inc_append_history_time\>\)\|
\ \%(\%(\<no_\?\)\?interactive\>\)\|
\ \%(\%(\<no_\?\)\?interactivecomments\>\)\|\%(\%(no_\?\)\?interactive_comments\>\)\|
\ \%(\%(\<no_\?\)\?ksharrays\>\)\|\%(\%(no_\?\)\?ksh_arrays\>\)\|
\ \%(\%(\<no_\?\)\?kshautoload\>\)\|\%(\%(no_\?\)\?ksh_autoload\>\)\|
\ \%(\%(\<no_\?\)\?kshglob\>\)\|\%(\%(no_\?\)\?ksh_glob\>\)\|
\ \%(\%(\<no_\?\)\?kshoptionprint\>\)\|\%(\%(no_\?\)\?ksh_option_print\>\)\|
\ \%(\%(\<no_\?\)\?kshtypeset\>\)\|\%(\%(no_\?\)\?ksh_typeset\>\)\|
\ \%(\%(\<no_\?\)\?kshzerosubscript\>\)\|\%(\%(no_\?\)\?ksh_zero_subscript\>\)\|
\ \%(\%(\<no_\?\)\?listambiguous\>\)\|\%(\%(no_\?\)\?list_ambiguous\>\)\|
\ \%(\%(\<no_\?\)\?listbeep\>\)\|\%(\%(no_\?\)\?list_beep\>\)\|
\ \%(\%(\<no_\?\)\?listpacked\>\)\|\%(\%(no_\?\)\?list_packed\>\)\|
\ \%(\%(\<no_\?\)\?listrowsfirst\>\)\|\%(\%(no_\?\)\?list_rows_first\>\)\|
\ \%(\%(\<no_\?\)\?listtypes\>\)\|\%(\%(no_\?\)\?list_types\>\)\|
\ \%(\%(\<no_\?\)\?localloops\>\)\|\%(\%(no_\?\)\?local_loops\>\)\|
\ \%(\%(\<no_\?\)\?localoptions\>\)\|\%(\%(no_\?\)\?local_options\>\)\|
\ \%(\%(\<no_\?\)\?localpatterns\>\)\|\%(\%(no_\?\)\?local_patterns\>\)\|
\ \%(\%(\<no_\?\)\?localtraps\>\)\|\%(\%(no_\?\)\?local_traps\>\)\|
\ \%(\%(\<no_\?\)\?log\>\)\|
\ \%(\%(\<no_\?\)\?login\>\)\|
\ \%(\%(\<no_\?\)\?longlistjobs\>\)\|\%(\%(no_\?\)\?long_list_jobs\>\)\|
\ \%(\%(\<no_\?\)\?magicequalsubst\>\)\|\%(\%(no_\?\)\?magic_equal_subst\>\)\|
\ \%(\%(\<no_\?\)\?mark_dirs\>\)\|
\ \%(\%(\<no_\?\)\?mailwarn\>\)\|\%(\%(no_\?\)\?mail_warn\>\)\|
\ \%(\%(\<no_\?\)\?mailwarning\>\)\|\%(\%(no_\?\)\?mail_warning\>\)\|
\ \%(\%(\<no_\?\)\?markdirs\>\)\|
\ \%(\%(\<no_\?\)\?menucomplete\>\)\|\%(\%(no_\?\)\?menu_complete\>\)\|
\ \%(\%(\<no_\?\)\?monitor\>\)\|
\ \%(\%(\<no_\?\)\?multibyte\>\)\|\%(\%(no_\?\)\?multi_byte\>\)\|
\ \%(\%(\<no_\?\)\?multifuncdef\>\)\|\%(\%(no_\?\)\?multi_func_def\>\)\|
\ \%(\%(\<no_\?\)\?multios\>\)\|\%(\%(no_\?\)\?multi_os\>\)\|
\ \%(\%(\<no_\?\)\?nomatch\>\)\|\%(\%(no_\?\)\?no_match\>\)\|
\ \%(\%(\<no_\?\)\?notify\>\)\|
\ \%(\%(\<no_\?\)\?nullglob\>\)\|\%(\%(no_\?\)\?null_glob\>\)\|
\ \%(\%(\<no_\?\)\?numericglobsort\>\)\|\%(\%(no_\?\)\?numeric_glob_sort\>\)\|
\ \%(\%(\<no_\?\)\?octalzeroes\>\)\|\%(\%(no_\?\)\?octal_zeroes\>\)\|
\ \%(\%(\<no_\?\)\?onecmd\>\)\|\%(\%(no_\?\)\?one_cmd\>\)\|
\ \%(\%(\<no_\?\)\?overstrike\>\)\|\%(\%(no_\?\)\?over_strike\>\)\|
\ \%(\%(\<no_\?\)\?pathdirs\>\)\|\%(\%(no_\?\)\?path_dirs\>\)\|
\ \%(\%(\<no_\?\)\?pathscript\>\)\|\%(\%(no_\?\)\?path_script\>\)\|
\ \%(\%(\<no_\?\)\?physical\>\)\|
\ \%(\%(\<no_\?\)\?pipefail\>\)\|\%(\%(no_\?\)\?pipe_fail\>\)\|
\ \%(\%(\<no_\?\)\?posixaliases\>\)\|\%(\%(no_\?\)\?posix_aliases\>\)\|
\ \%(\%(\<no_\?\)\?posixargzero\>\)\|\%(\%(no_\?\)\?posix_arg_zero\>\)\|\%(\%(no_\?\)\?posix_argzero\>\)\|
\ \%(\%(\<no_\?\)\?posixbuiltins\>\)\|\%(\%(no_\?\)\?posix_builtins\>\)\|
\ \%(\%(\<no_\?\)\?posixcd\>\)\|\%(\%(no_\?\)\?posix_cd\>\)\|
\ \%(\%(\<no_\?\)\?posixidentifiers\>\)\|\%(\%(no_\?\)\?posix_identifiers\>\)\|
\ \%(\%(\<no_\?\)\?posixjobs\>\)\|\%(\%(no_\?\)\?posix_jobs\>\)\|
\ \%(\%(\<no_\?\)\?posixstrings\>\)\|\%(\%(no_\?\)\?posix_strings\>\)\|
\ \%(\%(\<no_\?\)\?posixtraps\>\)\|\%(\%(no_\?\)\?posix_traps\>\)\|
\ \%(\%(\<no_\?\)\?printeightbit\>\)\|\%(\%(no_\?\)\?print_eight_bit\>\)\|
\ \%(\%(\<no_\?\)\?printexitvalue\>\)\|\%(\%(no_\?\)\?print_exit_value\>\)\|
\ \%(\%(\<no_\?\)\?privileged\>\)\|
\ \%(\%(\<no_\?\)\?promptbang\>\)\|\%(\%(no_\?\)\?prompt_bang\>\)\|
\ \%(\%(\<no_\?\)\?promptcr\>\)\|\%(\%(no_\?\)\?prompt_cr\>\)\|
\ \%(\%(\<no_\?\)\?promptpercent\>\)\|\%(\%(no_\?\)\?prompt_percent\>\)\|
\ \%(\%(\<no_\?\)\?promptsp\>\)\|\%(\%(no_\?\)\?prompt_sp\>\)\|
\ \%(\%(\<no_\?\)\?promptsubst\>\)\|\%(\%(no_\?\)\?prompt_subst\>\)\|
\ \%(\%(\<no_\?\)\?promptvars\>\)\|\%(\%(no_\?\)\?prompt_vars\>\)\|
\ \%(\%(\<no_\?\)\?pushdignoredups\>\)\|\%(\%(no_\?\)\?pushd_ignore_dups\>\)\|
\ \%(\%(\<no_\?\)\?pushdminus\>\)\|\%(\%(no_\?\)\?pushd_minus\>\)\|
\ \%(\%(\<no_\?\)\?pushdsilent\>\)\|\%(\%(no_\?\)\?pushd_silent\>\)\|
\ \%(\%(\<no_\?\)\?pushdtohome\>\)\|\%(\%(no_\?\)\?pushd_to_home\>\)\|
\ \%(\%(\<no_\?\)\?rcexpandparam\>\)\|\%(\%(no_\?\)\?rc_expandparam\>\)\|\%(\%(no_\?\)\?rc_expand_param\>\)\|
\ \%(\%(\<no_\?\)\?rcquotes\>\)\|\%(\%(no_\?\)\?rc_quotes\>\)\|
\ \%(\%(\<no_\?\)\?rcs\>\)\|
\ \%(\%(\<no_\?\)\?recexact\>\)\|\%(\%(no_\?\)\?rec_exact\>\)\|
\ \%(\%(\<no_\?\)\?rematchpcre\>\)\|\%(\%(no_\?\)\?re_match_pcre\>\)\|\%(\%(no_\?\)\?rematch_pcre\>\)\|
\ \%(\%(\<no_\?\)\?restricted\>\)\|
\ \%(\%(\<no_\?\)\?rmstarsilent\>\)\|\%(\%(no_\?\)\?rm_star_silent\>\)\|
\ \%(\%(\<no_\?\)\?rmstarwait\>\)\|\%(\%(no_\?\)\?rm_star_wait\>\)\|
\ \%(\%(\<no_\?\)\?sharehistory\>\)\|\%(\%(no_\?\)\?share_history\>\)\|
\ \%(\%(\<no_\?\)\?shfileexpansion\>\)\|\%(\%(no_\?\)\?sh_file_expansion\>\)\|
\ \%(\%(\<no_\?\)\?shglob\>\)\|\%(\%(no_\?\)\?sh_glob\>\)\|
\ \%(\%(\<no_\?\)\?shinstdin\>\)\|\%(\%(no_\?\)\?shin_stdin\>\)\|
\ \%(\%(\<no_\?\)\?shnullcmd\>\)\|\%(\%(no_\?\)\?sh_nullcmd\>\)\|
\ \%(\%(\<no_\?\)\?shoptionletters\>\)\|\%(\%(no_\?\)\?sh_option_letters\>\)\|
\ \%(\%(\<no_\?\)\?shortloops\>\)\|\%(\%(no_\?\)\?short_loops\>\)\|
\ \%(\%(\<no_\?\)\?shortrepeat\>\)\|\%(\%(no_\?\)\?short_repeat\>\)\|
\ \%(\%(\<no_\?\)\?shwordsplit\>\)\|\%(\%(no_\?\)\?sh_word_split\>\)\|
\ \%(\%(\<no_\?\)\?singlecommand\>\)\|\%(\%(no_\?\)\?single_command\>\)\|
\ \%(\%(\<no_\?\)\?singlelinezle\>\)\|\%(\%(no_\?\)\?single_line_zle\>\)\|
\ \%(\%(\<no_\?\)\?sourcetrace\>\)\|\%(\%(no_\?\)\?source_trace\>\)\|
\ \%(\%(\<no_\?\)\?stdin\>\)\|
\ \%(\%(\<no_\?\)\?sunkeyboardhack\>\)\|\%(\%(no_\?\)\?sun_keyboard_hack\>\)\|
\ \%(\%(\<no_\?\)\?trackall\>\)\|\%(\%(no_\?\)\?track_all\>\)\|
\ \%(\%(\<no_\?\)\?transientrprompt\>\)\|\%(\%(no_\?\)\?transient_rprompt\>\)\|
\ \%(\%(\<no_\?\)\?trapsasync\>\)\|\%(\%(no_\?\)\?traps_async\>\)\|
\ \%(\%(\<no_\?\)\?typesetsilent\>\)\|\%(\%(no_\?\)\?type_set_silent\>\)\|\%(\%(no_\?\)\?typeset_silent\>\)\|
\ \%(\%(\<no_\?\)\?unset\>\)\|
\ \%(\%(\<no_\?\)\?verbose\>\)\|
\ \%(\%(\<no_\?\)\?vi\>\)\|
\ \%(\%(\<no_\?\)\?warnnestedvar\>\)\|\%(\%(no_\?\)\?warn_nested_var\>\)\|
\ \%(\%(\<no_\?\)\?warncreateglobal\>\)\|\%(\%(no_\?\)\?warn_create_global\>\)\|
\ \%(\%(\<no_\?\)\?xtrace\>\)\|
\ \%(\%(\<no_\?\)\?zle\>\)/ nextgroup=zshOption,zshComment skipwhite contained
syn case match syn case match
syn keyword zshTypes float integer local typeset declare private readonly syn keyword zshTypes float integer local typeset declare private readonly
@ -365,7 +164,7 @@ syn region zshGlob start='(#' end=')'
syn region zshMathSubst matchgroup=zshSubstDelim transparent syn region zshMathSubst matchgroup=zshSubstDelim transparent
\ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))' \ start='\%(\$\?\)[<=>]\@<!((' skip='\\)' end='))'
\ contains=zshParentheses,@zshSubst,zshNumber, \ contains=zshParentheses,@zshSubst,zshNumber,
\ @zshDerefs,zshString keepend fold \ @zshDerefs,zshString fold
" The ms=s+1 prevents matching zshBrackets several times on opening brackets " The ms=s+1 prevents matching zshBrackets several times on opening brackets
" (see https://github.com/chrisbra/vim-zsh/issues/21#issuecomment-576330348) " (see https://github.com/chrisbra/vim-zsh/issues/21#issuecomment-576330348)
syn region zshBrackets contained transparent start='{'ms=s+1 skip='\\}' syn region zshBrackets contained transparent start='{'ms=s+1 skip='\\}'