]> Sergey Matveev's repositories - dotfiles.git/commitdiff
My own Mark plugin
authorSergey Matveev <stargrave@stargrave.org>
Wed, 19 Oct 2022 19:33:08 +0000 (22:33 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Wed, 19 Oct 2022 19:33:08 +0000 (22:33 +0300)
vim/.vim/pack/stargrave/start/mark/autoload/mark.vim [new file with mode: 0644]
vim/.vim/pack/stargrave/start/mark/plugin/mark.vim [new file with mode: 0644]
vim/.vimrc

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
diff --git a/vim/.vim/pack/stargrave/start/mark/plugin/mark.vim b/vim/.vim/pack/stargrave/start/mark/plugin/mark.vim
new file mode 100644 (file)
index 0000000..8cb85f1
--- /dev/null
@@ -0,0 +1,5 @@
+if exists("*mark#Word") | finish | endif
+nmap <unique> <silent> <leader>m <Plug>MarkWord
+nnoremap <silent> <Plug>MarkWord :call mark#Word()<CR>
+command! MarkToggle call mark#Toggle()
+autocmd! BufWinEnter,WinEnter * call mark#Update()
index 07a4d28a68cf956deb519c3ca1f1f4de1afcffd7..1b85527791e05e8a46f7b8a138b1c8eda7321452 100644 (file)
@@ -51,7 +51,7 @@ set smartcase
 set hlsearch
 set incsearch
 set gdefault
-map <F4> :nohlsearch<CR>:Mark<CR>
+map <F4> :nohlsearch<CR>:MarkToggle<CR>
 
 set wildmode=list:longest
 set tags=.tags/**/tags;