Last active
March 20, 2019 15:33
-
-
Save jarun/0d89dc61598118926ed82947e88610b3 to your computer and use it in GitHub Desktop.
vimscript to highlight visual selection or string under cursor
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" script modified from: https://bitbucket.org/sjl/dotfiles/src/b6d64b1c4cdf53060e3c30b3b87a653a30dc85d0/vim/vimrc?at=default&fileviewer=file-view-default#vimrc-3125 | |
" | |
" ctermbg color code ref: http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim | |
" Usage | |
" ----- | |
" Add the following to your .vimrc: | |
" :map <silent> <C-a> :normal! gv"zy<CR> | |
" Use '\1' to '\9' for different color highlighting. '\0' clears all highlighting. | |
" In general, a visual selection followed by 1. Esc and 2. ^a will be highlighted. | |
" If there is no visual selection, the word under cursor will be highlighted. | |
function! HiInterestingWord(n) " {{{2 | |
" Save our location. | |
normal! mz | |
" Yank the current word into the z register. | |
"normal! "zyiw | |
" Patched to highlight visual selection, if copied to register "z | |
:if @z == "" | |
normal! "zyiw | |
:endif | |
" Calculate an arbitrary match ID. Hopefully nothing else is using it. | |
let mid = 77750 + a:n | |
" Clear existing matches, but don't worry if they don't exist. | |
"silent! call matchdelete(mid) | |
try | |
call matchdelete(mid) | |
catch 'E803' | |
" Construct a literal pattern that has to match at boundaries. | |
"let pat = '\V\<' . escape(@z, '\') . '\>' | |
" Patched to match substrings | |
let pat = escape(@z, '\') | |
" Actually match the strings. | |
call matchadd("InterestingWord" . a:n, pat, 1, mid) | |
endtry | |
" Move back to our original location. | |
:let @z = "" | |
normal! `z | |
endfunction | |
"clear all highlighting | |
function! ClearAllHi() | |
for i in range(1,9) | |
let mid = 77750 + i | |
silent! call matchdelete(mid) | |
endfor | |
endfunction | |
nnoremap <silent> <leader>0 :call ClearAllHi()<cr> | |
nnoremap <silent> <leader>1 :call HiInterestingWord(1)<cr> | |
nnoremap <silent> <leader>2 :call HiInterestingWord(2)<cr> | |
nnoremap <silent> <leader>3 :call HiInterestingWord(3)<cr> | |
nnoremap <silent> <leader>4 :call HiInterestingWord(4)<cr> | |
nnoremap <silent> <leader>5 :call HiInterestingWord(5)<cr> | |
nnoremap <silent> <leader>6 :call HiInterestingWord(6)<cr> | |
nnoremap <silent> <leader>7 :call HiInterestingWord(7)<cr> | |
nnoremap <silent> <leader>8 :call HiInterestingWord(8)<cr> | |
nnoremap <silent> <leader>9 :call HiInterestingWord(9)<cr> | |
nnoremap <silent> <leader>a :call HiInterestingWord(10)<cr> | |
hi def InterestingWord1 guifg=#000000 ctermfg=16 guibg=#ffa724 ctermbg=214 | |
hi def InterestingWord2 guifg=#000000 ctermfg=16 guibg=#aeee00 ctermbg=154 | |
hi def InterestingWord3 guifg=#000000 ctermfg=16 guibg=#8cffba ctermbg=121 | |
hi def InterestingWord4 guifg=#000000 ctermfg=16 guibg=#b88853 ctermbg=137 | |
hi def InterestingWord5 guifg=#000000 ctermfg=16 guibg=#ff9eb8 ctermbg=211 | |
hi def InterestingWord6 guifg=#000000 ctermfg=16 guibg=#ff2c4b ctermbg=249 | |
hi def InterestingWord7 guifg=#000000 ctermfg=16 guibg=#ff5f00 ctermbg=202 | |
hi def InterestingWord8 guifg=#000000 ctermfg=16 guibg=#d75fd7 ctermbg=170 | |
hi def InterestingWord9 guifg=#000000 ctermfg=16 guibg=#87d7ff ctermbg=117 | |
hi def InterestingWord10 guifg=#000000 ctermfg=16 guibg=#f2f2f2 ctermbg=130 | |
"}}} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I needed something that works like the notepad++ multi-highlight feature (that supports substring matches). This one can highlight the visually selected text and if there's no selection, the string under the cursor.
There is a scope for improvement. Can someone add a patch to search the current highlighted string under the cursor forward and backward with n and p?