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 for keeping the state # * does not pollute global variable namespace # * has removed old Vim versions support, expecting for modern functions # * 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 Offset = 3333 var Show = false var Words: list var Idx = 1 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 Del(i: number) Words[i] = "" silent! matchdelete(Offset + i + 1) enddef def Add(i: number, word: string) Words[i] = word matchadd("MarkWord" .. (i + 1), word, -10, Offset + i + 1) enddef export def Refresh() Init() var word: string for i in range(len(Words)) exec "syntax clear MarkWord" .. (i + 1) if Words[i] == "" | continue | endif silent! matchdelete(Offset + i + 1) if Show | Add(i, Words[i]) | endif endfor enddef export def Toggle() Show = !Show Refresh() enddef def Do(word: string) Init() for i in range(len(Words)) if !Show | Del(i) elseif Words[i] == word | Del(i) | return endif endfor if !Show | Show = true | endif for i in range(len(Words)) if Words[i] != "" | continue | endif Add(i, word) Idx = ((i + 1) == len(Words)) ? 1 : (i + 1) return endfor Del(Idx) Add(Idx, word) Idx = ((Idx + 1) == len(Words)) ? 1 : (Idx + 1) enddef export def Word() Do('\<' .. expand("") .. '\>') enddef