]> Sergey Matveev's repositories - dotfiles.git/blob - vim/.vim/pack/stargrave/start/mark/autoload/mark.vim
a13d7a35cc355db1ea385e7989d5d41dc206d7b1
[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 to keep the state
9 # * does not pollute global variable namespace
10 # * has ability only to highlight the current word
11
12 hi MarkWord1 ctermfg=Black ctermbg=Cyan
13 hi MarkWord2 ctermfg=Black ctermbg=Green
14 hi MarkWord3 ctermfg=Black ctermbg=Yellow
15 hi MarkWord4 ctermfg=Black ctermbg=Red
16 hi MarkWord5 ctermfg=Black ctermbg=Magenta
17 hi MarkWord6 ctermfg=Black ctermbg=Blue
18
19 const MarkIdOffset = 3333
20 var Show: bool
21 var Words: list<string>
22 var Idx: number
23
24 def Init()
25     if len(Words) > 0 | return | endif
26     var i = 1
27     while hlexists("MarkWord" .. i) | i = i + 1 | endwhile
28     Words = repeat([""], i - 1)
29 enddef
30
31 def WinRefresh()
32     for i in range(len(Words))
33         exec "syntax clear MarkWord" .. (i + 1)
34         silent! matchdelete(MarkIdOffset + i + 1)
35         if (Words[i] == "") || !Show | continue | endif
36         matchadd("MarkWord" .. (i + 1), Words[i], -10, MarkIdOffset + i + 1)
37     endfor
38 enddef
39
40 export def Refresh()
41     Init()
42     var nr = winnr()
43     silent! windo WinRefresh()
44     silent! exec ":" .. nr .. "wincmd w"
45 enddef
46
47 export def Toggle()
48     Show = !Show
49     Refresh()
50 enddef
51
52 def Do(word: string)
53     for i in range(len(Words))
54         if !Show | Words[i] = ""
55         elseif Words[i] == word | Words[i] = "" | return
56         endif
57     endfor
58     if !Show | Show = true | endif
59     for i in range(len(Words))
60         if Words[i] != "" | continue | endif
61         Words[i] = word
62         Idx = ((i + 1) == len(Words)) ? 0 : (i + 1)
63         return
64     endfor
65     Words[Idx] = word
66     Idx = ((Idx + 1) == len(Words)) ? 0 : (Idx + 1)
67 enddef
68
69 export def Word()
70     Init()
71     Do('\<' .. expand("<cword>") .. '\>')
72     Refresh()
73 enddef