moved to autoload
parent
f53fe22884
commit
0af5873a04
|
@ -0,0 +1,159 @@
|
||||||
|
" ======================================================================
|
||||||
|
" File: highlight.vim
|
||||||
|
" Maintainer: Joshua Potter <jrpotter2112@gmail.com>
|
||||||
|
"
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
" SCRIPT VARIABLES:
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
" s:last_seen :: String {{{2
|
||||||
|
" ----------------------------------------------------------------------
|
||||||
|
" The pattern last appended to a registry list.
|
||||||
|
|
||||||
|
let s:last_seen = @/
|
||||||
|
|
||||||
|
|
||||||
|
" s:registry_colors :: { String : String } {{{2
|
||||||
|
" ----------------------------------------------------------------------
|
||||||
|
" Mapping between registry name and color that should be used for
|
||||||
|
" highlighting.
|
||||||
|
|
||||||
|
let s:registry_colors = {}
|
||||||
|
|
||||||
|
|
||||||
|
" s:registry :: { String : { String : Match } } {{{2
|
||||||
|
" ----------------------------------------------------------------------
|
||||||
|
" Name of register corresponding to a dict of some unique identifier of the
|
||||||
|
" word being matched, paired with the actual match object.
|
||||||
|
|
||||||
|
let s:registry = {}
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: GetGroupName(reg) {{{1
|
||||||
|
" ======================================================================
|
||||||
|
" Note group names are not allowed to have special characters; they
|
||||||
|
" must be alphanumeric or underscores.
|
||||||
|
|
||||||
|
function! highlight#get_group_name()
|
||||||
|
return 'highlight_registry_' . char2nr(v:register)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: InitRegister() {{{1
|
||||||
|
" ======================================================================
|
||||||
|
" Setups the group and highlighting. Matches are added afterward.
|
||||||
|
|
||||||
|
function! highlight#init_register(color)
|
||||||
|
call highlight#clear_register()
|
||||||
|
let s:registry_colors[v:register] = a:color
|
||||||
|
exe 'hi ' . highlight#get_group_name() .
|
||||||
|
\ ' cterm=bold,underline ctermfg=' . a:color
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: ClearRegister() {{{1
|
||||||
|
" ======================================================================
|
||||||
|
" Used to clear out the 'registers' that are used to hold which values are
|
||||||
|
" highlighted under a certain match group.
|
||||||
|
|
||||||
|
function! highlight#clear_register()
|
||||||
|
exe 'hi clear ' . highlight#get_group_name()
|
||||||
|
if has_key(s:registry_colors, v:register)
|
||||||
|
unlet s:registry_colors[v:register]
|
||||||
|
endif
|
||||||
|
if has_key(s:registry, v:register)
|
||||||
|
for key in keys(s:registry[v:register])
|
||||||
|
call matchdelete(s:registry[v:register][key])
|
||||||
|
unlet s:registry[v:register][key]
|
||||||
|
endfor
|
||||||
|
unlet s:registry[v:register]
|
||||||
|
endif
|
||||||
|
call highlight#activate_register()
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: CountLastSeen() {{{1
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
function! highlight#count_last_seen()
|
||||||
|
if len(@/) > 0
|
||||||
|
let pos = getpos('.')
|
||||||
|
let pos[2] = pos[2] - 1
|
||||||
|
exe ' %s/' . s:last_seen . '//gne'
|
||||||
|
call setpos('.', pos)
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: ActivateRegister() {{{1
|
||||||
|
" ======================================================================
|
||||||
|
" We must actively set the search register to perform searches as expected.
|
||||||
|
|
||||||
|
function! highlight#activate_register()
|
||||||
|
if has_key(s:registry, v:register) && has_key(s:registry_colors, v:register)
|
||||||
|
let search = ''
|
||||||
|
for key in keys(s:registry[v:register])
|
||||||
|
let search = search . key . '\|'
|
||||||
|
endfor
|
||||||
|
let @/ = search[:-3]
|
||||||
|
exe 'hi Search cterm=bold,underline ctermbg=none ctermfg=' .
|
||||||
|
\ s:registry_colors[v:register]
|
||||||
|
set hlsearch
|
||||||
|
else
|
||||||
|
let @/ = ''
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: AppendToSearch(pattern, ...) {{{1
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
function! highlight#append_to_search(pattern)
|
||||||
|
let s:last_seen = a:pattern
|
||||||
|
if len(a:pattern) > 0
|
||||||
|
if !has_key(s:registry_colors, v:register)
|
||||||
|
call highlight#init_register(g:highlight_register_default_color)
|
||||||
|
endif
|
||||||
|
if !has_key(s:registry, v:register)
|
||||||
|
let s:registry[v:register] = {}
|
||||||
|
endif
|
||||||
|
" Don't want to add multiple match objects into registry
|
||||||
|
if !has_key(s:registry[v:register], a:pattern)
|
||||||
|
let s:registry[v:register][a:pattern] =
|
||||||
|
\ matchadd(highlight#get_group_name(), a:pattern)
|
||||||
|
endif
|
||||||
|
call highlight#activate_register()
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: GetVisualSelection {{{1
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
function! highlight#get_visual_selection()
|
||||||
|
let [lnum1, col1] = getpos("'<")[1:2]
|
||||||
|
let [lnum2, col2] = getpos("'>")[1:2]
|
||||||
|
let lines = getline(lnum1, lnum2)
|
||||||
|
let lines[-1] = lines[-1][:col2 - (&selection == 'inclusive' ? 1 : 2)]
|
||||||
|
let lines[0] = lines[0][col1 - 1:]
|
||||||
|
return substitute(escape(join(lines, "\n"), '\\/.*$%~[]'), '\n', '\\n', 'g')
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
|
" FUNCTION: RemoveFromSearch(pattern) {{{1
|
||||||
|
" ======================================================================
|
||||||
|
|
||||||
|
function! highlight#remove_from_search(pattern)
|
||||||
|
if has_key(s:registry, v:register)
|
||||||
|
if has_key(s:registry[v:register], a:pattern)
|
||||||
|
call matchdelete(s:registry[v:register][a:pattern])
|
||||||
|
unlet s:registry[v:register][a:pattern]
|
||||||
|
if len(s:registry[v:register]) == 0
|
||||||
|
unlet s:registry[v:register]
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
call highlight#activate_register()
|
||||||
|
endfunction
|
||||||
|
|
|
@ -4,229 +4,91 @@
|
||||||
"
|
"
|
||||||
" ======================================================================
|
" ======================================================================
|
||||||
|
|
||||||
if exists('g:loaded_highlight')
|
if exists('g:loaded_highlight_registry')
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let g:loaded_highlight = 1
|
let g:loaded_highlight_registry = 1
|
||||||
|
|
||||||
|
|
||||||
" GLOBAL VARIABLES:
|
" GLOBAL VARIABLES:
|
||||||
" ======================================================================
|
" ======================================================================
|
||||||
|
|
||||||
let g:highlight_register_default_color = 'Yellow'
|
" g:highlight_register_default_color :: String {{{2
|
||||||
|
|
||||||
|
|
||||||
" SCRIPT VARIABLES:
|
|
||||||
" ======================================================================
|
|
||||||
|
|
||||||
" s:last_seen :: String {{{2
|
|
||||||
" ----------------------------------------------------------------------
|
" ----------------------------------------------------------------------
|
||||||
" The pattern last appended to a registry list.
|
|
||||||
|
|
||||||
let s:last_seen = @/
|
if !exists('g:highlight_register_default_color')
|
||||||
|
let g:highlight_register_default_color = 'Yellow'
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
" s:registry_colors :: { String : String } {{{2
|
" g:highlight_registry :: { String : String } {{{2
|
||||||
" ----------------------------------------------------------------------
|
" ----------------------------------------------------------------------
|
||||||
" Mapping between registry name and color that should be used for
|
|
||||||
" highlighting.
|
|
||||||
|
|
||||||
let s:registry_colors = {}
|
if !exists('g:highlight_registry')
|
||||||
|
let g:highlight_registry = { '0' : 'Yellow'
|
||||||
|
\ '1' : 'Blue'
|
||||||
|
\ '2' : 'Red'
|
||||||
|
\ '3' : 'Magenta'
|
||||||
|
\ '4' : 'Green'
|
||||||
|
\ '5' : 'Cyan'
|
||||||
|
\ '6' : 'DarkYellow'
|
||||||
|
\ '7' : 'White'
|
||||||
|
\ '8' : 'Gray'
|
||||||
|
\ '9' : 'Black'
|
||||||
|
\ }
|
||||||
|
endif
|
||||||
|
|
||||||
|
|
||||||
" s:registry :: { String : { String : Match } } {{{2
|
" MAPPINGS: {{{1
|
||||||
" ----------------------------------------------------------------------
|
|
||||||
" Name of register corresponding to a dict of some unique identifier of the
|
|
||||||
" word being matched, paired with the actual match object.
|
|
||||||
|
|
||||||
let s:registry = {}
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: GroupName(reg) {{{1
|
|
||||||
" ======================================================================
|
|
||||||
" Note group names are not allowed to have special characters; they
|
|
||||||
" must be alphanumeric or underscores.
|
|
||||||
|
|
||||||
function! s:GroupName(reg)
|
|
||||||
return 'HighlightRegistry_' . char2nr(a:reg)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: InitRegister(reg) {{{1
|
|
||||||
" ======================================================================
|
|
||||||
" Setups the group and highlighting. Matches are added afterward.
|
|
||||||
|
|
||||||
function! s:InitRegister(reg, color)
|
|
||||||
call s:ClearRegister(a:reg)
|
|
||||||
let s:registry_colors[a:reg] = a:color
|
|
||||||
exe 'hi ' . s:GroupName(a:reg) . ' cterm=bold,underline ctermfg=' . a:color
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: ClearRegister(reg) {{{1
|
|
||||||
" ======================================================================
|
|
||||||
" Used to clear out the 'registers' that are used to hold which values are
|
|
||||||
" highlighted under a certain match group.
|
|
||||||
|
|
||||||
function! s:ClearRegister(reg)
|
|
||||||
exe 'hi clear ' . s:GroupName(a:reg)
|
|
||||||
if has_key(s:registry_colors, a:reg)
|
|
||||||
unlet s:registry_colors[a:reg]
|
|
||||||
endif
|
|
||||||
if has_key(s:registry, a:reg)
|
|
||||||
for key in keys(s:registry[a:reg])
|
|
||||||
call matchdelete(s:registry[a:reg][key])
|
|
||||||
unlet s:registry[a:reg][key]
|
|
||||||
endfor
|
|
||||||
unlet s:registry[a:reg]
|
|
||||||
endif
|
|
||||||
call s:ActivateRegister(a:reg)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: CountLastSeen() {{{1
|
|
||||||
" ======================================================================
|
" ======================================================================
|
||||||
|
|
||||||
function! s:CountLastSeen()
|
" Append Searches
|
||||||
if len(@/) > 0
|
noremap <Plug>HRegistry_AppendToSearch
|
||||||
let pos = getpos('.')
|
\ :call highlight#append_to_search('\<'.expand('<cword>').'\>')<CR>
|
||||||
let pos[2] = pos[2] - 1
|
\ :call highlight#count_last_seen()<CR>
|
||||||
exe ' %s/' . s:last_seen . '//gne'
|
noremap <Plug>HRegistry_GlobalAppendToSearch
|
||||||
call setpos('.', pos)
|
\ :call highlight#append_to_search(expand('<cword>'))<CR>
|
||||||
endif
|
\ :call highlight#count_last_seen()<CR>
|
||||||
endfunction
|
noremap <Plug>HRegistry_VisualAppendToSearch
|
||||||
|
\ :call highlight#append_to_search(highlight#get_visual_selection())<CR>
|
||||||
|
\ :call highlight#count_last_seen()<CR>'<
|
||||||
|
|
||||||
|
" Remove Searches
|
||||||
|
noremap <Plug>HRegistry_RemoveFromSearch
|
||||||
|
\ :call highlight#remove_from_search('\<'.expand('<cword>').'\>')<CR>
|
||||||
|
noremap <Plug>HRegistry_VisualRemoveFromSearch
|
||||||
|
\ :call highlight#remove_from_search(highlight#get_visual_selection())<CR>'<
|
||||||
|
|
||||||
" FUNCTION: ActivateRegister(reg) {{{1
|
" Other Modifications
|
||||||
" ======================================================================
|
noremap <Plug>HRegistry_ClearRegister :call highlight#clear_register()<CR>
|
||||||
" We must actively set the search register to perform searches as expected.
|
noremap <Plug>HRegistry_ActivateRegister :call highlight#activate_register()<CR>
|
||||||
|
noremap <Plug>HRegistry_CountLastSeen :call highlight#count_last_seen()<CR>
|
||||||
|
|
||||||
function! s:ActivateRegister(reg)
|
" Normal Mappings
|
||||||
if has_key(s:registry, a:reg) && has_key(s:registry_colors, a:reg)
|
nmap & <Plug>HRegistry_AppendToSearch
|
||||||
let search = ''
|
nmap g& <Plug>HRegistry_GlobalAppendToSearch
|
||||||
for key in keys(s:registry[a:reg])
|
nmap y& <Plug>HRegistry_ActivateRegister
|
||||||
let search = search . key . '\|'
|
nmap d& <Plug>HRegistry_RemoveFromSearch
|
||||||
endfor
|
nmap c& <Plug>HRegistry_ClearRegister
|
||||||
let @/ = search[:-3]
|
|
||||||
exe 'hi Search cterm=bold,underline ctermbg=none ctermfg=' . s:registry_colors[a:reg]
|
|
||||||
set hlsearch
|
|
||||||
else
|
|
||||||
let @/ = ''
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
nmap * :silent norm! *<CR>&
|
||||||
|
nmap g* :silent norm! *<CR>g&
|
||||||
|
|
||||||
" FUNCTION: AppendToSearch(reg, pattern, ...) {{{1
|
nmap # :silent norm! #<CR>&
|
||||||
" ======================================================================
|
nmap g# :silent norm! #<CR>g&
|
||||||
|
|
||||||
function! s:AppendToSearch(reg, pattern)
|
" Visual Mappings
|
||||||
let s:last_seen = a:pattern
|
vmap & <Plug>HRegistry_VisualAppendToSearch
|
||||||
if len(a:pattern) > 0
|
vmap d& <Plug>HRegistry_VisualRemoveFromSearch
|
||||||
if !has_key(s:registry_colors, a:reg)
|
vmap * &n<Plug>HRegistry_CountLastSeen
|
||||||
call s:InitRegister(a:reg, g:highlight_register_default_color)
|
vmap # &N<Plug>HRegistry_CountLastSeen
|
||||||
endif
|
|
||||||
if !has_key(s:registry, a:reg)
|
|
||||||
let s:registry[a:reg] = {}
|
|
||||||
endif
|
|
||||||
" Don't want to add multiple match objects into registry
|
|
||||||
if !has_key(s:registry[a:reg], a:pattern)
|
|
||||||
let s:registry[a:reg][a:pattern] =
|
|
||||||
\ matchadd(s:GroupName(a:reg), a:pattern)
|
|
||||||
endif
|
|
||||||
call s:ActivateRegister(a:reg)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: GetVisualSelection {{{1
|
|
||||||
" ======================================================================
|
|
||||||
|
|
||||||
function! s:GetVisualSelection()
|
|
||||||
let [lnum1, col1] = getpos("'<")[1:2]
|
|
||||||
let [lnum2, col2] = getpos("'>")[1:2]
|
|
||||||
let lines = getline(lnum1, lnum2)
|
|
||||||
let lines[-1] = lines[-1][:col2 - (&selection == 'inclusive' ? 1 : 2)]
|
|
||||||
let lines[0] = lines[0][col1 - 1:]
|
|
||||||
return substitute(escape(join(lines, "\n"), '\\/.*$%~[]'), '\n', '\\n', 'g')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" FUNCTION: RemoveFromSearch(reg, pattern) {{{1
|
|
||||||
" ======================================================================
|
|
||||||
|
|
||||||
function! s:RemoveFromSearch(reg, pattern)
|
|
||||||
if has_key(s:registry, a:reg) && has_key(s:registry[a:reg], a:pattern)
|
|
||||||
call matchdelete(s:registry[a:reg][a:pattern])
|
|
||||||
unlet s:registry[a:reg][a:pattern]
|
|
||||||
if len(s:registry[a:reg]) == 0
|
|
||||||
unlet s:registry[a:reg]
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
call s:ActivateRegister(a:reg)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
|
|
||||||
" PROCEDURE: Initialize {{{1
|
" PROCEDURE: Initialize {{{1
|
||||||
" ======================================================================
|
" ======================================================================
|
||||||
|
|
||||||
exe 'hi Search cterm=bold,underline ctermbg=none ctermfg=' . g:highlight_register_default_color
|
for key in keys(g:highlight_registry)
|
||||||
|
call highlight#init_register(key, g:highlight_registry[key])
|
||||||
call s:InitRegister('0', 'Yellow')
|
endfor
|
||||||
call s:InitRegister('1', 'Blue')
|
call highlight#append_to_search(v:register, @/)
|
||||||
call s:InitRegister('2', 'Red')
|
|
||||||
call s:InitRegister('3', 'Magenta')
|
|
||||||
call s:InitRegister('4', 'Green')
|
|
||||||
call s:InitRegister('5', 'Cyan')
|
|
||||||
call s:InitRegister('6', 'DarkYellow')
|
|
||||||
call s:InitRegister('7', 'White')
|
|
||||||
call s:InitRegister('8', 'Gray')
|
|
||||||
call s:InitRegister('9', 'Black')
|
|
||||||
|
|
||||||
call s:AppendToSearch(v:register, @/)
|
|
||||||
|
|
||||||
" Word Boundary Search Modifications
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_AppendToSearch
|
|
||||||
\ :call <SID>AppendToSearch(v:register, '\<'.expand('<cword>').'\>')<CR>
|
|
||||||
\ :call <SID>CountLastSeen()<CR>
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_RemoveFromSearch
|
|
||||||
\ :call <SID>RemoveFromSearch(v:register, '\<'.expand('<cword>').'\>')<CR>
|
|
||||||
|
|
||||||
" Arbitrary Search Modifications
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_GlobalAppendToSearch
|
|
||||||
\ :call <SID>AppendToSearch(v:register, expand('<cword>'))<CR>
|
|
||||||
\ :call <SID>CountLastSeen()<CR>
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_VisualAppendToSearch
|
|
||||||
\ :call <SID>AppendToSearch(v:register, <SID>GetVisualSelection())<CR>
|
|
||||||
\ :call <SID>CountLastSeen()<CR>
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_VisualRemoveFromSearch
|
|
||||||
\ :call <SID>RemoveFromSearch(v:register, <SID>GetVisualSelection())<CR>
|
|
||||||
|
|
||||||
" Register Modifications
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_ClearRegister
|
|
||||||
\ :call <SID>ClearRegister(v:register)<CR>
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_ActivateRegister
|
|
||||||
\ :call <SID>ActivateRegister(v:register)<CR>
|
|
||||||
|
|
||||||
" Miscellaneous Mappings
|
|
||||||
noremap <unique> <silent> <Plug>HighlightRegistry_CountLastSeen
|
|
||||||
\ :call <SID>CountLastSeen()<CR>
|
|
||||||
|
|
||||||
" Default Mappings
|
|
||||||
nmap & <Plug>HighlightRegistry_AppendToSearch
|
|
||||||
nmap * :silent norm! *<CR>&
|
|
||||||
nmap # :silent norm! #<CR>&
|
|
||||||
|
|
||||||
nmap g& <Plug>HighlightRegistry_GlobalAppendToSearch
|
|
||||||
nmap g* :silent norm! *<CR>g&
|
|
||||||
nmap g# :silent norm! #<CR>g&
|
|
||||||
|
|
||||||
nmap y& <Plug>HighlightRegistry_ActivateRegister
|
|
||||||
nmap d& <Plug>HighlightRegistry_RemoveFromSearch
|
|
||||||
nmap c& <Plug>HighlightRegistry_ClearRegister
|
|
||||||
|
|
||||||
vmap & <Plug>HighlightRegistry_VisualAppendToSearch'<
|
|
||||||
vmap * &n<Plug>HighlightRegistry_CountLastSeen
|
|
||||||
vmap # &N<Plug>HighlightRegistry_CountLastSeen
|
|
||||||
|
|
||||||
vmap d& <Plug>HighlightRegistry_VisualRemoveFromSearch'<
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue