]> Sergey Matveev's repositories - dotfiles.git/blob - vim/.vim/pack/stargrave/start/mark/autoload/mark.vim
My own Mark plugin
[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 Cycle = 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)
38     matchadd("MarkWord" .. (i + 1), Words[i], -10, Offset + i + 1)
39 enddef
40
41 export def Update()
42     Init()
43     var word: string
44     for i in range(len(Words))
45         exec "syntax clear MarkWord" .. (i + 1)
46         if Words[i] == "" | continue | endif
47         silent! matchdelete(Offset + i + 1)
48         if Show | Add(i) | endif
49     endfor
50 enddef
51
52 export def Toggle()
53     Show = !Show
54     Update()
55 enddef
56
57 def Do(word: string): bool
58     Init()
59     if !Show
60         for i in range(len(Words))
61             if Words[i] == "" | continue | endif
62             Del(i)
63         endfor
64         Show = true
65     endif
66     for i in range(len(Words))
67         if word == Words[i]
68             Del(i)
69             return true
70         endif
71     endfor
72     for i in range(len(Words))
73         if Words[i] != "" | continue | endif
74         Del(i)
75         Words[i] = word
76         Add(i)
77         Cycle = ((i + 1) == len(Words)) ? 1 : i + 1
78         return true
79     endfor
80     Del(Cycle)
81     Words[Cycle] = word
82     Add(Cycle)
83     Cycle = ((Cycle + 1) == len(Words)) ? 1 : Cycle + 1
84     return true
85 enddef
86
87 export def Word()
88     Do('\<' .. expand("<cword>") .. '\>')
89 enddef