2010-12-07 07:37:50 -05:00
|
|
|
" Author: Nate Kane <nathanaelkane AT gmail DOT com>
|
|
|
|
" Homepage: http://github.com/nathanaelkane/vim-indent-guides
|
|
|
|
|
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
" Toggles the indent guides on and off for all buffers.
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 04:41:05 -05:00
|
|
|
function! indent_guides#toggle()
|
2010-12-08 06:48:00 -05:00
|
|
|
call indent_guides#init_matches()
|
|
|
|
if empty(w:indent_guides_matches)
|
2010-12-07 04:41:05 -05:00
|
|
|
call indent_guides#enable()
|
2010-12-08 06:48:00 -05:00
|
|
|
|
|
|
|
" DEBUG
|
|
|
|
"echo 'enable'
|
2010-12-07 04:41:05 -05:00
|
|
|
else
|
|
|
|
call indent_guides#disable()
|
2010-12-08 06:48:00 -05:00
|
|
|
|
|
|
|
" DEBUG
|
|
|
|
"echo 'disable'
|
2010-12-07 04:41:05 -05:00
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
" Enables the indent guides for all buffers.
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 04:41:05 -05:00
|
|
|
function! indent_guides#enable()
|
2010-12-08 06:48:00 -05:00
|
|
|
call indent_guides#init_matches()
|
2010-12-07 04:41:05 -05:00
|
|
|
call indent_guides#disable()
|
|
|
|
|
2010-12-07 07:37:50 -05:00
|
|
|
if g:indent_guides_auto_colors
|
|
|
|
call indent_guides#highlight_colors()
|
|
|
|
endif
|
|
|
|
|
|
|
|
" loop through each indent level and define a highlight pattern
|
|
|
|
" will automagically figure out whether to use tabs or spaces
|
2010-12-07 04:41:05 -05:00
|
|
|
for level in range(1, g:indent_guides_indent_levels)
|
2010-12-07 07:37:50 -05:00
|
|
|
let group = 'IndentGuides' . ((level % 2 == 0) ? 'Even' : 'Odd')
|
2010-12-07 04:41:05 -05:00
|
|
|
let multiplier = (&l:expandtab == 1) ? &l:shiftwidth : 1
|
|
|
|
let pattern = '^\s\{' . (level * multiplier - multiplier) . '\}\zs'
|
|
|
|
let pattern .= '\s\{' . multiplier . '\}'
|
|
|
|
let pattern .= '\ze'
|
|
|
|
|
2010-12-07 07:37:50 -05:00
|
|
|
" define the higlight pattern and add to list
|
2010-12-08 06:48:00 -05:00
|
|
|
call add(w:indent_guides_matches, matchadd(group, pattern))
|
2010-12-07 04:41:05 -05:00
|
|
|
|
|
|
|
if g:indent_guides_debug
|
|
|
|
echo "matchadd ('" . group . "', '" . pattern . "')"
|
|
|
|
end
|
|
|
|
endfor
|
2010-12-08 06:48:00 -05:00
|
|
|
|
|
|
|
" DEBUG
|
|
|
|
"echo w:indent_guides_matches
|
2010-12-07 04:41:05 -05:00
|
|
|
endfunction
|
|
|
|
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
" Disables the indent guides for all buffers.
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 04:41:05 -05:00
|
|
|
function! indent_guides#disable()
|
2010-12-08 06:48:00 -05:00
|
|
|
call indent_guides#init_matches()
|
|
|
|
|
|
|
|
if !empty(w:indent_guides_matches)
|
|
|
|
|
|
|
|
" DEBUG
|
|
|
|
"echo w:indent_guides_matches
|
|
|
|
|
2010-12-07 04:41:05 -05:00
|
|
|
let index = 0
|
2010-12-08 06:48:00 -05:00
|
|
|
for match_id in w:indent_guides_matches
|
|
|
|
call matchdelete(match_id)
|
|
|
|
call remove(w:indent_guides_matches, index)
|
2010-12-07 04:41:05 -05:00
|
|
|
let index += index
|
|
|
|
endfor
|
2010-12-08 06:48:00 -05:00
|
|
|
"call filter(w:indent_guides_matches, 0)
|
2010-12-07 04:41:05 -05:00
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
" Automagically calculates and defines the indent highlight colors.
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 04:41:05 -05:00
|
|
|
function! indent_guides#highlight_colors()
|
2010-12-07 07:37:50 -05:00
|
|
|
if g:indent_guides_auto_colors
|
|
|
|
" capture the backgroud color from the normal highlight
|
|
|
|
let hi_normal = indent_guides#capture_highlight('normal')
|
|
|
|
let hi_normal_guibg = matchstr(hi_normal, 'guibg=\zs#[0-9A-Fa-f]\{6\}\ze')
|
|
|
|
|
|
|
|
" calculate the highlight background colors
|
2010-12-07 07:51:31 -05:00
|
|
|
let hi_odd_bg = indent_guides#lighten_or_darken_color(hi_normal_guibg)
|
|
|
|
let hi_even_bg = indent_guides#lighten_or_darken_color(hi_odd_bg)
|
2010-12-07 07:37:50 -05:00
|
|
|
|
|
|
|
" define the new highlights
|
|
|
|
exe "hi IndentGuidesOdd guibg=" . hi_odd_bg
|
|
|
|
exe "hi IndentGuidesEven guibg=" . hi_even_bg
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
" Takes a color and darkens or lightens it depending on whether a dark or
|
|
|
|
" light colorscheme is being used.
|
2010-12-07 07:37:50 -05:00
|
|
|
"
|
2010-12-07 07:51:31 -05:00
|
|
|
function! indent_guides#lighten_or_darken_color(color)
|
2010-12-07 07:37:50 -05:00
|
|
|
let percent = g:indent_guides_auto_colors_change_percent
|
|
|
|
|
|
|
|
let new_color = (&g:background == 'dark') ?
|
2010-12-08 06:48:00 -05:00
|
|
|
\ color_helper#hex_color_lighten(a:color, percent) :
|
|
|
|
\ color_helper#hex_color_darken (a:color, percent)
|
2010-12-07 07:37:50 -05:00
|
|
|
|
|
|
|
return new_color
|
|
|
|
endfunction
|
|
|
|
|
|
|
|
"
|
|
|
|
" Captures and returns the output of highlight group definitions
|
|
|
|
"
|
|
|
|
" Example: indent_guides#capture_highlight('normal')
|
|
|
|
" Returns: 'Normal xxx guifg=#323232 guibg=#ffffff font=DejaVu Sans Mono 9'
|
|
|
|
"
|
|
|
|
function! indent_guides#capture_highlight(group_name)
|
|
|
|
redir => output
|
|
|
|
exe "silent hi " . a:group_name
|
|
|
|
redir END
|
|
|
|
|
|
|
|
return output
|
2010-12-07 04:41:05 -05:00
|
|
|
endfunction
|
|
|
|
|
2010-12-08 06:48:00 -05:00
|
|
|
function! indent_guides#init_matches()
|
|
|
|
let w:indent_guides_matches =
|
|
|
|
\ exists('w:indent_guides_matches') ?
|
|
|
|
\ w:indent_guides_matches : []
|
|
|
|
endfunction
|
|
|
|
|