vim9script # Based on Mark plugin by Yuheng Xie: # https://www.vim.org/scripts/script.php?script_id=1238 # That one: # * uses autoload for lazy loading # * is ported to vim9script for code simplification and performance # * uses lists, instead of pack of variables to keep the state # * does not pollute global variable namespace # * has ability only to highlight the current word hi MarkWord1 ctermfg=Black ctermbg=Cyan hi MarkWord2 ctermfg=Black ctermbg=Green hi MarkWord3 ctermfg=Black ctermbg=Yellow hi MarkWord4 ctermfg=Black ctermbg=Red hi MarkWord5 ctermfg=Black ctermbg=Magenta hi MarkWord6 ctermfg=Black ctermbg=Blue const MarkIdOffset = 3333 var Show: bool var Words: list var Idx: number def Init() if len(Words) > 0 | return | endif var i = 1 while hlexists("MarkWord" .. i) | i = i + 1 | endwhile Words = repeat([""], i - 1) enddef def WinRefresh() for i in range(len(Words)) exec "syntax clear MarkWord" .. (i + 1) silent! matchdelete(MarkIdOffset + i + 1) if (Words[i] == "") || !Show | continue | endif matchadd("MarkWord" .. (i + 1), Words[i], -10, MarkIdOffset + i + 1) endfor enddef export def Refresh() Init() var nr = winnr() silent! windo WinRefresh() silent! exec ":" .. nr .. "wincmd w" enddef export def Toggle() Show = !Show Refresh() enddef def Do(word: string) for i in range(len(Words)) if !Show | Words[i] = "" elseif Words[i] == word | Words[i] = "" | return endif endfor if !Show | Show = true | endif for i in range(len(Words)) if Words[i] != "" | continue | endif Words[i] = word Idx = ((i + 1) == len(Words)) ? 0 : (i + 1) return endfor Words[Idx] = word Idx = ((Idx + 1) == len(Words)) ? 0 : (Idx + 1) enddef export def Word() Init() Do('\<' .. expand("") .. '\>') Refresh() enddef