aboutsummaryrefslogtreecommitdiff
path: root/vim/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'vim/plugin')
-rw-r--r--vim/plugin/cursorline_current.vim77
1 files changed, 77 insertions, 0 deletions
diff --git a/vim/plugin/cursorline_current.vim b/vim/plugin/cursorline_current.vim
new file mode 100644
index 00000000..1ebf5821
--- /dev/null
+++ b/vim/plugin/cursorline_current.vim
@@ -0,0 +1,77 @@
+"
+" cursorline_current: If 'cursorline' is globally on, only enable it for the
+" current window, and only when not in insert mode. Essentially, make
+" 'cursorline' follow the actual normal-mode cursor as much as possible.
+"
+" Author: Tom Ryder <tom@sanctum.geek.nz>
+" License: Same as Vim itself
+"
+if exists('g:loaded_cursorline_current') || &compatible
+ finish
+endif
+if !has('autocmd') || !has('windows')
+ finish
+endif
+let g:loaded_cursorline_current = 1
+
+" Suspend 'cursorline' when a window is inactive or inserting
+function! s:Suspend() abort
+ let w:cursorline_current_cache = &l:cursorline
+ setlocal nocursorline
+endfunction
+
+" Restore 'cursorline' when a window is active and non-insert
+function! s:Restore() abort
+
+ " If we don't have a value for 'cursorline' from a previous s:Suspend(), use
+ " the global value as the default
+ if !exists('w:cursorline_current_cache')
+ let w:cursorline_current_cache = &g:cursorline
+ endif
+
+ " Restore local value to the cached value and clear it
+ let &l:cursorline = w:cursorline_current_cache
+ unlet w:cursorline_current_cache
+
+endfunction
+
+" Call s:Suspend() on all windows besides the current one
+function! s:Load() abort
+
+ " Cache current window index
+ let l:wcur = winnr()
+
+ " Iterate through all the windows and suspend all but the current one
+ for l:wnum in range(1, winnr('$'))
+ if l:wnum != l:wcur
+ execute l:wnum . 'windo call s:Suspend()'
+ endif
+ endfor
+
+ " Return to the window in which we started
+ execute l:wcur . 'wincmd w'
+
+endfunction
+
+" Set up hooks for toggling 'cursorline'
+augroup cursorline_current
+ autocmd!
+
+ " Turn off 'cursorline' for other windows on load
+ if exists('##VimEnter')
+ autocmd VimEnter * call s:Load()
+ endif
+
+ " Turn off 'cursorline' when leaving a window
+ if exists('##WinEnter') && exists('##WinLeave')
+ autocmd WinLeave * call s:Suspend()
+ autocmd WinEnter * call s:Restore()
+ endif
+
+ " Turn off 'cursorline' when in insert mode
+ if exists('##InsertEnter') && exists('##InsertLeave')
+ autocmd InsertEnter * call s:Suspend()
+ autocmd InsertLeave * call s:Restore()
+ endif
+
+augroup END