-
Notifications
You must be signed in to change notification settings - Fork 0
/
vimrc_hl_hacks
122 lines (105 loc) · 3.55 KB
/
vimrc_hl_hacks
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
function! GetSynAttrs( id ) abort
" hlID gets the ID of highlight group
" synIDtrans changes it into a synID (following any hi link)
" synIDattr returns a specific attr
let l:effective_name = synIDattr( synIDtrans( hlID( a:id ) ), 'name' )
redir => l:in_hl
exe 'silent hi ' . l:effective_name
redir END
" grab the section after the xxx in the output which looks like
" Group xxx ....
let l:in_props = matchlist( l:in_hl, '\v\C<xxx>\s+(.*)' )[ 1 ]
return l:in_props
endfunction
function! ToggleHighlightAttr( in, out, attr ) abort
let l:in_props = GetSynAttrs( a:in )
let l:pat = '\v\C' . a:attr . ',|' . a:attr . '$'
" pluck out the properties for gui
let l:match = matchlist( l:in_props, '\v\Cgui\=([^ ]+)' )
if l:match != []
if match( l:match[ 1 ], l:pat ) >= 0
let l:gui = substitute( l:match[ 1 ], l:pat, '', 'g' )
if l:gui == ''
let l:gui = 'NONE'
endif
else
let l:gui = l:match[ 1 ] . ',' . a:attr
endif
else
let l:gui = a:attr
endif
" pluck out the properties for cterm
let l:match = matchlist( l:in_props, '\v\Ccterm\=([^ ]+)' )
if l:match != []
if match( l:match[ 1 ], l:pat ) >= 0
let l:cterm = substitute( l:match[ 1 ], l:pat, '', 'g' )
if l:cterm == ''
let l:cterm = 'NONE'
endif
else
let l:cterm = l:match[ 1 ] . ',' . a:attr
endif
else
let l:cterm = a:attr
endif
" pluck out the properties for term
let l:match = matchlist( l:in_props, '\v\Cterm\=([^ ]+)' )
if l:match != []
if match( l:match[ 1 ], l:pat ) >= 0
let l:term = substitute( l:match[ 1 ], l:pat, '', 'g' )
if l:term == ''
let l:term = 'NONE'
endif
else
let l:term = l:match[ 1 ] . ',' . a:attr
endif
else
let l:term = a:attr
endif
" now remove them all
let l:old = substitute( l:in_props,
\ '\v\C(gui|term|cterm)\=([^ ]+)',
\ '',
\ 'g' )
let cmd = 'hi! ' . a:out . ' '
\ . l:old . ' '
\ . ' gui=' . l:gui
\ . ' cterm=' . l:cterm
\ . ' term=' . l:term
execute cmd
endfunction
function! CreateReversedHighlightGroup( in, default, out )
let l:in_props = GetSynAttrs( a:in )
let l:def_props = GetSynAttrs( a:default )
let l:cmd = 'hi! ' . a:out . ' '
for prefix in [ '', 'gui', 'cterm' ]
let l:in_bg = matchlist( l:in_props, '\v\C<' . prefix . 'bg>\=([^ ]+)' )
let l:def_bg = matchlist( l:def_props, '\v\C<' . prefix . 'bg>\=([^ ]+)' )
if l:in_bg != []
let l:cmd .= ' ' . prefix . 'fg=' . l:in_bg[ 1 ]
let l:in_props = substitute( l:in_props,
\ '\v\C<' . prefix . 'bg>\=([^ ]+)',
\ '',
\ 'g' )
elseif l:def_bg != []
let l:cmd .= ' ' . prefix . 'fg=' . l:def_bg[ 1 ]
endif
let l:in_fg = matchlist( l:in_props, '\v\C<' . prefix . 'fg>\=([^ ]+)' )
let l:def_fg = matchlist( l:def_props, '\v\C<' . prefix . 'fg>\=([^ ]+)' )
if l:in_fg != []
let l:cmd .= ' ' . prefix . 'bg=' . l:in_fg[ 1 ]
let l:in_props = substitute( l:in_props,
\ '\v\C<' . prefix . 'fg>\=([^ ]+)',
\ '',
\ 'g' )
elseif l:def_fg != []
let l:cmd .= ' ' . prefix . 'bg=' . l:def_fg[ 1 ]
endif
endfor
exe l:cmd
endfunction
function! CopyHighlightGroup( in, out )
let l:in_props = GetSynAttrs( a:in )
let l:cmd = 'hi! ' . a:out . ' ' . l:in_props
exe l:cmd
endfunction