]> Sergey Matveev's repositories - dotfiles.git/blobdiff - vim/.vim/pack/stargrave/start/mark/autoload/mark.vim
My own Mark plugin
[dotfiles.git] / vim / .vim / pack / stargrave / start / mark / autoload / mark.vim
diff --git a/vim/.vim/pack/stargrave/start/mark/autoload/mark.vim b/vim/.vim/pack/stargrave/start/mark/autoload/mark.vim
new file mode 100644 (file)
index 0000000..7a3f339
--- /dev/null
@@ -0,0 +1,89 @@
+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<string>
+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("<cword>") .. '\>')
+enddef