aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2018-08-04 21:02:43 +1200
committerTom Ryder <tom@sanctum.geek.nz>2018-08-04 21:02:43 +1200
commit9481bd3d47f9cec47d08757e56a1942325ef989f (patch)
tree150603f487b3750939d7f39bd34c7737527a438a /plugin
downloadvim-cursorline-current-9481bd3d47f9cec47d08757e56a1942325ef989f.tar.gz
vim-cursorline-current-9481bd3d47f9cec47d08757e56a1942325ef989f.zip
First versionv0.1.0
Diffstat (limited to 'plugin')
-rw-r--r--plugin/cursorline_current.vim76
1 files changed, 76 insertions, 0 deletions
diff --git a/plugin/cursorline_current.vim b/plugin/cursorline_current.vim
new file mode 100644
index 0000000..e42e96d
--- /dev/null
+++ b/plugin/cursorline_current.vim
@@ -0,0 +1,76 @@
+"
+" 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') || v:version < 700
+ 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
+ continue
+ endif
+ execute l:wnum . 'wincmd w'
+ call s:Suspend()
+ 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
+ autocmd VimEnter * call s:Load()
+
+ " Turn off 'cursorline' when leaving a window
+ autocmd WinLeave * call s:Suspend()
+ autocmd WinEnter * call s:Restore()
+
+ " Turn off 'cursorline' when in insert mode
+ " Check g:cursorline_current_insert, in case the user doesn't want it
+ if get(g:, 'cursorline_current_insert', 1)
+ autocmd InsertEnter * call s:Suspend()
+ autocmd InsertLeave * call s:Restore()
+ endif
+
+augroup END