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 Cycle = 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) matchadd("MarkWord" .. (i + 1), Words[i], -10, Offset + i + 1) enddef export def Update() 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) | endif endfor enddef export def Toggle() Show = !Show Update() enddef def Do(word: string): bool Init() if !Show for i in range(len(Words)) if Words[i] == "" | continue | endif Del(i) endfor Show = true endif for i in range(len(Words)) if word == Words[i] Del(i) return true endif endfor for i in range(len(Words)) if Words[i] != "" | continue | endif Del(i) Words[i] = word Add(i) Cycle = ((i + 1) == len(Words)) ? 1 : i + 1 return true endfor Del(Cycle) Words[Cycle] = word Add(Cycle) Cycle = ((Cycle + 1) == len(Words)) ? 1 : Cycle + 1 return true enddef export def Word() Do('\<' .. expand("") .. '\>') enddef