From c4501004740d1a95fd7bf61aa4f19ff19a10eaec Mon Sep 17 00:00:00 2001 From: Tom Ryder Date: Sat, 4 Aug 2018 20:20:41 +1200 Subject: Add cursorline_current.vim plugin Also turn on 'cursorline' option in .vimrc, and update sahara.vim colorscheme, which has a nice subdued 'cursorline'. --- vim/bundle/sahara | 2 +- vim/plugin/cursorline_current.vim | 77 +++++++++++++++++++++++++++++++++++++++ vim/vimrc | 5 +++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 vim/plugin/cursorline_current.vim diff --git a/vim/bundle/sahara b/vim/bundle/sahara index 6818d155..5b24c601 160000 --- a/vim/bundle/sahara +++ b/vim/bundle/sahara @@ -1 +1 @@ -Subproject commit 6818d1555a9d733f33f805e91b7147cdfddde048 +Subproject commit 5b24c60103d7ee056b88f1c0cc799d6479d75ece 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 +" 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 diff --git a/vim/vimrc b/vim/vimrc index 84195339..6b181fa7 100644 --- a/vim/vimrc +++ b/vim/vimrc @@ -61,6 +61,11 @@ set comments= " Give me a prompt instead of just rejecting risky :write, :saveas set confirm +" Only turn on 'cursorline' if my colorscheme loaded +if exists('g:colors_name') && g:colors_name ==# 'sahara' + set cursorline +endif + " Try to keep swapfiles in one system-appropriate dir set directory^=~/.vim/cache/swap//,~/vimfiles/cache/swap// -- cgit v1.2.3