# 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
+# * uses lists, instead of pack of variables to keep 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 MarkWord5 ctermfg=Black ctermbg=Magenta
hi MarkWord6 ctermfg=Black ctermbg=Blue
-const Offset = 3333
-var Show = false
+const MarkIdOffset = 3333
+var Show: bool
var Words: list<string>
-var Cycle = 1
+var Idx: number
def Init()
if len(Words) > 0 | return | endif
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
+def WinRefresh()
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
+ 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
- Update()
+ Refresh()
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
+def Do(word: string)
for i in range(len(Words))
- if word == Words[i]
- Del(i)
- return true
+ 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
- Del(i)
Words[i] = word
- Add(i)
- Cycle = ((i + 1) == len(Words)) ? 1 : i + 1
- return true
+ Idx = ((i + 1) == len(Words)) ? 0 : (i + 1)
+ return
endfor
- Del(Cycle)
- Words[Cycle] = word
- Add(Cycle)
- Cycle = ((Cycle + 1) == len(Words)) ? 1 : Cycle + 1
- return true
+ Words[Idx] = word
+ Idx = ((Idx + 1) == len(Words)) ? 0 : (Idx + 1)
enddef
export def Word()
+ Init()
Do('\<' .. expand("<cword>") .. '\>')
+ Refresh()
enddef