]> Sergey Matveev's repositories - dotfiles.git/blob - vim/.vim/pack/stargrave/start/mark/autoload/mark.vim
More compact Mark
[dotfiles.git] / vim / .vim / pack / stargrave / start / mark / autoload / mark.vim
1 vim9script
2
3 # Based on Mark plugin by Yuheng Xie:
4 # https://www.vim.org/scripts/script.php?script_id=1238
5 # That one:
6 # * uses autoload for lazy loading
7 # * is ported to vim9script for code simplification and performance
8 # * uses lists, instead of pack of variables for keeping the state
9 # * does not pollute global variable namespace
10 # * has removed old Vim versions support, expecting for modern functions
11 # * has ability only to highlight the current word
12
13 hi MarkWord1 ctermfg=Black ctermbg=Cyan
14 hi MarkWord2 ctermfg=Black ctermbg=Green
15 hi MarkWord3 ctermfg=Black ctermbg=Yellow
16 hi MarkWord4 ctermfg=Black ctermbg=Red
17 hi MarkWord5 ctermfg=Black ctermbg=Magenta
18 hi MarkWord6 ctermfg=Black ctermbg=Blue
19
20 const Offset = 3333
21 var Show = false
22 var Words: list<string>
23 var Idx = 1
24
25 def Init()
26     if len(Words) > 0 | return | endif
27     var i = 1
28     while hlexists("MarkWord" .. i) | i = i + 1 | endwhile
29     Words = repeat([""], i - 1)
30 enddef
31
32 def Del(i: number)
33     Words[i] = ""
34     silent! matchdelete(Offset + i + 1)
35 enddef
36
37 def Add(i: number, word: string)
38     Words[i] = word
39     matchadd("MarkWord" .. (i + 1), word, -10, Offset + i + 1)
40 enddef
41
42 export def Refresh()
43     Init()
44     var word: string
45     for i in range(len(Words))
46         exec "syntax clear MarkWord" .. (i + 1)
47         if Words[i] == "" | continue | endif
48         silent! matchdelete(Offset + i + 1)
49         if Show | Add(i, Words[i]) | endif
50     endfor
51 enddef
52
53 export def Toggle()
54     Show = !Show
55     Refresh()
56 enddef
57
58 def Do(word: string)
59     Init()
60     for i in range(len(Words))
61         if !Show | Del(i)
62         elseif Words[i] == word | Del(i) | return
63         endif
64     endfor
65     if !Show | Show = true | endif
66     for i in range(len(Words))
67         if Words[i] != "" | continue | endif
68         Add(i, word)
69         Idx = ((i + 1) == len(Words)) ? 1 : (i + 1)
70         return
71     endfor
72     Del(Idx)
73     Add(Idx, word)
74     Idx = ((Idx + 1) == len(Words)) ? 1 : (Idx + 1)
75 enddef
76
77 export def Word()
78     Do('\<' .. expand("<cword>") .. '\>')
79 enddef