From 50ff5d4b1e9e9fe6d4e9c65927d61a40229dc27f Mon Sep 17 00:00:00 2001 From: Sergey Matveev Date: Wed, 19 Oct 2022 22:33:08 +0300 Subject: [PATCH] My own Mark plugin --- .../stargrave/start/mark/autoload/mark.vim | 89 +++++++++++++++++++ .../pack/stargrave/start/mark/plugin/mark.vim | 5 ++ vim/.vimrc | 2 +- 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 vim/.vim/pack/stargrave/start/mark/autoload/mark.vim create mode 100644 vim/.vim/pack/stargrave/start/mark/plugin/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 index 0000000..7a3f339 --- /dev/null +++ b/vim/.vim/pack/stargrave/start/mark/autoload/mark.vim @@ -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 +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 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 index 0000000..8cb85f1 --- /dev/null +++ b/vim/.vim/pack/stargrave/start/mark/plugin/mark.vim @@ -0,0 +1,5 @@ +if exists("*mark#Word") | finish | endif +nmap m MarkWord +nnoremap MarkWord :call mark#Word() +command! MarkToggle call mark#Toggle() +autocmd! BufWinEnter,WinEnter * call mark#Update() diff --git a/vim/.vimrc b/vim/.vimrc index 07a4d28..1b85527 100644 --- a/vim/.vimrc +++ b/vim/.vimrc @@ -51,7 +51,7 @@ set smartcase set hlsearch set incsearch set gdefault -map :nohlsearch:Mark +map :nohlsearch:MarkToggle set wildmode=list:longest set tags=.tags/**/tags; -- 2.44.0