patch 9.1.1703: Cannot react to terminal OSC responses
Commit:
https://github.com/vim/vim/commit/1f51bbc3b937db731ddcb3f180a4a7a8ce644ea9
Author: Foxe Chen <[email protected]>
Date: Wed Aug 27 21:15:47 2025 +0200
patch 9.1.1703: Cannot react to terminal OSC responses
Problem: Cannot react to terminal OSC responses
Solution: Allow TermResponseAll to be triggered by Terminal OSC
responses (Foxe Chen)
fixes: #14995
closes: #17975
Signed-off-by: Foxe Chen <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 69f28b95e..37b3e3509 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -1306,22 +1306,32 @@ TermResponse After the response to
|t_RV| is received from
takes time is involved.
*TermResponseAll*
TermResponseAll After the response to |t_RV|, |t_RC|,
|t_RS|,
- |t_RB|, |t_RF|, or |t_u7| are received from
+ |t_u7| or any OSC command are received from
the terminal. The value of |v:termresponse|,
|v:termblinkresp|, |v:termstyleresp|,
- |v:termrbgresp|, |v:termrfgresp|, and
- |v:termu7resp|, correspondingly, can be used.
- <amatch> will be set to any of:
+ |v:termu7resp|, and |v:termosc|
+ correspondingly, can be used. <amatch> will
+ be set to any of:
"version",
"cursorblink",
"cursorshape",
- "background",
- "foreground",
"ambiguouswidth"
+ "osc"
Note that this event may be triggered halfway
executing another event, especially if file I/O,
a shell command or anything else that takes time
is involved.
+ Note: Traditionally, TermResponseAll was also
+ used for "foreground" and "background"
+ patterns. These are now handled as part of
+ the "osc" value. For backwards compatibility,
+ the $VIMRUNTIME/plugin/colorresp.vim plugin
+ will handle "osc" events and emit
+ TermResponseAll autocommand events when it
+ encounters "foreground" and "background"
+ values.
+
+
*TextChanged*
TextChanged After a change was made to the text in the
current buffer in Normal mode. That is after
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index c13e3a0b7..d2344692a 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt* For Vim version 9.1. Last change: 2025 Aug 23
+*eval.txt* For Vim version 9.1. Last change: 2025 Aug 27
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -2893,16 +2893,15 @@ v:termstyleresp The escape sequence returned by the
terminal for the |t_RS|
*v:termrbgresp*
v:termrbgresp The escape sequence returned by the terminal for the |t_RB|
termcap entry. This is used to find out what the terminal
- background color is; see 'background'. When this option is
- set, the TermResponseAll autocommand event is fired, with
- <amatch> set to "background".
+ background color is; see 'background'. This is set by the
+ $VIMRUNTIME/plugin/colorresp.vim plugin normally included with
+ Vim, but can be set manually if you know what you are doing.
+ Note that changing this will not do anything.
*v:termrfgresp*
v:termrfgresp The escape sequence returned by the terminal for the |t_RF|
termcap entry. This is used to find out what the terminal
- foreground color is. When this option is set, the
- TermResponseAll autocommand event is fired, with <amatch> set
- to "foreground".
+ foreground color is. Behaves the same as |v:termrbgresp|
*v:termu7resp*
v:termu7resp The escape sequence returned by the terminal for the |t_u7|
@@ -2917,6 +2916,14 @@ v:termda1 The escape sequence returned by a
primary device attributes
TermResponseAll autocommand event is fired, with <amatch> set
to "da1". Can be used to detect OSC 52 support in a terminal.
+ *v:termosc*
+v:termosc The escape sequence of the most recent OSC response received
+ from the terminal. When this option is set, the
+ |TermResponseAll| autocommand event is fired, with <amatch>
+ set to "osc". Also used to set the |v:termrbgresp| and
+ |v:termrfgresp| via the $VIMRUNTIME/plugin/colorresp.vim
+ plugin
+
*v:testing* *testing-variable*
v:testing Must be set before using `test_garbagecollect_now()`.
Also, when set certain error messages won't be shown for 2
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 470326760..d671a25ea 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -6448,6 +6448,14 @@ A jump table for the options with a short description
can be found at |Q_op|.
This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
+ *'osctimeoutlen'* *'ost'* *E1568*
+'osctimeoutlen' 'ost' number (default 1000)
+ global
+ This option specifies the timeout in milliseconds Vim should wait
+ until it receives an OSC terminator after receiving the beginning of
+ an OSC command response. See the |TermResponseAll| autocommand event
+ and |v:termosc| for more information.
+
*'osfiletype'* *'oft'*
'osfiletype' 'oft' string (default: "")
local to buffer
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 72d2727af..3a4a07bf0 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -845,7 +845,9 @@ $quote eval.txt /*$quote*
'opfunc' options.txt /*'opfunc'*
'optimize' vi_diff.txt /*'optimize'*
'option' intro.txt /*'option'*
+'osctimeoutlen' options.txt /*'osctimeoutlen'*
'osfiletype' options.txt /*'osfiletype'*
+'ost' options.txt /*'ost'*
'pa' options.txt /*'pa'*
'packpath' options.txt /*'packpath'*
'para' options.txt /*'para'*
@@ -4723,6 +4725,7 @@ E1564 remote.txt /*E1564*
E1565 remote.txt /*E1565*
E1566 remote.txt /*E1566*
E1567 remote.txt /*E1567*
+E1568 options.txt /*E1568*
E157 sign.txt /*E157*
E158 sign.txt /*E158*
E159 sign.txt /*E159*
@@ -11280,6 +11283,7 @@ v:t_tuple eval.txt /*v:t_tuple*
v:t_typealias eval.txt /*v:t_typealias*
v:termblinkresp eval.txt /*v:termblinkresp*
v:termda1 eval.txt /*v:termda1*
+v:termosc eval.txt /*v:termosc*
v:termrbgresp eval.txt /*v:termrbgresp*
v:termresponse eval.txt /*v:termresponse*
v:termrfgresp eval.txt /*v:termrfgresp*
diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt
index 7e18266d7..6be097722 100644
--- a/runtime/doc/version9.txt
+++ b/runtime/doc/version9.txt
@@ -41753,6 +41753,10 @@ Others: ~
- |CmdlineLeave| sets |v:char| to the character that caused exiting the
Command-line.
- |min()|/|max()| can handle all comparable data types.
+- Vim triggers the |TermResponseAll| autocommand for any terminal OSC value.
+- Vim includes the $VIMRUNTIME/plugins/colorresp.vim which parses the terminal
+ OSC response and can trigger a |TermResponseAll| with the "background" or
+ "foreground" value.
Platform specific ~
- MS-Winodws: Paths like "\Windows" and "/Windows" are now considered to be
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
index 578b60997..9c706dce7 100644
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -632,7 +632,8 @@ if has("win32")
call <SID>AddOption("restorescreen", gettext("restore the screen contents
when exiting Vim"))
call <SID>BinOptionG("rs", &rs)
endif
-
+call <SID>AddOption("osctimeoutlen", gettext("timeout used for terminal OSC
responses"))
+call <SID>OptionG("ost", &ost)
call <SID>Header(gettext("using the mouse"))
call <SID>AddOption("mouse", gettext("list of flags for using the mouse"))
diff --git a/runtime/plugin/README.txt b/runtime/plugin/README.txt
index 11bf1e97b..e4f3c1b70 100644
--- a/runtime/plugin/README.txt
+++ b/runtime/plugin/README.txt
@@ -3,6 +3,7 @@ The plugin directory is for standard Vim plugin scripts.
All files here ending in .vim will be sourced by Vim when it starts up.
Look in the file for hints on how it can be disabled without deleting it.
+colorresp.vim used to detect terminal background and foreground colours
getscriptPlugin.vim get latest version of Vim scripts
gzip.vim edit compressed files
logiPat.vim logical operators on patterns
@@ -15,7 +16,3 @@ tarPlugin.vim edit (compressed) tar files
tohtml.vim convert a file with syntax highlighting to HTML
vimballPlugin.vim create and unpack .vba files
zipPlugin.vim edit zip archives
-
-Note: the explorer.vim plugin is no longer here, the netrw.vim plugin has
-taken over browsing directories (also for remote directories).
-
diff --git a/runtime/plugin/colorresp.vim b/runtime/plugin/colorresp.vim
new file mode 100644
index 000000000..f597dc7eb
--- /dev/null
+++ b/runtime/plugin/colorresp.vim
@@ -0,0 +1,51 @@
+vim9script
+
+# Vim plugin for setting the background and foreground colours depending on
+# the terminal response.
+#
+# Maintainer: The Vim Project <https://github.com/vim/vim>
+# Last Change: 2025 August 13
+
+if exists("loaded_colorresp")
+ finish
+endif
+g:loaded_colorresp = 1
+
+augroup ColorResp
+ au!
+ au TermResponseAll osc {
+ var parts: list<string> = matchlist(v:termosc,
'\(\d\+\);rgb:\(\w\+\)/\(\w\+\)/\(\w\+\)')
+ if len(parts) >= 5
+ var type: string = parts[1]
+ var rval: number = str2nr(parts[2][: 1], 16)
+ var gval: number = str2nr(parts[3][: 1], 16)
+ var bval: number = str2nr(parts[4][: 1], 16)
+
+ if type == '11'
+ # Detect light or dark background by parsing OSC 11 RGB background
reply
+ # from terminal. Sum the RGB values roughly; if bright enough, set
+ # 'background' to 'light', otherwise set it to 'dark'.
+ var new_bg_val: string = (3 * char2nr('6') < char2nr(parts[2]) +
char2nr(parts[3]) + char2nr(parts[4])) ? "light" : "dark"
+
+ v:termrbgresp = v:termosc
+ &background = new_bg_val
+ # For backwards compatibility
+ if exists('#TermResponseAll#background')
+ doautocmd <nomodeline> TermResponseAll background
+ endif
+ else
+ v:termrfgresp = v:termosc
+ # For backwards compatibility
+ if exists('#TermResponseAll#foreground')
+ doautocmd <nomodeline> TermResponseAll foreground
+ endif
+ endif
+ endif
+ }
+ au VimEnter * ++once {
+ call echoraw(&t_RB)
+ call echoraw(&t_RF)
+ }
+augroup END
+
+# vim: set sw=2 sts=2 :
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index 4161ee955..b0465918b 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -2,7 +2,7 @@
" Language: Vim script
" Maintainer: Hirohito Higashi <h.east.727 ATMARK gmail.com>
" Doug Kearns <[email protected]>
-" Last Change: 2025 Aug 23
+" Last Change: 2025 Aug 27
" Former Maintainer: Charles E. Campbell
" DO NOT CHANGE DIRECTLY.
@@ -63,15 +63,15 @@ syn keyword vimStdPlugin contained Arguments Asm Break
Cfilter Clear Continue Di
" vimOptions are caught only when contained in a vimSet {{{2
" GEN_SYN_VIM: vimOption normal, START_STR='syn keyword vimOption contained',
END_STR='skipwhite nextgroup=vimSetEqual,vimSetMod'
-syn keyword vimOption contained al aleph ari allowrevins ambw ambiwidth arab
arabic arshape arabicshape acd autochdir ac autocomplete acl autocompletedelay
act autocompletetimeout ai autoindent ar autoread asd autoshelldir aw autowrite
awa autowriteall bg background bs backspace bk backup bkc backupcopy bdir
backupdir bex backupext bsk backupskip bdlay balloondelay beval ballooneval
bevalterm balloonevalterm bexpr balloonexpr bo belloff bin binary bomb brk
breakat bri breakindent briopt breakindentopt bsdir browsedir bh bufhidden bl
buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv charconvert chi
chistory cin cindent cink cinkeys cino cinoptions cinsd cinscopedecls cinw
cinwords cb clipboard cpm clipmethod ch cmdheight cwh cmdwinheight cc
colorcolumn co columns com comments cms commentstring skipwhite
nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained cp compatible cpt complete cto completetimeout
cfu completefunc cfc completefuzzycollect cia completeitemalign cot completeopt
cpp completepopup csl completeslash cocu concealcursor cole conceallevel cf
confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg
cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto
cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul
cursorline culopt cursorlineopt debug def define deco delcombine dict
dictionary diff dia diffanchors dex diffexpr dip diffopt dg digraph dir
directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof
endoffile eol endofline ea equalalways ep equalprg eb errorbells ef errorfile
efm errorformat ek esckeys ei eventignore skipwhite
nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained eiw eventignorewin et expandtab ex exrc fenc
fileencoding fencs fileencodings ff fileformat ffs fileformats fic
fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl
foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl
foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines
fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo
formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr
guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli
guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile
hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp
hkmapp hls hlsearch skipwhite nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained icon iconstring ic ignorecase imaf
imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims
imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is
incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise
isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop
jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap
langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw
lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw
lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc
makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd
maxfuncdepth mmd maxmapdepth mm maxmem skipwhite nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained mmp maxmempattern mmt maxmemtot msc
maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml modeline mle
modelineexpr mls modelines ma modifiable mod modified more mouse mousef
mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses
mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf
nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc
operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm
patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup
pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn
printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt
printoptions prompt ph pumheight skipwhite nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained pmw pummaxwidth pw pumwidth pythondll
pythonhome pythonthreedll pythonthreehome pyx pyxversion qftf quickfixtextfunc
qe quoteescape ro readonly rdt redrawtime re regexpengine rnu relativenumber
remap rop renderoptions report rs restorescreen ri revins rl rightleft rlc
rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr scroll scb
scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt sect
sections secure sel selection slm selectmode ssop sessionoptions sh shell shcf
shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash stmp
shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw
shiftwidth shm shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc
sft showfulltag skipwhite nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained sm showmatch smd showmode stal showtabline
stpl showtabpanel ss sidescroll siso sidescrolloff scl signcolumn scs smartcase
si smartindent sta smarttab sms smoothscroll sts softtabstop spell spc
spellcapcheck spf spellfile spl spelllang spo spelloptions sps spellsuggest sb
splitbelow spk splitkeep spr splitright sol startofline stl statusline su
suffixes sua suffixesadd swf swapfile sws swapsync swb switchbuf smc synmaxcol
syn syntax tcl tabclose tal tabline tpm tabpagemax tpl tabpanel tplo
tabpanelopt ts tabstop tbs tagbsearch tc tagcase tfu tagfunc tl taglength tr
tagrelative tag tags tgst tagstack tcldll term tbidi termbidi tenc termencoding
tgc termguicolors twk termwinkey twsl termwinscroll tws termwinsize twt
termwintype terse skipwhite nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained ta textauto tx textmode tw textwidth tsr
thesaurus tsrfu thesaurusfunc top tildeop to timeout tm timeoutlen title
titlelen titleold titlestring tb toolbar tbis toolbariconsize ttimeout ttm
ttimeoutlen tbi ttybuiltin tf ttyfast ttym ttymouse tsl ttyscroll tty ttytype
udir undodir udf undofile ul undolevels ur undoreload uc updatecount ut
updatetime vsts varsofttabstop vts vartabstop vbs verbose vfile verbosefile
vdir viewdir vop viewoptions vi viminfo vif viminfofile ve virtualedit vb
visualbell warn wiv weirdinvert ww whichwrap wc wildchar wcm wildcharm wig
wildignore wic wildignorecase wmnu wildmenu wim wildmode wop wildoptions wak
winaltkeys wcr wincolor wi window wfb winfixbuf wfh winfixheight wfw
winfixwidth wh winheight wmh winminheight skipwhite
nextgroup=vimSetEqual,vimSetMod
-syn keyword vimOption contained wmw winminwidth winptydll wiw winwidth wse
wlseat wst wlsteal wtm wltimeoutlen wrap wm wrapmargin ws wrapscan write wa
writeany wb writebackup wd writedelay xtermcodes skipwhite
nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained al aleph ari allowrevins ambw ambiwidth arab
arabic arshape arabicshape acd autochdir ac autocomplete acl autocompletedelay
act autocompletetimeout ai autoindent ar autoread asd autoshelldir aw autowrite
awa autowriteall bg background bs backspace bk backup bkc backupcopy bdir
backupdir bex backupext bsk backupskip bdlay balloondelay beval ballooneval
bevalterm balloonevalterm bexpr balloonexpr bo belloff bin binary bomb brk
breakat bri breakindent briopt breakindentopt bsdir browsedir bh bufhidden bl
buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv charconvert chi
chistory cin cindent cink cinkeys cino cinoptions cinsd cinscopedecls cinw
cinwords cb clipboard cpm clipmethod ch cmdheight cwh cmdwinheight cc
colorcolumn skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained co columns com comments cms commentstring cp
compatible cpt complete cfu completefunc cfc completefuzzycollect cia
completeitemalign cot completeopt cpp completepopup csl completeslash cto
completetimeout cocu concealcursor cole conceallevel cf confirm ci copyindent
cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg cscopeprg csqf
cscopequickfix csre cscoperelative cst cscopetag csto cscopetagorder csverb
cscopeverbose crb cursorbind cuc cursorcolumn cul cursorline culopt
cursorlineopt debug def define deco delcombine dict dictionary diff dia
diffanchors dex diffexpr dip diffopt dg digraph dir directory dy display ead
eadirection ed edcompatible emo emoji enc encoding eof endoffile eol endofline
ea equalalways ep equalprg eb errorbells skipwhite
nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained ef errorfile efm errorformat ek esckeys ei
eventignore eiw eventignorewin et expandtab ex exrc fenc fileencoding fencs
fileencodings ff fileformat ffs fileformats fic fileignorecase ft filetype fcs
fillchars ffu findfunc fixeol fixendofline fcl foldclose fdc foldcolumn fen
foldenable fde foldexpr fdi foldignore fdl foldlevel fdls foldlevelstart fmr
foldmarker fdm foldmethod fml foldminlines fdn foldnestmax fdo foldopen fdt
foldtext fex formatexpr flp formatlistpat fo formatoptions fp formatprg fs
fsync gd gdefault gfm grepformat gp grepprg gcr guicursor gfn guifont gfs
guifontset gfw guifontwide ghr guiheadroom gli guiligatures go guioptions
guipty gtl guitablabel gtt guitabtooltip hf helpfile hh helpheight hlg helplang
hid hidden skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained hl highlight hi history hk hkmap hkp hkmapp
hls hlsearch icon iconstring ic ignorecase imaf imactivatefunc imak
imactivatekey imc imcmdline imd imdisable imi iminsert ims imsearch imsf
imstatusfunc imst imstyle inc include inex includeexpr is incsearch inde
indentexpr indk indentkeys inf infercase im insertmode ise isexpand isf isfname
isi isident isk iskeyword isp isprint js joinspaces jop jumpoptions key kmp
keymap km keymodel kpc keyprotocol kp keywordprg lmap langmap lm langmenu lnr
langnoremap lrm langremap ls laststatus lz lazyredraw lhi lhistory lbr
linebreak lines lsp linespace lisp lop lispoptions lw lispwords list lcs
listchars lpl loadplugins luadll magic mef makeef menc makeencoding mp makeprg
mps matchpairs mat matchtime skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained mco maxcombine mfd maxfuncdepth mmd
maxmapdepth mm maxmem mmp maxmempattern mmt maxmemtot msc maxsearchcount mis
menuitems mopt messagesopt msm mkspellmem ml modeline mle modelineexpr mls
modelines ma modifiable mod modified more mouse mousef mousefocus mh mousehide
mousem mousemodel mousemev mousemoveevent mouses mouseshape mouset mousetime
mzq mzquantum mzschemedll mzschemegcdll nf nrformats nu number nuw numberwidth
ofu omnifunc odev opendevice opfunc operatorfunc ost osctimeoutlen pp packpath
para paragraphs paste pt pastetoggle pex patchexpr pm patchmode pa path perldll
pi preserveindent pvh previewheight pvp previewpopup pvw previewwindow pdev
printdevice penc printencoding pexpr printexpr pfn printfont pheader
printheader skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained pmbcs printmbcharset pmbfn printmbfont popt
printoptions prompt ph pumheight pmw pummaxwidth pw pumwidth pythondll
pythonhome pythonthreedll pythonthreehome pyx pyxversion qftf quickfixtextfunc
qe quoteescape ro readonly rdt redrawtime re regexpengine rnu relativenumber
remap rop renderoptions report rs restorescreen ri revins rl rightleft rlc
rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr scroll scb
scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt sect
sections secure sel selection slm selectmode ssop sessionoptions sh shell shcf
shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash stmp
shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw
shiftwidth shm shortmess skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained sn shortname sbr showbreak sc showcmd sloc
showcmdloc sft showfulltag sm showmatch smd showmode stal showtabline stpl
showtabpanel ss sidescroll siso sidescrolloff scl signcolumn scs smartcase si
smartindent sta smarttab sms smoothscroll sts softtabstop spell spc
spellcapcheck spf spellfile spl spelllang spo spelloptions sps spellsuggest sb
splitbelow spk splitkeep spr splitright sol startofline stl statusline su
suffixes sua suffixesadd swf swapfile sws swapsync swb switchbuf smc synmaxcol
syn syntax tcl tabclose tal tabline tpm tabpagemax tpl tabpanel tplo
tabpanelopt ts tabstop tbs tagbsearch tc tagcase tfu tagfunc tl taglength tr
tagrelative tag tags tgst tagstack tcldll term tbidi termbidi tenc termencoding
tgc termguicolors skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained twk termwinkey twsl termwinscroll tws
termwinsize twt termwintype terse ta textauto tx textmode tw textwidth tsr
thesaurus tsrfu thesaurusfunc top tildeop to timeout tm timeoutlen title
titlelen titleold titlestring tb toolbar tbis toolbariconsize ttimeout ttm
ttimeoutlen tbi ttybuiltin tf ttyfast ttym ttymouse tsl ttyscroll tty ttytype
udir undodir udf undofile ul undolevels ur undoreload uc updatecount ut
updatetime vsts varsofttabstop vts vartabstop vbs verbose vfile verbosefile
vdir viewdir vop viewoptions vi viminfo vif viminfofile ve virtualedit vb
visualbell warn wiv weirdinvert ww whichwrap wc wildchar wcm wildcharm wig
wildignore wic wildignorecase wmnu wildmenu wim wildmode wop wildoptions wak
winaltkeys wcr wincolor wi window skipwhite nextgroup=vimSetEqual,vimSetMod
+syn keyword vimOption contained wfb winfixbuf wfh winfixheight wfw winfixwidth
wh winheight wmh winminheight wmw winminwidth winptydll wiw winwidth wse wlseat
wst wlsteal wtm wltimeoutlen wrap wm wrapmargin ws wrapscan write wa writeany
wb writebackup wd writedelay xtermcodes skipwhite
nextgroup=vimSetEqual,vimSetMod
" vimOptions: These are the turn-off setting variants {{{2
" GEN_SYN_VIM: vimOption turn-off, START_STR='syn keyword vimOption
contained', END_STR=''
@@ -102,16 +102,15 @@ syn match vimOption contained "t_k;"
" vimOptions: These are the variable names {{{2
" GEN_SYN_VIM: vimOption normal variable, START_STR='syn keyword
vimOptionVarName contained', END_STR=''
-syn keyword vimOptionVarName contained al aleph ari allowrevins ambw ambiwidth
arab arabic arshape arabicshape acd autochdir ac autocomplete acl
autocompletedelay act autocompletetimeout ai autoindent ar autoread asd
autoshelldir aw autowrite awa autowriteall bg background bs backspace bk backup
bkc backupcopy bdir backupdir bex backupext bsk backupskip bdlay balloondelay
beval ballooneval bevalterm balloonevalterm bexpr balloonexpr bo belloff bin
binary bomb brk breakat bri breakindent briopt breakindentopt bsdir browsedir
bh bufhidden bl buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv
charconvert chi chistory cin cindent cink cinkeys cino cinoptions cinsd
cinscopedecls cinw cinwords cb clipboard cpm clipmethod ch cmdheight cwh
cmdwinheight cc colorcolumn co columns com comments cms commentstring
-syn keyword vimOptionVarName contained cp compatible cpt complete cto
completetimeout cfu completefunc cfc completefuzzycollect cia completeitemalign
cot completeopt cpp completepopup csl completeslash cocu concealcursor cole
conceallevel cf confirm ci copyindent cpo cpoptions cm cryptmethod cspc
cscopepathcomp csprg cscopeprg csqf cscopequickfix csre cscoperelative cst
cscopetag csto cscopetagorder csverb cscopeverbose crb cursorbind cuc
cursorcolumn cul cursorline culopt cursorlineopt debug def define deco
delcombine dict dictionary diff dia diffanchors dex diffexpr dip diffopt dg
digraph dir directory dy display ead eadirection ed edcompatible emo emoji enc
encoding eof endoffile eol endofline ea equalalways ep equalprg eb errorbells
ef errorfile efm errorformat ek esckeys ei eventignore
-syn keyword vimOptionVarName contained eiw eventignorewin et expandtab ex exrc
fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic
fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl
foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl
foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines
fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo
formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr
guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli
guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile
hh helpheight hlg helplang hid hidden hl highlight hi history hk hkmap hkp
hkmapp hls hlsearch
-syn keyword vimOptionVarName contained icon iconstring ic ignorecase imaf
imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims
imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is
incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise
isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop
jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap
langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw
lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw
lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc
makeencoding mp makeprg mps matchpairs mat matchtime mco maxcombine mfd
maxfuncdepth mmd maxmapdepth
-syn keyword vimOptionVarName contained mm maxmem mmp maxmempattern mmt
maxmemtot msc maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml
modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse
mousef mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses
mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf
nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc
operatorfunc pp packpath para paragraphs paste pt pastetoggle pex patchexpr pm
patchmode pa path perldll pi preserveindent pvh previewheight pvp previewpopup
pvw previewwindow pdev printdevice penc printencoding pexpr printexpr pfn
printfont pheader printheader pmbcs printmbcharset pmbfn printmbfont popt
printoptions prompt
-syn keyword vimOptionVarName contained ph pumheight pmw pummaxwidth pw
pumwidth pythondll pythonhome pythonthreedll pythonthreehome pyx pyxversion
qftf quickfixtextfunc qe quoteescape ro readonly rdt redrawtime re regexpengine
rnu relativenumber remap rop renderoptions report rs restorescreen ri revins rl
rightleft rlc rightleftcmd rubydll ru ruler ruf rulerformat rtp runtimepath scr
scroll scb scrollbind scf scrollfocus sj scrolljump so scrolloff sbo scrollopt
sect sections secure sel selection slm selectmode ssop sessionoptions sh shell
shcf shellcmdflag sp shellpipe shq shellquote srr shellredir ssl shellslash
stmp shelltemp st shelltype sxe shellxescape sxq shellxquote sr shiftround sw
shiftwidth shm shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc
-syn keyword vimOptionVarName contained sft showfulltag sm showmatch smd
showmode stal showtabline stpl showtabpanel ss sidescroll siso sidescrolloff
scl signcolumn scs smartcase si smartindent sta smarttab sms smoothscroll sts
softtabstop spell spc spellcapcheck spf spellfile spl spelllang spo
spelloptions sps spellsuggest sb splitbelow spk splitkeep spr splitright sol
startofline stl statusline su suffixes sua suffixesadd swf swapfile sws
swapsync swb switchbuf smc synmaxcol syn syntax tcl tabclose tal tabline tpm
tabpagemax tpl tabpanel tplo tabpanelopt ts tabstop tbs tagbsearch tc tagcase
tfu tagfunc tl taglength tr tagrelative tag tags tgst tagstack tcldll term
tbidi termbidi tenc termencoding tgc termguicolors twk termwinkey twsl
termwinscroll tws termwinsize
-syn keyword vimOptionVarName contained twt termwintype terse ta textauto tx
textmode tw textwidth tsr thesaurus tsrfu thesaurusfunc top tildeop to timeout
tm timeoutlen title titlelen titleold titlestring tb toolbar tbis
toolbariconsize ttimeout ttm ttimeoutlen tbi ttybuiltin tf ttyfast ttym
ttymouse tsl ttyscroll tty ttytype udir undodir udf undofile ul undolevels ur
undoreload uc updatecount ut updatetime vsts varsofttabstop vts vartabstop vbs
verbose vfile verbosefile vdir viewdir vop viewoptions vi viminfo vif
viminfofile ve virtualedit vb visualbell warn wiv weirdinvert ww whichwrap wc
wildchar wcm wildcharm wig wildignore wic wildignorecase wmnu wildmenu wim
wildmode wop wildoptions wak winaltkeys wcr wincolor wi window wfb winfixbuf
wfh winfixheight wfw winfixwidth
-syn keyword vimOptionVarName contained wh winheight wmh winminheight wmw
winminwidth winptydll wiw winwidth wse wlseat wst wlsteal wtm wltimeoutlen wrap
wm wrapmargin ws wrapscan write wa writeany wb writebackup wd writedelay
xtermcodes
-
+syn keyword vimOptionVarName contained al aleph ari allowrevins ambw ambiwidth
arab arabic arshape arabicshape acd autochdir ac autocomplete acl
autocompletedelay act autocompletetimeout ai autoindent ar autoread asd
autoshelldir aw autowrite awa autowriteall bg background bs backspace bk backup
bkc backupcopy bdir backupdir bex backupext bsk backupskip bdlay balloondelay
beval ballooneval bevalterm balloonevalterm bexpr balloonexpr bo belloff bin
binary bomb brk breakat bri breakindent briopt breakindentopt bsdir browsedir
bh bufhidden bl buflisted bt buftype cmp casemap cdh cdhome cd cdpath cedit ccv
charconvert chi chistory cin cindent cink cinkeys cino cinoptions cinsd
cinscopedecls cinw cinwords cb clipboard cpm clipmethod ch cmdheight cwh
cmdwinheight cc colorcolumn
+syn keyword vimOptionVarName contained co columns com comments cms
commentstring cp compatible cpt complete cfu completefunc cfc
completefuzzycollect cia completeitemalign cot completeopt cpp completepopup
csl completeslash cto completetimeout cocu concealcursor cole conceallevel cf
confirm ci copyindent cpo cpoptions cm cryptmethod cspc cscopepathcomp csprg
cscopeprg csqf cscopequickfix csre cscoperelative cst cscopetag csto
cscopetagorder csverb cscopeverbose crb cursorbind cuc cursorcolumn cul
cursorline culopt cursorlineopt debug def define deco delcombine dict
dictionary diff dia diffanchors dex diffexpr dip diffopt dg digraph dir
directory dy display ead eadirection ed edcompatible emo emoji enc encoding eof
endoffile eol endofline ea equalalways ep equalprg
+syn keyword vimOptionVarName contained eb errorbells ef errorfile efm
errorformat ek esckeys ei eventignore eiw eventignorewin et expandtab ex exrc
fenc fileencoding fencs fileencodings ff fileformat ffs fileformats fic
fileignorecase ft filetype fcs fillchars ffu findfunc fixeol fixendofline fcl
foldclose fdc foldcolumn fen foldenable fde foldexpr fdi foldignore fdl
foldlevel fdls foldlevelstart fmr foldmarker fdm foldmethod fml foldminlines
fdn foldnestmax fdo foldopen fdt foldtext fex formatexpr flp formatlistpat fo
formatoptions fp formatprg fs fsync gd gdefault gfm grepformat gp grepprg gcr
guicursor gfn guifont gfs guifontset gfw guifontwide ghr guiheadroom gli
guiligatures go guioptions guipty gtl guitablabel gtt guitabtooltip hf helpfile
hh helpheight
+syn keyword vimOptionVarName contained hlg helplang hid hidden hl highlight hi
history hk hkmap hkp hkmapp hls hlsearch icon iconstring ic ignorecase imaf
imactivatefunc imak imactivatekey imc imcmdline imd imdisable imi iminsert ims
imsearch imsf imstatusfunc imst imstyle inc include inex includeexpr is
incsearch inde indentexpr indk indentkeys inf infercase im insertmode ise
isexpand isf isfname isi isident isk iskeyword isp isprint js joinspaces jop
jumpoptions key kmp keymap km keymodel kpc keyprotocol kp keywordprg lmap
langmap lm langmenu lnr langnoremap lrm langremap ls laststatus lz lazyredraw
lhi lhistory lbr linebreak lines lsp linespace lisp lop lispoptions lw
lispwords list lcs listchars lpl loadplugins luadll magic mef makeef menc
makeencoding mp makeprg
+syn keyword vimOptionVarName contained mps matchpairs mat matchtime mco
maxcombine mfd maxfuncdepth mmd maxmapdepth mm maxmem mmp maxmempattern mmt
maxmemtot msc maxsearchcount mis menuitems mopt messagesopt msm mkspellmem ml
modeline mle modelineexpr mls modelines ma modifiable mod modified more mouse
mousef mousefocus mh mousehide mousem mousemodel mousemev mousemoveevent mouses
mouseshape mouset mousetime mzq mzquantum mzschemedll mzschemegcdll nf
nrformats nu number nuw numberwidth ofu omnifunc odev opendevice opfunc
operatorfunc ost osctimeoutlen pp packpath para paragraphs paste pt pastetoggle
pex patchexpr pm patchmode pa path perldll pi preserveindent pvh previewheight
pvp previewpopup pvw previewwindow pdev printdevice penc printencoding pexpr
printexpr
+syn keyword vimOptionVarName contained pfn printfont pheader printheader pmbcs
printmbcharset pmbfn printmbfont popt printoptions prompt ph pumheight pmw
pummaxwidth pw pumwidth pythondll pythonhome pythonthreedll pythonthreehome pyx
pyxversion qftf quickfixtextfunc qe quoteescape ro readonly rdt redrawtime re
regexpengine rnu relativenumber remap rop renderoptions report rs restorescreen
ri revins rl rightleft rlc rightleftcmd rubydll ru ruler ruf rulerformat rtp
runtimepath scr scroll scb scrollbind scf scrollfocus sj scrolljump so
scrolloff sbo scrollopt sect sections secure sel selection slm selectmode ssop
sessionoptions sh shell shcf shellcmdflag sp shellpipe shq shellquote srr
shellredir ssl shellslash stmp shelltemp st shelltype sxe shellxescape sxq
shellxquote
+syn keyword vimOptionVarName contained sr shiftround sw shiftwidth shm
shortmess sn shortname sbr showbreak sc showcmd sloc showcmdloc sft showfulltag
sm showmatch smd showmode stal showtabline stpl showtabpanel ss sidescroll siso
sidescrolloff scl signcolumn scs smartcase si smartindent sta smarttab sms
smoothscroll sts softtabstop spell spc spellcapcheck spf spellfile spl
spelllang spo spelloptions sps spellsuggest sb splitbelow spk splitkeep spr
splitright sol startofline stl statusline su suffixes sua suffixesadd swf
swapfile sws swapsync swb switchbuf smc synmaxcol syn syntax tcl tabclose tal
tabline tpm tabpagemax tpl tabpanel tplo tabpanelopt ts tabstop tbs tagbsearch
tc tagcase tfu tagfunc tl taglength tr tagrelative tag tags tgst tagstack
tcldll term
+syn keyword vimOptionVarName contained tbidi termbidi tenc termencoding tgc
termguicolors twk termwinkey twsl termwinscroll tws termwinsize twt termwintype
terse ta textauto tx textmode tw textwidth tsr thesaurus tsrfu thesaurusfunc
top tildeop to timeout tm timeoutlen title titlelen titleold titlestring tb
toolbar tbis toolbariconsize ttimeout ttm ttimeoutlen tbi ttybuiltin tf ttyfast
ttym ttymouse tsl ttyscroll tty ttytype udir undodir udf undofile ul undolevels
ur undoreload uc updatecount ut updatetime vsts varsofttabstop vts vartabstop
vbs verbose vfile verbosefile vdir viewdir vop viewoptions vi viminfo vif
viminfofile ve virtualedit vb visualbell warn wiv weirdinvert ww whichwrap wc
wildchar wcm wildcharm wig wildignore wic wildignorecase wmnu wildmenu
+syn keyword vimOptionVarName contained wim wildmode wop wildoptions wak
winaltkeys wcr wincolor wi window wfb winfixbuf wfh winfixheight wfw
winfixwidth wh winheight wmh winminheight wmw winminwidth winptydll wiw
winwidth wse wlseat wst wlsteal wtm wltimeoutlen wrap wm wrapmargin ws wrapscan
write wa writeany wb writebackup wd writedelay xtermcodes
" GEN_SYN_VIM: vimOption term output code variable, START_STR='syn keyword
vimOptionVarName contained', END_STR=''
syn keyword vimOptionVarName contained t_AB t_AF t_AU t_AL t_al t_bc t_BE t_BD
t_cd t_ce t_Ce t_CF t_cl t_cm t_Co t_CS t_Cs t_cs t_CV t_da t_db t_DL t_dl t_ds
t_Ds t_EC t_EI t_fs t_fd t_fe t_GP t_IE t_IS t_ke t_ks t_le t_mb t_md t_me t_mr
t_ms t_nd t_op t_RF t_RB t_RC t_RI t_Ri t_RK t_RS t_RT t_RV t_Sb t_SC t_se t_Sf
t_SH t_SI t_Si t_so t_SR t_sr t_ST t_Te t_te t_TE t_ti t_TI t_Ts t_ts t_u7 t_ue
t_us t_Us t_ut t_vb t_ve t_vi t_VS t_vs t_WP t_WS t_XM t_xn t_xs t_ZH t_ZR t_8f
t_8b t_8u t_xo
syn keyword vimOptionVarName contained t_F1 t_F2 t_F3 t_F4 t_F5 t_F6 t_F7 t_F8
t_F9 t_k1 t_K1 t_k2 t_k3 t_K3 t_k4 t_K4 t_k5 t_K5 t_k6 t_K6 t_k7 t_K7 t_k8 t_K8
t_k9 t_K9 t_KA t_kb t_kB t_KB t_KC t_kd t_kD t_KD t_KE t_KF t_KG t_kh t_KH t_kI
t_KI t_KJ t_KK t_kl t_KL t_kN t_kP t_kr t_ku
@@ -160,13 +159,13 @@ syn keyword vimFuncName contained histadd histdel histget
histnr hlID hlexists h
syn keyword vimFuncName contained mzeval nextnonblank ngettext nr2char or
pathshorten perleval popup_atcursor popup_beval popup_clear popup_close
popup_create popup_dialog popup_filter_menu popup_filter_yesno popup_findecho
popup_findinfo popup_findpreview popup_getoptions popup_getpos popup_hide
popup_list popup_locate popup_menu popup_move popup_notification popup_setbuf
popup_setoptions popup_settext popup_show pow prevnonblank printf
prompt_getprompt prompt_setcallback prompt_setinterrupt prompt_setprompt
prop_add prop_add_list prop_clear prop_find prop_list prop_remove prop_type_add
prop_type_change prop_type_delete prop_type_get prop_type_list pum_getpos
pumvisible py3eval pyeval pyxeval rand range readblob readdir readdirex
readfile reduce reg_executing
syn keyword vimFuncName contained reg_recording reltime reltimefloat
reltimestr remote_expr remote_foreground remote_peek remote_read remote_send
remote_startserver remove rename repeat resolve reverse round rubyeval
screenattr screenchar screenchars screencol screenpos screenrow screenstring
search searchcount searchdecl searchpair searchpairpos searchpos server2client
serverlist setbufline setbufvar setcellwidths setcharpos setcharsearch
setcmdline setcmdpos setcursorcharpos setenv setfperm setline setloclist
setmatches setpos setqflist setreg settabvar settabwinvar settagstack setwinvar
sha256 shellescape shiftwidth sign_define sign_getdefined sign_getplaced
sign_jump sign_place sign_placelist sign_undefine sign_unplace sign_unplacelist
simplify sin sinh slice
syn keyword vimFuncName contained sort sound_clear sound_playevent
sound_playfile sound_stop soundfold spellbadword spellsuggest split sqrt srand
state str2blob str2float str2list str2nr strcharlen strcharpart strchars
strdisplaywidth strftime strgetchar stridx string strlen strpart strptime
strridx strtrans strutf16len strwidth submatch substitute swapfilelist swapinfo
swapname synID synIDattr synIDtrans synconcealed synstack system systemlist
tabpagebuflist tabpagenr tabpagewinnr tagfiles taglist tan tanh tempname
term_dumpdiff term_dumpload term_dumpwrite term_getaltscreen term_getansicolors
term_getattr term_getcursor term_getjob term_getline term_getscrolled
term_getsize term_getstatus term_gettitle term_gettty term_list term_scrape
term_sendkeys term_setansicolors
-syn keyword vimFuncName contained term_setapi term_setkill term_setrestore
term_setsize term_start term_wait terminalprops test_alloc_fail test_autochdir
test_feedinput test_garbagecollect_now test_garbagecollect_soon test_getvalue
test_gui_event test_ignore_error test_mswin_event test_null_blob
test_null_channel test_null_dict test_null_function test_null_job
test_null_list test_null_partial test_null_string test_null_tuple
test_option_not_set test_override test_refcount test_setmouse test_settime
test_srand_seed test_unknown test_void timer_info timer_pause timer_start
timer_stop timer_stopall tolower toupper tr trim trunc tuple2list type typename
undofile undotree uniq utf16idx values virtcol virtcol2col visualmode
wildmenumode wildtrigger win_execute win_findbuf
-syn keyword vimFuncName contained win_getid win_gettype win_gotoid
win_id2tabwin win_id2win win_move_separator win_move_statusline win_screenpos
win_splitmove winbufnr wincol windowsversion winheight winlayout winline winnr
winrestcmd winrestview winsaveview winwidth wordcount writefile xor
+syn keyword vimFuncName contained term_setapi term_setkill term_setrestore
term_setsize term_start term_wait terminalprops test_alloc_fail test_autochdir
test_feedinput test_garbagecollect_now test_garbagecollect_soon test_getvalue
test_gui_event test_ignore_error test_mswin_event test_null_blob
test_null_channel test_null_dict test_null_function test_null_job
test_null_list test_null_partial test_null_string test_null_tuple
test_option_not_set test_override test_refcount test_setmouse test_settime
test_srand_seed test_unknown test_void timer_info timer_pause timer_start
timer_stop timer_stopall tolower toupper tr trim trunc tuple2list type typename
undofile undotree uniq uri_decode uri_encode utf16idx values virtcol
virtcol2col visualmode wildmenumode wildtrigger
+syn keyword vimFuncName contained win_execute win_findbuf win_getid
win_gettype win_gotoid win_id2tabwin win_id2win win_move_separator
win_move_statusline win_screenpos win_splitmove winbufnr wincol windowsversion
winheight winlayout winline winnr winrestcmd winrestview winsaveview winwidth
wordcount writefile xor
" Predefined variable names {{{2
" GEN_SYN_VIM: vimVarName, START_STR='syn keyword vimVimVarName contained',
END_STR=''
syn keyword vimVimVarName contained count count1 prevcount errmsg warningmsg
statusmsg shell_error this_session version lnum termresponse fname lang lc_time
ctype charconvert_from charconvert_to fname_in fname_out fname_new fname_diff
cmdarg foldstart foldend folddashes foldlevel progname servername dying
exception throwpoint register cmdbang insertmode val key profiling fcs_reason
fcs_choice beval_bufnr beval_winnr beval_winid beval_lnum beval_col beval_text
scrollstart swapname swapchoice swapcommand char mouse_win mouse_winid
mouse_lnum mouse_col operator searchforward hlsearch oldfiles windowid progpath
completed_item option_new option_old option_oldlocal option_oldglobal
option_command option_type errors false true none null numbermax numbermin
numbersize
-syn keyword vimVimVarName contained vim_did_enter testing t_number t_string
t_func t_list t_dict t_float t_bool t_none t_job t_channel t_blob t_class
t_object termrfgresp termrbgresp termu7resp termstyleresp termblinkresp event
versionlong echospace argv collate exiting colornames sizeofint sizeoflong
sizeofpointer maxcol python3_version t_typealias t_enum t_enumvalue stacktrace
t_tuple wayland_display clipmethod termda1
+syn keyword vimVimVarName contained vim_did_enter testing t_number t_string
t_func t_list t_dict t_float t_bool t_none t_job t_channel t_blob t_class
t_object termrfgresp termrbgresp termu7resp termstyleresp termblinkresp event
versionlong echospace argv collate exiting colornames sizeofint sizeoflong
sizeofpointer maxcol python3_version t_typealias t_enum t_enumvalue stacktrace
t_tuple wayland_display clipmethod termda1 termosc
"--- syntax here and above generated by
runtime/syntax/generator/gen_syntax_vim.vim ---
diff --git a/src/errors.h b/src/errors.h
index bc418ff9d..ebe8ed431 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -3793,3 +3793,5 @@ EXTERN char e_socket_server_failed_connecting[]
EXTERN char e_socket_server_unavailable[]
INIT(= N_("E1567: Cannot start socket server, socket path is
unavailable"));
#endif
+EXTERN char e_osc_response_timed_out[]
+ INIT(= N_("E1568: OSC command response timed out: %.*s"));
diff --git a/src/evalvars.c b/src/evalvars.c
index 78d8a1755..c43841d34 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -141,8 +141,8 @@ static struct vimvar
{VV_NAME("t_blob", VAR_NUMBER), NULL, VV_RO},
{VV_NAME("t_class", VAR_NUMBER), NULL, VV_RO},
{VV_NAME("t_object", VAR_NUMBER), NULL, VV_RO},
- {VV_NAME("termrfgresp", VAR_STRING), NULL, VV_RO},
- {VV_NAME("termrbgresp", VAR_STRING), NULL, VV_RO},
+ {VV_NAME("termrfgresp", VAR_STRING), NULL, 0},
+ {VV_NAME("termrbgresp", VAR_STRING), NULL, 0},
{VV_NAME("termu7resp", VAR_STRING), NULL, VV_RO},
{VV_NAME("termstyleresp", VAR_STRING), NULL, VV_RO},
{VV_NAME("termblinkresp", VAR_STRING), NULL, VV_RO},
@@ -166,6 +166,7 @@ static struct vimvar
{VV_NAME("wayland_display", VAR_STRING), NULL, VV_RO},
{VV_NAME("clipmethod", VAR_STRING), NULL, VV_RO},
{VV_NAME("termda1", VAR_STRING), NULL, VV_RO},
+ {VV_NAME("termosc", VAR_STRING), NULL, VV_RO},
};
// shorthand
@@ -2910,6 +2911,17 @@ set_vim_var_string(
vimvars[idx].vv_str = vim_strnsave(val, len);
}
+ void
+set_vim_var_string_direct(
+ int idx,
+ char_u *val)
+{
+ clear_tv(&vimvars[idx].vv_di.di_tv);
+ vimvars[idx].vv_tv_type = VAR_STRING;
+
+ vimvars[idx].vv_str = val;
+}
+
/*
* Set List v: variable to "val".
*/
diff --git a/src/getchar.c b/src/getchar.c
index 0d1bd8a28..6b5909f1c 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -82,7 +82,13 @@ static int KeyNoremap = 0; // remapping flags
// typebuf.tb_buf has three parts: room in front (for result of mappings), the
// middle for typeahead and room for new characters (which needs to be 3 *
// MAXMAPLEN for the Amiga).
+#ifdef FEAT_NORMAL
+// Add extra space to handle large OSC responses in bigger chunks (improve
+// performance)
+#define TYPELEN_INIT (5 * (MAXMAPLEN + 3) + 2048)
+#else // Tiny version
#define TYPELEN_INIT (5 * (MAXMAPLEN + 3))
+#endif
static char_u typebuf_init[TYPELEN_INIT]; // initial typebuf.tb_buf
static char_u noremapbuf_init[TYPELEN_INIT]; // initial typebuf.tb_noremap
diff --git a/src/main.c b/src/main.c
index c77454a26..942a7e5f8 100644
--- a/src/main.c
+++ b/src/main.c
@@ -883,8 +883,6 @@ vim_main2(void)
// Requesting the termresponse is postponed until here, so that a "-c q"
// argument doesn't make it appear in the shell Vim was started from.
may_req_termresponse();
-
- may_req_bg_color();
#endif
// start in insert mode
diff --git a/src/option.c b/src/option.c
index 2aa06027a..f258836ec 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3905,6 +3905,21 @@ did_set_numberwidth(optset_T *args UNUSED)
}
#endif
+/*
+ * Process the updated 'osctimeoutlen' option value.
+ */
+ char *
+did_set_osctimeoutlen(optset_T *args)
+{
+ if (p_ost < 0)
+ {
+ p_ost = args->os_oldval.number;
+ return e_argument_must_be_positive;
+ }
+
+ return NULL;
+}
+
/*
* Process the updated 'paste' option value. Called after p_paste was set or
* reset. When 'paste' is set or reset also change other options.
diff --git a/src/option.h b/src/option.h
index a17f61507..ce75d6862 100644
--- a/src/option.h
+++ b/src/option.h
@@ -828,6 +828,7 @@ EXTERN char_u *p_nf; // 'nrformats'
#if defined(MSWIN)
EXTERN int p_odev; // 'opendevice'
#endif
+EXTERN long p_ost; // 'osctimeoutlen'
EXTERN char_u *p_opfunc; // 'operatorfunc'
EXTERN char_u *p_para; // 'paragraphs'
EXTERN int p_paste; // 'paste'
diff --git a/src/optiondefs.h b/src/optiondefs.h
index 77155a63e..e667e4f2c 100644
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -1926,6 +1926,9 @@ static struct vimoption options[] =
{"optimize", "opt", P_BOOL|P_VI_DEF,
(char_u *)NULL, PV_NONE, NULL, NULL,
{(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
+ {"osctimeoutlen", "ost", P_NUM|P_VI_DEF,
+ (char_u *)&p_ost, PV_NONE, did_set_osctimeoutlen,
NULL,
+ {(char_u *)1000, (char_u *)0L} SCTX_INIT},
{"osfiletype", "oft", P_STRING|P_ALLOCED|P_VI_DEF,
(char_u *)NULL, PV_NONE, NULL, NULL,
{(char_u *)0L, (char_u *)0L} SCTX_INIT},
diff --git a/src/po/vim.pot b/src/po/vim.pot
index bf4456772..cb7214ad4 100644
--- a/src/po/vim.pot
+++ b/src/po/vim.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Vim
"
"Report-Msgid-Bugs-To: [email protected]
"
-"POT-Creation-Date: 2025-08-23 16:16+0200
"
+"POT-Creation-Date: 2025-08-27 19:10+0200
"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE
"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>
"
"Language-Team: LANGUAGE <[email protected]>
"
@@ -8832,6 +8832,10 @@ msgstr ""
msgid "E1567: Cannot start socket server, socket path is unavailable"
msgstr ""
+#, c-format
+msgid "E1568: OSC command response timed out: %.*s"
+msgstr ""
+
#. type of cmdline window or 0
#. result of cmdline window or 0
#. buffer of cmdline window or NULL
@@ -9691,6 +9695,9 @@ msgstr ""
msgid "restore the screen contents when exiting Vim"
msgstr ""
+msgid "timeout used for terminal OSC responses"
+msgstr ""
+
msgid "using the mouse"
msgstr ""
diff --git a/src/proto/evalvars.pro b/src/proto/evalvars.pro
index a0e010001..4c62286d3 100644
--- a/src/proto/evalvars.pro
+++ b/src/proto/evalvars.pro
@@ -51,6 +51,7 @@ void set_vcount(long count, long count1, int set_prevcount);
void save_vimvars(vimvars_save_T *vvsave);
void restore_vimvars(vimvars_save_T *vvsave);
void set_vim_var_string(int idx, char_u *val, int len);
+void set_vim_var_string_direct(int idx, char_u *val);
void set_vim_var_list(int idx, list_T *val);
void set_vim_var_dict(int idx, dict_T *val);
void set_argv_var(char **argv, int argc);
diff --git a/src/proto/option.pro b/src/proto/option.pro
index f1f8a33a4..cae025d31 100644
--- a/src/proto/option.pro
+++ b/src/proto/option.pro
@@ -58,6 +58,7 @@ char *did_set_modified(optset_T *args);
char *did_set_mousehide(optset_T *args);
char *did_set_number_relativenumber(optset_T *args);
char *did_set_numberwidth(optset_T *args);
+char *did_set_osctimeoutlen(optset_T *args);
char *did_set_paste(optset_T *args);
char *did_set_previewwindow(optset_T *args);
char *did_set_pyxversion(optset_T *args);
diff --git a/src/proto/term.pro b/src/proto/term.pro
index c76acabbf..8b48011b6 100644
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -59,7 +59,6 @@ void starttermcap(void);
void stoptermcap(void);
void may_req_termresponse(void);
void check_terminal_behavior(void);
-void may_req_bg_color(void);
int swapping_screen(void);
void scroll_start(void);
void cursor_on_force(void);
diff --git a/src/proto/time.pro b/src/proto/time.pro
index 7e44bca1b..d9739b418 100644
--- a/src/proto/time.pro
+++ b/src/proto/time.pro
@@ -20,6 +20,9 @@ void f_timer_pause(typval_T *argvars, typval_T *rettv);
void f_timer_start(typval_T *argvars, typval_T *rettv);
void f_timer_stop(typval_T *argvars, typval_T *rettv);
void f_timer_stopall(typval_T *argvars, typval_T *rettv);
+#if defined(MSWIN) || defined(__MINGW32__)
+int gettimeofday(struct timeval *tv, char *dummy);
+#endif
void time_push(void *tv_rel, void *tv_start);
void time_pop(void *tp);
void time_msg(char *mesg, void *tv_start);
diff --git a/src/structs.h b/src/structs.h
index 0968b3c9a..ed7f90a61 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1290,6 +1290,19 @@ typedef struct
#endif
} tasave_T;
+// Holds state for current OSC response.
+typedef struct
+{
+ int processing; // If we are in the middle of an OSC
response
+ char_u start_char; // First char in the OSC response
+ garray_T buf; // Buffer holding the OSC response, to be
+ // placed in the "v:termosc" vim var.
+
+ struct timeval start; // Set at the beginning of an OSC response.
+ // Used to timeout after a set amount of
+ // time.
+} oscstate_T;
+
/*
* Used for conversion of terminal I/O and script files.
*/
diff --git a/src/term.c b/src/term.c
index 684a9476b..88061e075 100644
--- a/src/term.c
+++ b/src/term.c
@@ -116,19 +116,6 @@ static termrequest_T u7_status = TERMREQUEST_INIT;
static termrequest_T xcc_status = TERMREQUEST_INIT;
#ifdef FEAT_TERMRESPONSE
-# ifdef FEAT_TERMINAL
-// Request foreground color report:
-static termrequest_T rfg_status = TERMREQUEST_INIT;
-static int fg_r = 0;
-static int fg_g = 0;
-static int fg_b = 0;
-static int bg_r = 255;
-static int bg_g = 255;
-static int bg_b = 255;
-# endif
-
-// Request background color report:
-static termrequest_T rbg_status = TERMREQUEST_INIT;
// Request cursor blinking mode report:
static termrequest_T rbm_status = TERMREQUEST_INIT;
@@ -143,10 +130,6 @@ static termrequest_T *all_termrequests[] = {
&crv_status,
&u7_status,
&xcc_status,
-# ifdef FEAT_TERMINAL
- &rfg_status,
-# endif
- &rbg_status,
&rbm_status,
&rcs_status,
&winpos_status,
@@ -4192,49 +4175,6 @@ check_terminal_behavior(void)
}
}
-/*
- * Similar to requesting the version string: Request the terminal background
- * color when it is the right moment.
- */
- void
-may_req_bg_color(void)
-{
- if (can_get_termresponse() && starting == 0)
- {
- int didit = FALSE;
-
-# ifdef FEAT_TERMINAL
- // Only request foreground if t_RF is set.
- if (rfg_status.tr_progress == STATUS_GET && *T_RFG != NUL)
- {
- MAY_WANT_TO_LOG_THIS;
- LOG_TR1("Sending FG request");
- out_str(T_RFG);
- termrequest_sent(&rfg_status);
- didit = TRUE;
- }
-# endif
-
- // Only request background if t_RB is set.
- if (rbg_status.tr_progress == STATUS_GET && *T_RBG != NUL)
- {
- MAY_WANT_TO_LOG_THIS;
- LOG_TR1("Sending BG request");
- out_str(T_RBG);
- termrequest_sent(&rbg_status);
- didit = TRUE;
- }
-
- if (didit)
- {
- // check for the characters now, otherwise they might be eaten by
- // get_keystroke()
- out_flush();
- (void)vpeekc_nomap();
- }
- }
-}
-
#endif
/*
@@ -5740,105 +5680,89 @@ handle_csi(
return 0;
}
+static oscstate_T osc_state;
+
/*
- * Handle an OSC sequence, fore/background color response from the terminal:
- *
- * {lead}{code};rgb:{rrrr}/{gggg}/{bbbb}{tail}
- * or {lead}{code};rgb:{rr}/{gg}/{bb}{tail}
- *
- * {code} is 10 for foreground, 11 for background
- * {lead} can be <Esc>] or OSC
- * {tail} can be ' ', <Esc>\ or STERM.
- *
- * Consume any code that starts with "{lead}11;", it's also
- * possible that "rgba" is following.
+ * Handles any OSC sequence and places the result in "v:termosc". Note that the
+ * OSC identifier and terminator character(s) will not be placed in the final
+ * result. Returns OK on success and FAIL on failure.
*/
static int
-handle_osc(char_u *tp, char_u *argp, int len, char_u *key_name, int *slen)
+handle_osc(char_u *tp, int len, char_u *key_name, int *slen)
{
- int i, j;
+ struct timeval now;
+ char_u last_char;
- j = 1 + (tp[0] == ESC);
- if (len >= j + 3 && (argp[0] != '1'
- || (argp[1] != '1' && argp[1] != '0')
- || argp[2] != ';'))
- i = 0; // no match
+ if (!osc_state.processing)
+ {
+ int cur;
+
+ LOG_TRN("Received OSC response: %s", (char*)tp);
+ // Check if it is a valid OSC sequence, and consume it. OSC format
+ // consists of:
+ // <idenfitifer><data><terminator>
+ // <identifier> is either <Esc>] or an OSC character
+ // <terminator> can be ' ', <Esc>\ or STERM.
+ cur = 1 + (tp[0] == ESC);
+
+ if (len < cur + 1 + (tp[0] != OSC)) // Include terminator as well
+ return FAIL;
+
+ // The whole OSC response may be larger than the typeahead buffer.
+ // To handle this, keep reading data in and out of the typeahead
+ // buffer until we read an OSC terminator or timeout.
+ ga_init2(&osc_state.buf, 1, 1024);
+ gettimeofday(&osc_state.start, NULL);
+
+ osc_state.processing = TRUE;
+ osc_state.start_char = tp[0];
+ last_char = 0;
+ }
else
- for (i = j; i < len; ++i)
- if (tp[i] == ' ' || (tp[0] == OSC ? tp[i] == STERM
- : (tp[i] == ESC && i + 1 < len && tp[i + 1] == '\')))
- {
- int is_bg = argp[1] == '1';
- int is_4digit = i - j >= 21 && tp[j + 11] == '/'
- && tp[j + 16] == '/';
-
- if (i - j >= 15 && STRNCMP(tp + j + 3, "rgb:", 4) == 0
- && (is_4digit
- || (tp[j + 9] == '/' && tp[j + 12] == '/')))
- {
- char_u *tp_r = tp + j + 7;
- char_u *tp_g = tp + j + (is_4digit ? 12 : 10);
- char_u *tp_b = tp + j + (is_4digit ? 17 : 13);
-#if defined(FEAT_TERMRESPONSE) && defined(FEAT_TERMINAL)
- int rval, gval, bval;
+ last_char = ((char_u *)osc_state.buf.ga_data)[osc_state.buf.ga_len - 1];
+
+ key_name[0] = (int)KS_EXTRA;
+ key_name[1] = (int)KE_IGNORE;
+
+ // Read data and append to buffer. If we reach a terminator, then
+ // finally set the vim var.
+ for (int i = 0; i < len; i++)
+ if (tp[i] == ' ' || (osc_state.start_char == OSC ? tp[i] == STERM
+ : ((tp[i] == ESC && i + 1 < len && tp[i + 1] == '\')
+ || (i == 0 && tp[i] == '\' && last_char == ESC)
+ )))
+ {
+ osc_state.processing = FALSE;
- rval = hexhex2nr(tp_r);
- gval = hexhex2nr(tp_g);
- bval = hexhex2nr(tp_b);
+ ga_concat_len(&osc_state.buf, tp, i + 1 + (tp[i] == ESC));
+ ga_append(&osc_state.buf, NUL);
+ *slen = i + 1 + (tp[i] == ESC);
+#ifdef FEAT_EVAL
+ set_vim_var_string_direct(VV_TERMOSC, osc_state.buf.ga_data);
#endif
- if (is_bg)
- {
- char *new_bg_val = (3 * '6' < *tp_r + *tp_g +
- *tp_b) ? "light" : "dark";
+ apply_autocmds(EVENT_TERMRESPONSEALL, (char_u *)"osc",
+ NULL, FALSE, curbuf);
+ return OK;
+ }
- LOG_TRN("Received RBG response: %s", tp);
-#ifdef FEAT_TERMRESPONSE
- rbg_status.tr_progress = STATUS_GOT;
-# ifdef FEAT_TERMINAL
- bg_r = rval;
- bg_g = gval;
- bg_b = bval;
-# endif
-#endif
- if (!option_was_set((char_u *)"bg")
- && STRCMP(p_bg, new_bg_val) != 0)
- {
- // value differs, apply it
- set_option_value_give_err((char_u *)"bg",
- 0L, (char_u *)new_bg_val, 0);
- reset_option_was_set((char_u *)"bg");
- redraw_asap(UPD_CLEAR);
- }
- }
-#if defined(FEAT_TERMRESPONSE) && defined(FEAT_TERMINAL)
- else
- {
- LOG_TRN("Received RFG response: %s", tp);
- rfg_status.tr_progress = STATUS_GOT;
- fg_r = rval;
- fg_g = gval;
- fg_b = bval;
- }
-#endif
- }
+ // Check if timeout has been reached
+ gettimeofday(&now, NULL);
- // got finished code: consume it
- key_name[0] = (int)KS_EXTRA;
- key_name[1] = (int)KE_IGNORE;
- *slen = i + 1 + (tp[i] == ESC);
-#ifdef FEAT_EVAL
- set_vim_var_string(is_bg ? VV_TERMRBGRESP
- : VV_TERMRFGRESP, tp, *slen);
-#endif
- apply_autocmds(EVENT_TERMRESPONSEALL,
- is_bg ? (char_u *)"background" : (char_u
*)"foreground", NULL, FALSE, curbuf);
- break;
- }
- if (i == len)
+ if ((now.tv_sec * 1000000 + now.tv_usec) -
+ (osc_state.start.tv_sec * 1000000 + osc_state.start.tv_usec)
+ >= p_ost * 1000)
{
- LOG_TR1("not enough characters for RB");
+ semsg(_(e_osc_response_timed_out), osc_state.buf.ga_len,
+ osc_state.buf.ga_data);
+
+ ga_clear(&osc_state.buf);
+ osc_state.processing = FALSE;
return FAIL;
}
+
+ ga_concat(&osc_state.buf, tp);
+ *slen = len; // Consume everything
+
return OK;
}
@@ -6028,6 +5952,11 @@ check_termcode(
continue;
}
+ if (osc_state.processing)
+ // Still processing OSC response data, go straight to handler
+ // function.
+ goto handle_osc;
+
/*
* Skip this position if the character does not appear as the first
* character in term_strings. This speeds up a lot, since most
@@ -6300,13 +6229,11 @@ check_termcode(
}
}
- // Check for fore/background color response from the terminal,
- // starting} with <Esc>] or OSC
- else if ((*T_RBG != NUL || *T_RFG != NUL)
- && ((tp[0] == ESC && len >= 2 && tp[1] == ']')
- || tp[0] == OSC))
+ // Check for OSC responses from terminal
+ else if ((tp[0] == ESC && len >= 2 && tp[1] == ']') || tp[0] == OSC)
{
- if (handle_osc(tp, argp, len, key_name, &slen) == FAIL)
+handle_osc:
+ if (handle_osc(tp, len, key_name, &slen) == FAIL)
return -1;
}
@@ -6549,10 +6476,12 @@ check_termcode(
*/
key = handle_x_keys(TERMCAP2KEY(key_name[0], key_name[1]));
- /*
- * Add any modifier codes to our string.
- */
- new_slen = modifiers2keycode(modifiers, &key, string);
+ if (osc_state.processing)
+ // We don't want to add anything to the typeahead buffer.
+ new_slen = 0;
+ else
+ // Add any modifier codes to our string.
+ new_slen = modifiers2keycode(modifiers, &key, string);
// Finally, add the special key code to our string
key_name[0] = KEY2TERMCAP0(key);
@@ -6592,18 +6521,28 @@ check_termcode(
}
#if (defined(FEAT_TERMINAL) && defined(FEAT_TERMRESPONSE)) || defined(PROTO)
+
+ static void
+term_get_color(char_u *str, char_u *r, char_u *g, char_u *b)
+{
+ char_u rn[3], gn[3], bn[3];
+
+ if (sscanf((char *)str, "%*[^:]:%2s%*[^/]/%2s%*[^/]/%2s",
+ (char *)&rn, (char *)&gn, (char *)&bn) != 3)
+ return;
+
+ *r = hexhex2nr(rn);
+ *g = hexhex2nr(gn);
+ *b = hexhex2nr(bn);
+}
+
/*
* Get the text foreground color, if known.
*/
void
term_get_fg_color(char_u *r, char_u *g, char_u *b)
{
- if (rfg_status.tr_progress != STATUS_GOT)
- return;
-
- *r = fg_r;
- *g = fg_g;
- *b = fg_b;
+ term_get_color(get_vim_var_str(VV_TERMRFGRESP), r, g, b);
}
/*
@@ -6612,12 +6551,7 @@ term_get_fg_color(char_u *r, char_u *g, char_u *b)
void
term_get_bg_color(char_u *r, char_u *g, char_u *b)
{
- if (rbg_status.tr_progress != STATUS_GOT)
- return;
-
- *r = bg_r;
- *g = bg_g;
- *b = bg_b;
+ term_get_color(get_vim_var_str(VV_TERMRBGRESP), r, g, b);
}
#endif
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index 0d4aeb043..e02c63d52 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -252,6 +252,7 @@ NEW_TESTS = \
test_plugin_tohtml \
test_plugin_tutor \
test_plugin_zip \
+ test_plugin_colorresp \
test_plus_arg_edit \
test_popup \
test_popupwin \
@@ -525,6 +526,7 @@ NEW_TESTS_RES = \
test_plugin_tohtml.res \
test_plugin_tutor.res \
test_plugin_zip.res \
+ test_plugin_colorresp.res \
test_plus_arg_edit.res \
test_popup.res \
test_popupwin.res \
diff --git a/src/testdir/test_plugin_colorresp.vim
b/src/testdir/test_plugin_colorresp.vim
new file mode 100644
index 000000000..0300ff484
--- /dev/null
+++ b/src/testdir/test_plugin_colorresp.vim
@@ -0,0 +1,74 @@
+" Test for the colorresp plugin
+
+CheckNotGui
+CheckUnix
+
+runtime plugin/colorresp.vim
+
+func Test_colorresp()
+ set t_RF=x
+ set t_RB=y
+
+ " response to t_RF, 4 digits
+ let red = 0x12
+ let green = 0x34
+ let blue = 0x56
+ let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green,
blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrfgresp)
+ " call WaitForAssert({-> assert_equal(seq, v:termrfgresp)})
+
+ " response to t_RF, 2 digits
+ let red = 0x78
+ let green = 0x9a
+ let blue = 0xbc
+ let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrfgresp)
+
+ " response to t_RB, 4 digits, dark
+ set background=light
+ call test_option_not_set('background')
+ let red = 0x29
+ let green = 0x4a
+ let blue = 0x6b
+ let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green,
blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrbgresp)
+ call assert_equal('dark', &background)
+
+ " response to t_RB, 4 digits, light
+ set background=dark
+ call test_option_not_set('background')
+ let red = 0x81
+ let green = 0x63
+ let blue = 0x65
+ let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green,
blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrbgresp)
+ call assert_equal('light', &background)
+
+ " response to t_RB, 2 digits, dark
+ set background=light
+ call test_option_not_set('background')
+ let red = 0x47
+ let green = 0x59
+ let blue = 0x5b
+ let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrbgresp)
+ call assert_equal('dark', &background)
+
+ " response to t_RB, 2 digits, light
+ set background=dark
+ call test_option_not_set('background')
+ let red = 0x83
+ let green = 0xa4
+ let blue = 0xc2
+ let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
+ call feedkeys(seq, 'Lx!')
+ call assert_equal(seq, v:termrbgresp)
+ call assert_equal('light', &background)
+
+ set t_RF= t_RB=
+ endfunc
diff --git a/src/testdir/test_termcodes.vim b/src/testdir/test_termcodes.vim
index 52a34df6f..99710fada 100644
--- a/src/testdir/test_termcodes.vim
+++ b/src/testdir/test_termcodes.vim
@@ -1632,74 +1632,6 @@ func Test_mouse_termcodes()
%bw!
endfunc
-" This only checks if the sequence is recognized.
-func Test_term_rgb_response()
- set t_RF=x
- set t_RB=y
-
- " response to t_RF, 4 digits
- let red = 0x12
- let green = 0x34
- let blue = 0x56
- let seq = printf("\<Esc>]10;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrfgresp)
-
- " response to t_RF, 2 digits
- let red = 0x78
- let green = 0x9a
- let blue = 0xbc
- let seq = printf("\<Esc>]10;rgb:%02x/%02x/%02x\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrfgresp)
-
- " response to t_RB, 4 digits, dark
- set background=light
- eval 'background'->test_option_not_set()
- let red = 0x29
- let green = 0x4a
- let blue = 0x6b
- let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrbgresp)
- call assert_equal('dark', &background)
-
- " response to t_RB, 4 digits, light
- set background=dark
- call test_option_not_set('background')
- let red = 0x81
- let green = 0x63
- let blue = 0x65
- let seq = printf("\<Esc>]11;rgb:%02x00/%02x00/%02x00\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrbgresp)
- call assert_equal('light', &background)
-
- " response to t_RB, 2 digits, dark
- set background=light
- call test_option_not_set('background')
- let red = 0x47
- let green = 0x59
- let blue = 0x5b
- let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrbgresp)
- call assert_equal('dark', &background)
-
- " response to t_RB, 2 digits, light
- set background=dark
- call test_option_not_set('background')
- let red = 0x83
- let green = 0xa4
- let blue = 0xc2
- let seq = printf("\<Esc>]11;rgb:%02x/%02x/%02x\x07", red, green, blue)
- call feedkeys(seq, 'Lx!')
- call assert_equal(seq, v:termrbgresp)
- call assert_equal('light', &background)
-
- set t_RF= t_RB=
-endfunc
-
" This only checks if the sequence is recognized.
" This must be after other tests, because it has side effects to xterm
" properties.
@@ -2808,4 +2740,17 @@ func Test_da1_handling()
call assert_equal("\<Esc>[?62,52;c", v:termda1)
endfunc
+" Test if OSC terminal responses are captured correctly
+func Test_term_response_osc()
+ " Test if large OSC responses (that must be processed in chunks) are handled
+ let data = repeat('a', 3000)
+
+ call feedkeys("\<Esc>]12;" .. data .. "\x07", 'Lx!')
+ call assert_equal("\<Esc>]12;" .. data .. "\x07", v:termosc)
+
+ " Test small OSC responses
+ call feedkeys("\<Esc>]15;hello world! ", 'Lx!')
+ call assert_equal("\<Esc>]15;hello world!\x07", v:termosc)
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/testdir/util/gen_opt_test.vim
b/src/testdir/util/gen_opt_test.vim
index 22bc35203..56ce92171 100644
--- a/src/testdir/util/gen_opt_test.vim
+++ b/src/testdir/util/gen_opt_test.vim
@@ -116,6 +116,7 @@ let test_values = {
\ 'winminwidth': [[0, 1, 10], [-1]],
\ 'winwidth': [[1, 10, 999], [-1, 0]],
\ 'wltimeoutlen': [[1, 10, 999],[-1]],
+ \ 'osctimeoutlen': [[0, 1, 8, 9999], [-1]],
\
"\ string options
\ 'ambiwidth': [['', 'single', 'double'], ['xxx']],
diff --git a/src/time.c b/src/time.c
index 2fb0c3931..d45179948 100644
--- a/src/time.c
+++ b/src/time.c
@@ -127,6 +127,20 @@ get_ctime(time_t thetime, int add_newline)
return buf;
}
+#if defined(MSWIN) || defined(__MINGW32__)
+/*
+ * Windows doesn't have gettimeofday(), although it does have struct timeval.
+ */
+ int
+gettimeofday(struct timeval *tv, char *dummy UNUSED)
+{
+ long t = clock();
+ tv->tv_sec = t / CLOCKS_PER_SEC;
+ tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
+ return 0;
+}
+#endif
+
#if defined(FEAT_EVAL) || defined(PROTO)
#if defined(MACOS_X)
@@ -947,20 +961,6 @@ f_timer_stopall(typval_T *argvars UNUSED, typval_T *rettv
UNUSED)
# if defined(STARTUPTIME) || defined(PROTO)
static struct timeval prev_timeval;
-# ifdef MSWIN
-/*
- * Windows doesn't have gettimeofday(), although it does have struct timeval.
- */
- static int
-gettimeofday(struct timeval *tv, char *dummy UNUSED)
-{
- long t = clock();
- tv->tv_sec = t / CLOCKS_PER_SEC;
- tv->tv_usec = (t - tv->tv_sec * CLOCKS_PER_SEC) * 1000000 / CLOCKS_PER_SEC;
- return 0;
-}
-# endif
-
/*
* Save the previous time before doing something that could nest.
* set "*tv_rel" to the time elapsed so far.
diff --git a/src/version.c b/src/version.c
index 443f85bb8..e1e0b950f 100644
--- a/src/version.c
+++ b/src/version.c
@@ -724,6 +724,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1703,
/**/
1702,
/**/
diff --git a/src/vim.h b/src/vim.h
index 9845cbe78..802ac7304 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2240,7 +2240,8 @@ typedef int sock_T;
#define VV_WAYLAND_DISPLAY 112
#define VV_CLIPMETHOD 113
#define VV_TERMDA1 114
-#define VV_LEN 115 // number of v: vars
+#define VV_TERMOSC 115
+#define VV_LEN 116 // number of v: vars
// used for v_number in VAR_BOOL and VAR_SPECIAL
#define VVAL_FALSE 0L // VAR_BOOL
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1urLqQ-005ohc-I5%40256bit.org.