├── README.md ├── Rakefile ├── VERSION ├── autoload ├── quickhl.vim └── quickhl │ ├── cword.vim │ ├── manual.vim │ └── tag.vim ├── doc └── quickhl.txt └── plugin └── quickhl.vim /README.md: -------------------------------------------------------------------------------- 1 | ![](https://github.com/t9md/t9md/raw/dc52eaf0f8cb0984697f42c50be09174117b2ddb/img/quickhl_anime.gif) 2 | 3 | [help](https://github.com/t9md/vim-quickhl/blob/master/doc/quickhl.txt) 4 | 5 | # Highlight on the fly. 6 | 7 | quickhl.vim support highlight for 8 | 9 | - manual keywords 10 | - `tag` in ctags generated file 11 | - automatically highlight word under cursor(``). 12 | 13 | # Config 14 | 15 | Minimum 16 | ```Vim 17 | nmap m (quickhl-manual-this) 18 | xmap m (quickhl-manual-this) 19 | nmap M (quickhl-manual-reset) 20 | xmap M (quickhl-manual-reset) 21 | ``` 22 | 23 | Full 24 | ```Vim 25 | nmap m (quickhl-manual-this) 26 | xmap m (quickhl-manual-this) 27 | 28 | nmap w (quickhl-manual-this-whole-word) 29 | xmap w (quickhl-manual-this-whole-word) 30 | 31 | nmap c (quickhl-manual-clear) 32 | vmap c (quickhl-manual-clear) 33 | 34 | nmap M (quickhl-manual-reset) 35 | xmap M (quickhl-manual-reset) 36 | 37 | nmap j (quickhl-cword-toggle) 38 | nmap ] (quickhl-tag-toggle) 39 | map H (operator-quickhl-manual-this-motion) 40 | ``` 41 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | desc "zip" 2 | task :zip do 3 | version = File.read("VERSION").chomp 4 | dirname = File.basename( File.dirname(File.expand_path(__FILE__))) 5 | zipname = "#{dirname}-#{version}.zip" 6 | sh "zip -r #{zipname} README.md autoload doc plugin -x doc/tags" 7 | end 8 | 9 | desc "versub" 10 | task :versub do 11 | version = File.read("VERSION").chomp 12 | files = Dir.glob('{doc,autoload,plugin}/**').select do |f| 13 | File.file? f 14 | end 15 | files.delete('doc/tags') 16 | files.each do |fname| 17 | lines = File.readlines(fname) 18 | lines.map! { |l| l.sub(/Version: (.*)/, "Version: #{version}") } 19 | File.open(fname,'w') {|f| f.puts lines } 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 1.0 2 | -------------------------------------------------------------------------------- /autoload/quickhl.vim: -------------------------------------------------------------------------------- 1 | function! quickhl#get_selected_text() "{{{ 2 | "copy & paste from tyru's open-browser.vim 3 | let save_z = getreg('z', 1) 4 | let save_z_type = getregtype('z') 5 | try 6 | silent normal! gv"zy 7 | return substitute(@z,"\n.*",'','') 8 | finally 9 | call setreg('z', save_z, save_z_type) 10 | endtry 11 | endfunction "}}} 12 | 13 | function! quickhl#warn(error) "{{{ 14 | echohl WarningMsg 15 | echomsg 'quickhl: ' . a:error 16 | echohl None 17 | endfunction "}}} 18 | 19 | let s:metachar = '\/~ .*^[''$' 20 | function! quickhl#escape(pattern) "{{{ 21 | return escape(a:pattern, s:metachar) 22 | endfunction "}}} 23 | 24 | function! quickhl#our_match(pattern) "{{{ 25 | return filter(getmatches(), "v:val.group =~# '". a:pattern . "'") 26 | endfunction "}}} 27 | 28 | function! quickhl#windo(func, obj) abort "{{{ 29 | " [BUG] This function is invoked from WinEnter event. 30 | " Unexpectedly, this event is happen before buffer is not shown on window when invoke `pedit file`. 31 | " So here I will skip unxexisting buffer(which return `-1`) to avoid E994 error. 32 | if exists('*bufwinid') 33 | if bufwinid('') ==# -1 34 | return 35 | endif 36 | endif 37 | if exists('*win_execute') 38 | call map(range(1, winnr('$')), "win_execute(win_getid(v:val), 'call call(a:func, [], a:obj)')") 39 | else 40 | let winnum = winnr() 41 | let pwinnum = winnr('#') 42 | " echo [pwinnum, winnum] 43 | " echo PP(a:func) 44 | " echo PP(a:obj) 45 | noautocmd windo call call(a:func, [], a:obj) 46 | 47 | if pwinnum !=# 0 48 | execute pwinnum . "wincmd w" 49 | endif 50 | execute winnum . "wincmd w" 51 | endif 52 | endfunction "}}} 53 | 54 | " vim: foldmethod=marker 55 | -------------------------------------------------------------------------------- /autoload/quickhl/cword.vim: -------------------------------------------------------------------------------- 1 | let s:cword = { 2 | \ "enable": g:quickhl_cword_enable_at_startup, 3 | \ } 4 | 5 | function! s:cword.init() "{{{ 6 | call self.init_highlight() 7 | endfunction "}}} 8 | 9 | function! s:cword.init_highlight() "{{{ 10 | exe "highlight ". escape(g:quickhl_cword_hl_command, '!|') 11 | " highlight link QuickhlCword Search 12 | endfunction "}}} 13 | 14 | function! s:cword.set() "{{{ 15 | let pattern = quickhl#escape(expand('')) 16 | exe "2match QuickhlCword /\\\<". pattern . "\\\>/" 17 | endfunction "}}} 18 | 19 | function! s:cword.clear() "{{{ 20 | silent! 2match none 21 | endfunction "}}} 22 | 23 | function! s:cword.refresh() "{{{ 24 | call self.clear() 25 | if !self.enable | return | endif 26 | call self.set() 27 | endfunction "}}} 28 | 29 | function! quickhl#cword#init_highlight() "{{{ 30 | call s:cword.init_highlight() 31 | endfunction "}}} 32 | 33 | function! quickhl#cword#enable() "{{{ 34 | let s:cword.enable = 1 35 | augroup QuickhlCword 36 | autocmd! 37 | autocmd! CursorMoved call quickhl#cword#refresh() 38 | autocmd! ColorScheme * call quickhl#cword#init_highlight() 39 | augroup END 40 | call quickhl#cword#init_highlight() 41 | call quickhl#cword#refresh() 42 | endfunction "}}} 43 | 44 | function! quickhl#cword#disable() "{{{ 45 | let s:cword.enable = 0 46 | augroup QuickhlCword 47 | autocmd! 48 | augroup END 49 | autocmd! QuickhlCword 50 | call quickhl#cword#refresh() 51 | endfunction "}}} 52 | 53 | function! quickhl#cword#refresh() "{{{ 54 | call s:cword.refresh() 55 | endfunction "}}} 56 | 57 | function! quickhl#cword#toggle() "{{{ 58 | let s:cword.enable = !s:cword.enable 59 | if s:cword.enable 60 | call quickhl#cword#enable() 61 | else 62 | call quickhl#cword#disable() 63 | endif 64 | endfunction "}}} 65 | 66 | call s:cword.init() 67 | " vim: foldmethod=marker 68 | -------------------------------------------------------------------------------- /autoload/quickhl/manual.vim: -------------------------------------------------------------------------------- 1 | function! s:decho(msg) "{{{1 2 | if g:quickhl_debug 3 | echo "[debug] ". a:msg 4 | endif 5 | endfunction 6 | 7 | function! s:is_cmdwin() "{{{1 8 | return bufname('%') ==# '[Command Line]' 9 | endfunction 10 | 11 | function! s:exe(cmd) "{{{1 12 | call s:decho("[cmd] " . a:cmd) 13 | exe a:cmd 14 | endfunction 15 | "}}} 16 | 17 | 18 | let s:manual = { 19 | \ "name": 'QuickhlManual\d', 20 | \ "enabled": g:quickhl_manual_enable_at_startup, 21 | \ "locked": 0, 22 | \ } 23 | 24 | function! s:manual.dump() "{{{ 25 | if !exists("*PP") 26 | echoerr "need prettyprint.vim" 27 | return 28 | endif 29 | echo PP(self.history) 30 | endfunction "}}} 31 | 32 | function! s:manual.init() "{{{ 33 | let self.colors = self.read_colors(g:quickhl_manual_colors) 34 | let self.history = range(len(g:quickhl_manual_colors)) 35 | call self.init_highlight() 36 | endfunction "}}} 37 | 38 | function! s:manual.read_colors(list) "{{{ 39 | return map(copy(a:list), '{ 40 | \ "name": "QuickhlManual" . v:key, 41 | \ "val": v:val, 42 | \ "pattern": "", 43 | \ "escaped": 0, 44 | \ }') 45 | endfunction "}}} 46 | 47 | function! s:manual.init_highlight() "{{{ 48 | for color in self.colors 49 | exe 'highlight ' . color.name . ' ' . color.val 50 | endfor 51 | endfunction "}}} 52 | 53 | function! s:manual.inject_keywords() "{{{ 54 | call self._inject_keywords( g:quickhl_manual_keywords ) 55 | endfunction "}}} 56 | 57 | function! s:manual._inject_keywords(keywords) "{{{ 58 | for keyword in a:keywords 59 | if type(keyword) == type("") 60 | call self.add(keyword, 0) 61 | elseif type(keyword) == type({}) 62 | call self.add(keyword.pattern, get(keyword, "regexp", 0)) 63 | endif 64 | unlet keyword 65 | endfor 66 | endfunction "}}} 67 | 68 | function! s:manual.set() "{{{ 69 | " call map(copy(self.colors), 'matchadd(v:val.name, v:val.pattern)') 70 | for color in self.colors 71 | call matchadd(color.name, color.pattern, g:quickhl_manual_hl_priority) 72 | endfor 73 | endfunction "}}} 74 | 75 | function! s:manual.clear() "{{{ 76 | call map(map(quickhl#our_match(self.name), 'v:val.id'), 'matchdelete(v:val)') 77 | endfunction "}}} 78 | 79 | function! s:manual.reset() "{{{ 80 | call self.init() 81 | call quickhl#manual#refresh() 82 | if self.enabled | call self.inject_keywords() | endif 83 | endfunction "}}} 84 | 85 | function! s:manual.is_locked() "{{{ 86 | return self.locked 87 | endfunction "}}} 88 | 89 | function! s:manual.refresh() "{{{ 90 | call self.clear() 91 | if self.locked || ( exists("w:quickhl_manual_lock") && w:quickhl_manual_lock ) 92 | return 93 | endif 94 | call self.set() 95 | endfunction "}}} 96 | 97 | function! s:manual.show_colors() "{{{ 98 | for color in self.colors 99 | call s:exe("highlight " . color.name) 100 | endfor 101 | endfunction "}}} 102 | 103 | function! s:manual.add(pattern, escaped) "{{{ 104 | let pattern = a:escaped ? a:pattern : quickhl#escape(a:pattern) 105 | if ( s:manual.index_of(pattern) >= 0 ) 106 | call s:decho("duplicate: " . pattern) 107 | return 108 | endif 109 | call s:decho("new: " . pattern) 110 | let i = self.next_index() 111 | let self.colors[i].pattern = pattern 112 | call add(self.history, i) 113 | endfunction "}}} 114 | 115 | function! s:manual.next_index() "{{{ 116 | " let index = self.index_of('') 117 | " return ( index != -1 ? index : remove(self.history, 0) ) 118 | return remove(self.history, 0) 119 | endfunction "}}} 120 | 121 | function! s:manual.index_of(pattern) "{{{ 122 | for n in range(len(self.colors)) 123 | if self.colors[n].pattern ==# a:pattern 124 | return n 125 | endif 126 | endfor 127 | return -1 128 | endfunction "}}} 129 | 130 | function! s:manual.del(pattern, escaped) "{{{ 131 | let pattern = a:escaped ? a:pattern : quickhl#escape(a:pattern) 132 | 133 | let index = self.index_of(pattern) 134 | call s:decho("[del ]: " . index) 135 | if index == -1 136 | call s:decho("Can't find for '" . pattern . "'" ) 137 | return 138 | endif 139 | call self.del_by_index(index) 140 | endfunction "}}} 141 | 142 | function! s:manual.del_by_index(idx) "{{{ 143 | if a:idx >= len(self.colors) | return | endif 144 | let self.colors[a:idx].pattern = '' 145 | call remove(self.history, index(self.history, a:idx)) 146 | call insert(self.history, a:idx, 0 ) 147 | endfunction "}}} 148 | 149 | function! s:manual.list() "{{{ 150 | for idx in range(len(self.colors)) 151 | let color = self.colors[idx] 152 | exe "echohl " . color.name 153 | echo printf("%2d: ", idx) . color.pattern 154 | echohl None 155 | endfor 156 | endfunction "}}} 157 | 158 | function! s:manual.search(flag) "{{{ 159 | let pattern = '' 160 | for color in self.colors 161 | if color.pattern != '' 162 | let pattern = pattern . '\|' . color.pattern 163 | endif 164 | endfor 165 | " eliminate first '\|' 166 | call search(strpart(pattern, 2), a:flag) 167 | endfunction "}}} 168 | 169 | function! quickhl#manual#this(mode) "{{{ 170 | if !s:manual.enabled | call quickhl#manual#enable() | endif 171 | let pattern = 172 | \ a:mode == 'n' ? expand('') : 173 | \ a:mode == 'v' ? quickhl#get_selected_text() : 174 | \ "" 175 | if pattern == '' | return | endif 176 | " call s:decho("[toggle] " . pattern) 177 | call quickhl#manual#add_or_del(pattern, 0) 178 | endfunction "}}} 179 | 180 | function! quickhl#manual#this_whole_word(mode) "{{{ 181 | if !s:manual.enabled | call quickhl#manual#enable() | endif 182 | let pattern = 183 | \ a:mode == 'n' ? expand('') : 184 | \ a:mode == 'v' ? quickhl#get_selected_text() : 185 | \ "" 186 | if pattern == '' | return | endif 187 | call quickhl#manual#add_or_del('\<'. quickhl#escape(pattern).'\>', 1) 188 | endfunction "}}} 189 | 190 | function! quickhl#manual#clear_this(mode) " {{{ 191 | if !s:manual.enabled | call quickhl#manual#enable() | endif 192 | let pattern = 193 | \ a:mode == 'n' ? expand('') : 194 | \ a:mode == 'v' ? quickhl#get_selected_text() : 195 | \ "" 196 | if pattern == '' | return | endif 197 | let l:pattern_et = quickhl#escape(pattern) 198 | let l:pattern_ew = '\<' . quickhl#escape(pattern) . '\>' 199 | if s:manual.index_of(l:pattern_et) != -1 200 | call s:manual.del(l:pattern_et, 1) 201 | elseif s:manual.index_of(l:pattern_ew) != -1 202 | call s:manual.del(l:pattern_ew, 1) 203 | endif 204 | call quickhl#manual#refresh() 205 | endfunction " }}} 206 | 207 | function! quickhl#manual#add_or_del(pattern, escaped) "{{{ 208 | if !s:manual.enabled | call quickhl#manual#enable() | endif 209 | 210 | if s:manual.index_of(a:escaped ? a:pattern : quickhl#escape(a:pattern)) == -1 211 | call s:manual.add(a:pattern, a:escaped) 212 | else 213 | call s:manual.del(a:pattern, a:escaped) 214 | endif 215 | call quickhl#manual#refresh() 216 | endfunction "}}} 217 | 218 | function! quickhl#manual#reset() "{{{ 219 | call s:manual.reset() 220 | call quickhl#manual#refresh() 221 | endfunction "}}} 222 | 223 | function! quickhl#manual#list() "{{{ 224 | call s:manual.list() 225 | endfunction "}}} 226 | 227 | function! quickhl#manual#lock_window() "{{{ 228 | let w:quickhl_manual_lock = 1 229 | call s:manual.clear() 230 | endfunction "}}} 231 | 232 | function! quickhl#manual#unlock_window() "{{{ 233 | let w:quickhl_manual_lock = 0 234 | call quickhl#manual#refresh() 235 | endfunction "}}} 236 | 237 | function! quickhl#manual#lock_window_toggle() "{{{ 238 | if !exists("w:quickhl_manual_lock") 239 | let w:quickhl_manual_lock = 0 240 | endif 241 | let w:quickhl_manual_lock = !w:quickhl_manual_lock 242 | call s:manual.refresh() 243 | endfunction "}}} 244 | 245 | function! quickhl#manual#lock() "{{{ 246 | let s:manual.locked = 1 247 | call quickhl#manual#refresh() 248 | endfunction "}}} 249 | 250 | function! quickhl#manual#unlock() "{{{ 251 | let s:manual.locked = 0 252 | call quickhl#manual#refresh() 253 | endfunction "}}} 254 | 255 | function! quickhl#manual#lock_toggle() "{{{ 256 | let s:manual.locked = !s:manual.locked 257 | call quickhl#manual#refresh() 258 | endfunction "}}} 259 | 260 | function! quickhl#manual#dump() "{{{ 261 | call s:manual.dump() 262 | " echo s:manual.history 263 | endfunction "}}} 264 | 265 | function! quickhl#manual#add(pattern, escaped) "{{{ 266 | if !s:manual.enabled | call quickhl#manual#enable() | endif 267 | call s:manual.add(a:pattern, a:escaped) 268 | call quickhl#manual#refresh() 269 | endfunction "}}} 270 | 271 | function! quickhl#manual#del(pattern, escaped) "{{{ 272 | if empty(a:pattern) 273 | call s:manual.list() 274 | let index = input("index to delete: ") 275 | if empty(index) | return | endif 276 | call s:manual.del_by_index(index) 277 | else 278 | call s:manual.del(a:pattern, a:escaped) 279 | endif 280 | call quickhl#manual#refresh() 281 | endfunction "}}} 282 | 283 | function! quickhl#manual#colors() "{{{ 284 | call s:manual.show_colors() 285 | endfunction "}}} 286 | 287 | function! quickhl#manual#enable() "{{{ 288 | call s:manual.init() 289 | let s:manual.enabled = 1 290 | call s:manual.inject_keywords() 291 | 292 | augroup QuickhlManual 293 | autocmd! 294 | autocmd VimEnter,WinEnter * call quickhl#manual#refresh() 295 | autocmd! ColorScheme * call quickhl#manual#init_highlight() 296 | augroup END 297 | call quickhl#manual#init_highlight() 298 | call quickhl#manual#refresh() 299 | endfunction "}}} 300 | 301 | function! quickhl#manual#disable() "{{{ 302 | let s:manual.enabled = 0 303 | augroup QuickhlManual 304 | autocmd! 305 | augroup END 306 | autocmd! QuickhlManual 307 | call quickhl#manual#reset() 308 | endfunction "}}} 309 | 310 | function! quickhl#manual#refresh() "{{{ 311 | call quickhl#windo(s:manual.refresh, s:manual) 312 | endfunction "}}} 313 | 314 | function! quickhl#manual#status() "{{{ 315 | echo s:manual.enabled 316 | endfunction "}}} 317 | 318 | function! quickhl#manual#init_highlight() "{{{ 319 | call s:manual.init_highlight() 320 | endfunction "}}} 321 | 322 | function! quickhl#manual#go_to_next(...) "{{{ 323 | let flags = "" 324 | if a:0 == 1 325 | let flags = a:1 326 | endif 327 | call s:manual.search("" . flags) 328 | endfunction "}}} 329 | 330 | function! quickhl#manual#go_to_prev(...) "{{{ 331 | let flags = "" 332 | if a:0 == 1 333 | let flags = a:1 334 | endif 335 | call s:manual.search("b" . flags) 336 | endfunction "}}} 337 | 338 | function! quickhl#manual#this_motion(motion_wise) " {{{ 339 | let lnum_beg = line("'[") 340 | let lnum_end = line("']") 341 | for n in range(lnum_beg, lnum_end) 342 | let _s = getline(n) 343 | let s = { 344 | \ "all": _s, 345 | \ "between": _s[col("'[")-1 : col("']")-1], 346 | \ "pos2end": _s[col("'[")-1 : -1 ], 347 | \ "beg2pos": _s[ : col("']")-1], 348 | \ } 349 | 350 | if a:motion_wise == 'char' 351 | let str = 352 | \ lnum_beg == lnum_end ? s.between : 353 | \ n == lnum_beg ? s.pos2end : 354 | \ n == lnum_end ? s.beg2pos : 355 | \ s.all 356 | elseif a:motion_wise == 'line' | let str = s.all 357 | elseif a:motion_wise == 'block' | let str = s.between 358 | endif 359 | 360 | call quickhl#manual#add_or_del(str, 0) 361 | endfor 362 | endfunction " }}} 363 | 364 | call s:manual.init() 365 | " vim: foldmethod=marker 366 | -------------------------------------------------------------------------------- /autoload/quickhl/tag.vim: -------------------------------------------------------------------------------- 1 | let s:tag = { 2 | \ "name": "QuickhlTag", 3 | \ "enable": g:quickhl_tag_enable_at_startup, 4 | \ } 5 | 6 | function! s:tag.init() "{{{ 7 | call self.init_highlight() 8 | endfunction "}}} 9 | 10 | function! s:tag.init_highlight() "{{{ 11 | exe "highlight ". escape(g:quickhl_tag_hl_command, '!|') 12 | " highlight QuickhlTag gui=underline cterm=underline term=underline 13 | endfunction "}}} 14 | 15 | function! s:tag.set() "{{{ 16 | let taglist = taglist('.*') 17 | call filter(taglist, 'len(v:val.name) >= g:quickhl_tag_minimum_identifier') 18 | for tag in taglist 19 | call matchadd(self.name, tag.name, g:quickhl_tag_hl_priority) 20 | endfor 21 | endfunction "}}} 22 | 23 | function! s:tag.clear() "{{{ 24 | call map(map(quickhl#our_match(self.name), 'v:val.id'), 'matchdelete(v:val)') 25 | endfunction "}}} 26 | 27 | function! s:tag.refresh() "{{{ 28 | " only enable on normal(&buftype is empty) buffer. 29 | call self.clear() 30 | if !empty(&buftype) | return | endif 31 | if !self.enable | return | endif 32 | call self.set() 33 | endfunction "}}} 34 | 35 | function! quickhl#tag#init_highlight() "{{{ 36 | call s:tag.init_highlight() 37 | endfunction "}}} 38 | 39 | function! quickhl#tag#enable() "{{{ 40 | let s:tag.enable = 1 41 | augroup QuickhlTag 42 | autocmd! 43 | autocmd! BufEnter,WinEnter * call quickhl#tag#refresh() 44 | autocmd! ColorScheme * call quickhl#tag#init_highlight() 45 | augroup END 46 | call quickhl#tag#init_highlight() 47 | call quickhl#tag#refresh() 48 | endfunction "}}} 49 | 50 | function! quickhl#tag#disable() "{{{ 51 | let s:tag.enable = 0 52 | augroup QuickhlTag 53 | autocmd! 54 | augroup END 55 | autocmd! QuickhlTag 56 | call quickhl#tag#refresh() 57 | endfunction "}}} 58 | 59 | function! quickhl#tag#toggle() "{{{ 60 | let s:tag.enable = !s:tag.enable 61 | if s:tag.enable 62 | call quickhl#tag#enable() 63 | else 64 | call quickhl#tag#disable() 65 | endif 66 | endfunction "}}} 67 | 68 | function! quickhl#tag#refresh() "{{{ 69 | call quickhl#windo(s:tag.refresh, s:tag) 70 | endfunction "}}} 71 | 72 | call s:tag.init() 73 | " vim: foldmethod=marker 74 | -------------------------------------------------------------------------------- /doc/quickhl.txt: -------------------------------------------------------------------------------- 1 | *quickhl.txt* Quickly highlight multiple pattern. 2 | 3 | .oooooo. o8o oooo oooo oooo ~ 4 | d8P' `Y8b `"' `888 `888 `888 ~ 5 | 888 888 oooo oooo oooo .ooooo. 888 oooo 888 .oo. 888 ~ 6 | 888 888 ` ``888 ` ``888 `888 d88' `"Y8 888 .8P' 888P"Y88b 888 7 | 888 888 888 888 888 888 888888. 888 888 888 > 8 | `88b d88b 888 888 888 888 .o8 888 `88b. 888 888 888 9 | `Y8bood8P'Ybd'`V88V"V8P'o888o`Y8bod8P'o888o o888oo888o o888oo888o 10 | < 11 | Version: 1.0 12 | Author : t9md 13 | License: zlib License 14 | GitHub : https://github.com/t9md/vim-quickhl 15 | ============================================================================== 16 | CONTENTS *quickhl-contents* 17 | 18 | Introduction |quickhl-introduction| 19 | Mapping |quickhl-mapping| 20 | Commands |quickhl-commands| 21 | Variables |quickhl-variables| 22 | Configuration Examples |quickhl-examples| 23 | Use Case |quickhl-usecase| 24 | Practice |quickhl-practice| 25 | Bug |quickhl-bug| 26 | Changelog |quickhl-changelog| 27 | 28 | ============================================================================== 29 | INTRODUCTION *quickhl-introduction* 30 | 31 | 32 | ============================================================================== 33 | MAPPINGS *quickhl-mappings* 34 | 35 | n (quickhl-manual-this) 36 | Highlight ||. 37 | n (quickhl-manual-this-whole-word) 38 | Highlight ||, respect word boundaries. 39 | v (quickhl-manual-this) 40 | Highlight selected text. 41 | 42 | n (quickhl-manual-reset) 43 | v (quickhl-manual-reset) 44 | Clear all manually added highlight 45 | 46 | n (quickhl-manual-clear) 47 | v (quickhl-manual-clear) 48 | Clear the manually added highlight under current cursor. 49 | 50 | n (quickhl-manual-toggle) 51 | v (quickhl-manual-toggle) 52 | Toggle global lock 53 | 54 | n (quickhl-manual-go-to-next) 55 | n (quickhl-manual-go-to-prev) 56 | Jump to next/previous highlight 57 | 58 | n (quickhl-cword-toggle) 59 | n (quickhl-cword-enable) 60 | n (quickhl-cword-disable) 61 | Highlight || with |:2match| 62 | 63 | n (quickhl-tag-enable) 64 | n (quickhl-tag-disable) 65 | n (quickhl-tag-toggle) 66 | Highlight jumpable 'tag' 67 | 68 | oxn (operator-quickhl-manual-this-motion) 69 | Highlight area you {motion}ed. 70 | To use this feature, you must install 'vim-operator-user' plugin. 71 | https://github.com/kana/vim-operator-user 72 | And if you use this, you may not need (quickhl-manual-this). 73 | 74 | ============================================================================== 75 | COMMANDS *quickhl-commands* 76 | 77 | *:QuickhlManualEnable* Enable. 78 | *:QuickhlManualDisable* Disable. 79 | *:QuickhlManualAdd* {pattern} Add {pattern} with meta string escaped. 80 | *:QuickhlManualAdd!* {pattern} Add {pattern} as-is, means you can use |regexp|. 81 | *:QuickhlManualDelete* {pattern} Delete {pattern} with escaped. 82 | *:QuickhlManualDelete!* {pattern} Delete {pattern} as-is. 83 | *:QuickhlManualReset* Reset all keywords except static ones. 84 | *:QuickhlManualList* Show list of keyword with color. 85 | *:QuickhlManualColors* Show color list. 86 | *:QuickhlManualLock* Disable highlight temporarily. 87 | *:QuickhlManualUnlock* Unlock. 88 | *:QuickhlManualLockToggle* Toggle global lock. 89 | *:QuickhlManualLockWindow* Lock version of current window. 90 | *:QuickhlManualUnlockWindow* Unlock current window. 91 | *:QuickhlManualLockWindowToggle* Toggle window lock. 92 | *:QuickhlManualGoToNext* {flags} Jump to next highlight. 93 | *:QuickhlManualGoToPrev* {flags} Jump to previous highlight. 94 | {flags} is passed |search()|. 95 | see ":help search()" 96 | 97 | *:QuickhlCwordEnable* Enable highlighting (updated on |CursorMoved|). 98 | *:QuickhlCwordDisable* Disable. 99 | *:QuickhlCwordToggle* Toggle. 100 | 101 | *:QuickhlTagEnable* Enable highlighting of jumpable |tag|s. 102 | *:QuickhlTagDisable* Disable. 103 | *:QuickhlTagToggle* Toggle. 104 | ============================================================================== 105 | VARIABLES *quickhl-variables* 106 | 107 | [ manual ]~ 108 | *g:quickhl_manual_enable_at_startup* 109 | Default: 0 110 | 111 | *g:quickhl_manual_hl_priority* 112 | Default: 10 113 | 114 | These priority value is used when highlight with |matchadd()|. 115 | The bigger value overwrite lower prioritized highlight. 116 | 117 | *g:quickhl_manual_colors* 118 | Default: 13 colors defined. see 'plugin/quickhl.vim' for detail. 119 | 120 | |List| of color's definition used to quick-highlight. 121 | see |quickhl-examples|. 122 | You can add as many colors as you want. 123 | If you want to highlight 20 keyword at a time, you need to set 20 124 | variation of color in this |List|. 125 | 126 | *g:quickhl_manual_keywords* 127 | Default: [] 128 | 129 | |List| of keyword always highlighted. 130 | 'keyword' could be specified as sequence of |String| or |Dictionary|. 131 | String~ 132 | "keyword1" 133 | Dictionary~ 134 | { "pattern": 'KEYWORD', "regexp": 1 } 135 | "regexp" is optional, if you set it to 1, the KEYWORD you specified 136 | will not escaped, so it's useful you want to add 'regexp' keyword. 137 | 138 | [ tag ]~ 139 | *g:quickhl_tag_enable_at_startup* 140 | Default: 0 141 | 142 | *g:quickhl_tag_hl_priority* 143 | Default: 9 144 | See |g:quickhl_manual_hl_priority|. 145 | 146 | *g:quickhl_tag_hl_command* 147 | Default: 'QuickhlTag gui=underline cterm=underline term=underline' 148 | [NOTE] Don't change 'QuickhlTag' 149 | 150 | Passed to |:highlight|. Set this if you want change default highlight. 151 | 152 | *g:quickhl_tag_minimum_identifier* 153 | Default: 4 154 | specify minimum length of tag to highlight. 155 | tag shorter than this value would not be highlighted. 156 | 157 | [ cword ]~ 158 | *g:quickhl_cword_enable_at_startup* 159 | Default: 0 160 | 161 | *g:quickhl_cword_hl_command* 162 | Default: 'link QuickhlCword Search' 163 | [NOTE] Don't change 'QuickhlCword' 164 | 165 | Passed to |:highlight|. Set this if you want change default highlight. 166 | 167 | ============================================================================== 168 | CONFIGURATION EXAMPLE *quickhl-examples* 169 | 170 | set in your '.vimrc' 171 | > 172 | nmap m (quickhl-manual-this) 173 | xmap m (quickhl-manual-this) 174 | nmap (quickhl-manual-toggle) 175 | xmap (quickhl-manual-toggle) 176 | 177 | nmap M (quickhl-manual-reset) 178 | xmap M (quickhl-manual-reset) 179 | 180 | nmap j (quickhl-cword-toggle) 181 | 182 | nmap ] (quickhl-tag-toggle) 183 | 184 | map H (operator-quickhl-manual-this-motion) 185 | < 186 | 187 | Want to change default color? 188 | > 189 | let g:quickhl_manual_colors = [ 190 | \ "gui=bold ctermfg=16 ctermbg=153 guifg=#ffffff guibg=#0a7383", 191 | \ "gui=bold ctermfg=7 ctermbg=1 guibg=#a07040 guifg=#ffffff", 192 | \ "gui=bold ctermfg=7 ctermbg=2 guibg=#4070a0 guifg=#ffffff", 193 | \ "gui=bold ctermfg=7 ctermbg=3 guibg=#40a070 guifg=#ffffff", 194 | \ ] 195 | < 196 | 197 | Add keyword which is always highlighted. 198 | > 199 | let g:quickhl_manual_keywords._ = [ 200 | \ "finish", 201 | \ {"pattern": '\s\+$', "regexp": 1 }, 202 | \ {"pattern": '\d\{1,3}\.\d\{1,3}\.\d\{1,3}\.\d\{1,3}', "regexp": 1 }, 203 | \ ] 204 | < 205 | ============================================================================== 206 | CHANGELOG *quickhl-changelog* 207 | 2013-10-08: 208 | - add g:quickhl_tag_minimum_identifier(default: 4) to avoid short tag 209 | make mess on the window. 210 | 2013-10-06: 211 | - add operator 212 | Originally created by 'rbtnn'. Thanks 'rbtnn'!! 213 | https://github.com/rbtnn/vim-operator-quickhl.vim 214 | 2013-10-06: v0.9 215 | - introduce tag highlight and a lot of refactoring. 216 | 2011-09-03: 217 | - bugfix duplicate keyword added when TabEnter or ColorScheme event. 218 | 2011-09-01: v0.5 219 | - support regexp pattern 220 | - extend command :QuickhlDel could delete by index 221 | - extend g:quickhl_keywords to support regexp pattern. 222 | 2011-08-21: v0.4 223 | - fix compatibility issue for pre v7.2 224 | 2011-08-18: v0.3 225 | - add new command :QuickhlLock and :QuichlUnlock. 226 | 2011-08-17: v0.2 227 | - completely re-writen to use |match()| other than |:syntax|. 228 | 2011-06-21: v0.1 229 | - initial version 230 | ============================================================================== 231 | vim:tw=78:ts=8:ft=help:norl: 232 | -------------------------------------------------------------------------------- /plugin/quickhl.vim: -------------------------------------------------------------------------------- 1 | "============================================================================= 2 | " File: quickhl.vim 3 | " Author: t9md 4 | " WebPage: http://github.com/t9md/vim-quickhl 5 | " License: BSD 6 | " Version: 1.0 7 | "============================================================================= 8 | " GUARD: {{{ 9 | if !exists('g:quickhl_debug') 10 | let g:quickhl_debug = 0 11 | endif 12 | 13 | if exists('g:loaded_quickhl') 14 | finish 15 | endif 16 | let g:loaded_quickhl = 1 17 | 18 | let s:old_cpo = &cpo 19 | set cpo&vim 20 | " }}} 21 | 22 | " GlobalVar: {{{ 23 | if !exists("g:quickhl_manual_colors") 24 | let g:quickhl_manual_colors = [ 25 | \ "cterm=bold ctermfg=16 ctermbg=153 gui=bold guifg=#ffffff guibg=#0a7383", 26 | \ "cterm=bold ctermfg=7 ctermbg=1 gui=bold guibg=#a07040 guifg=#ffffff", 27 | \ "cterm=bold ctermfg=7 ctermbg=2 gui=bold guibg=#4070a0 guifg=#ffffff", 28 | \ "cterm=bold ctermfg=7 ctermbg=3 gui=bold guibg=#40a070 guifg=#ffffff", 29 | \ "cterm=bold ctermfg=7 ctermbg=4 gui=bold guibg=#70a040 guifg=#ffffff", 30 | \ "cterm=bold ctermfg=7 ctermbg=5 gui=bold guibg=#0070e0 guifg=#ffffff", 31 | \ "cterm=bold ctermfg=7 ctermbg=6 gui=bold guibg=#007020 guifg=#ffffff", 32 | \ "cterm=bold ctermfg=7 ctermbg=21 gui=bold guibg=#d4a00d guifg=#ffffff", 33 | \ "cterm=bold ctermfg=7 ctermbg=22 gui=bold guibg=#06287e guifg=#ffffff", 34 | \ "cterm=bold ctermfg=7 ctermbg=45 gui=bold guibg=#5b3674 guifg=#ffffff", 35 | \ "cterm=bold ctermfg=7 ctermbg=16 gui=bold guibg=#4c8f2f guifg=#ffffff", 36 | \ "cterm=bold ctermfg=7 ctermbg=50 gui=bold guibg=#1060a0 guifg=#ffffff", 37 | \ "cterm=bold ctermfg=7 ctermbg=56 gui=bold guibg=#a0b0c0 guifg=black", 38 | \ ] 39 | endif 40 | 41 | let s:default_settings = { 42 | \ "g:quickhl_manual_enable_at_startup": 0, 43 | \ "g:quickhl_manual_keywords": [], 44 | \ "g:quickhl_manual_hl_priority": 10, 45 | \ "g:quickhl_tag_enable_at_startup": 0, 46 | \ "g:quickhl_tag_hl_command": 'QuickhlTag gui=underline cterm=underline term=underline', 47 | \ "g:quickhl_tag_hl_priority": 9, 48 | \ "g:quickhl_tag_minimum_identifier": 4, 49 | \ "g:quickhl_cword_enable_at_startup": 0, 50 | \ "g:quickhl_cword_hl_command": 'link QuickhlCword Search', 51 | \ } 52 | 53 | function! s:set_default(dict) "{{{ 54 | for [var, val] in items(a:dict) 55 | if !exists(var) | let {var} = val | endif 56 | unlet! var val 57 | endfor 58 | endfunction "}}} 59 | 60 | call s:set_default(s:default_settings) 61 | 62 | "}}} 63 | 64 | " Keymap: {{{ 65 | nnoremap (quickhl-manual-this) :call quickhl#manual#this('n') 66 | vnoremap (quickhl-manual-this) :call quickhl#manual#this('v') 67 | nnoremap (quickhl-manual-this-whole-word) :call quickhl#manual#this_whole_word('n') 68 | vnoremap (quickhl-manual-this-whole-word) :call quickhl#manual#this_whole_word('v') 69 | nnoremap (quickhl-manual-reset) :call quickhl#manual#reset() 70 | vnoremap (quickhl-manual-reset) :call quickhl#manual#reset() 71 | nnoremap (quickhl-manual-clear) :call quickhl#manual#clear_this('n') 72 | vnoremap (quickhl-manual-clear) :call quickhl#manual#clear_this('v') 73 | nnoremap (quickhl-manual-toggle) :call quickhl#manual#lock_toggle() 74 | vnoremap (quickhl-manual-toggle) :call quickhl#manual#lock_toggle() 75 | nnoremap (quickhl-manual-go-to-next) :call quickhl#manual#go_to_next('s') 76 | nnoremap (quickhl-manual-go-to-prev) :call quickhl#manual#go_to_prev('s') 77 | 78 | nnoremap (quickhl-cword-toggle) :call quickhl#cword#toggle() 79 | nnoremap (quickhl-cword-enable) :call quickhl#cword#enable() 80 | nnoremap (quickhl-cword-disable) :call quickhl#cword#disable() 81 | 82 | nnoremap (quickhl-tag-enable) :call quickhl#tag#enable() 83 | nnoremap (quickhl-tag-disable) :call quickhl#tag#disable() 84 | nnoremap (quickhl-tag-toggle) :call quickhl#tag#toggle() 85 | 86 | command! QuickhlManualEnable :call quickhl#manual#enable() 87 | command! QuickhlManualDisable :call quickhl#manual#disable() 88 | 89 | command! QuickhlManualList :call quickhl#manual#list() 90 | "command! QuickhlManualDump :call quickhl#manual#dump() 91 | command! QuickhlManualReset :call quickhl#manual#reset() 92 | command! QuickhlManualColors :call quickhl#manual#colors() 93 | command! -bang -nargs=1 QuickhlManualAdd :call quickhl#manual#add(,0) 94 | command! -bang -nargs=* QuickhlManualDelete :call quickhl#manual#del(,0) 95 | command! QuickhlManualLock :call quickhl#manual#lock() 96 | 97 | command! -nargs=? QuickhlManualGoToNext :call quickhl#manual#go_to_next() 98 | command! -nargs=? QuickhlManualGoToPrev :call quickhl#manual#go_to_prev() 99 | 100 | command! QuickhlManualUnlock :call quickhl#manual#unlock() 101 | command! QuickhlManualLockToggle :call quickhl#manual#lock_toggle() 102 | command! QuickhlManualLockWindow :call quickhl#manual#lock_window() 103 | command! QuickhlManualUnlockWindow :call quickhl#manual#unlock_window() 104 | command! QuickhlManualLockWindowToggle :call quickhl#manual#lock_window_toggle() 105 | 106 | command! QuickhlCwordEnable :call quickhl#cword#enable() 107 | command! QuickhlCwordDisable :call quickhl#cword#disable() 108 | command! QuickhlCwordToggle :call quickhl#cword#toggle() 109 | 110 | command! QuickhlTagEnable :call quickhl#tag#enable() 111 | command! QuickhlTagDisable :call quickhl#tag#disable() 112 | command! QuickhlTagToggle :call quickhl#tag#toggle() 113 | "}}} 114 | 115 | try 116 | call operator#user#define('quickhl-manual-this-motion', 'quickhl#manual#this_motion') 117 | catch /E117:/ 118 | endtry 119 | 120 | if g:quickhl_cword_enable_at_startup 121 | call quickhl#cword#enable() 122 | endif 123 | if g:quickhl_tag_enable_at_startup 124 | call quickhl#tag#enable() 125 | endif 126 | if g:quickhl_manual_enable_at_startup 127 | call quickhl#manual#enable() 128 | endif 129 | "}}} 130 | 131 | " FINISH: {{{ 132 | let &cpo = s:old_cpo 133 | "}}} 134 | " vim: set fdm=marker: 135 | --------------------------------------------------------------------------------