aboutsummaryrefslogtreecommitdiff
path: root/vim/plugin/cursorline_current.vim
blob: 1ebf5821e17d1ce7a99d22f483fdb98ab05b8120 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
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