Files
dotfiles/.config/vim/vimrc.d/80-autocommands.vim
Julian Prein 5ee98950eb vim:autocmd: Check if same cword when highlighting
When highlighting the current word, check if it is the same as the
currently highlighted one, so that matchdelete and matchadd are not
called unnecessarily.
2022-12-06 15:31:53 +01:00

113 lines
3.0 KiB
VimL

" Autocommands """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Terminal
if (has('nvim'))
" Disable spellcheck
augroup terminal_no_spellcheck
au!
autocmd TermOpen * setlocal nospell
augroup END
endif
" change cursor shape depending on mode
augroup cursor_shape_by_mode
au!
if (has('nvim'))
" Beam when exiting
autocmd VimLeave * silent !echo -ne "\e[5 q"
else
" https://vim.fandom.com/wiki/Change_cursor_shape_in_different_modes
" https://github.com/tmux/tmux/issues/1593
if exists('$TMUX')
" Start insert mode - vertical bar/beam
let &t_SI = "\ePtmux;\e\e[5 q\e\\"
" Start replace mode - horizontal bar/underline
let &t_SR = "\ePtmux;\e\e[3 q\e\\"
" End insert or replace mode - block
let &t_EI = "\ePtmux;\e\e[1 q\e\\"
" Block when entering
autocmd VimEnter * silent !echo -ne "\ePtmux;\e\e[1 q\e\\"
" Beam when exiting
autocmd VimLeave * silent !echo -ne "\ePtmux;\e\e[5 q\e\\"
else
" Start insert mode - vertical bar/beam
let &t_SI = "\e[5 q"
" Start replace mode - horizontal bar/underline
let &t_SR = "\e[3 q"
" End insert or replace mode - block
let &t_EI = "\e[1 q"
" Block when entering
autocmd VimEnter * silent !echo -ne "\e[1 q"
" Beam when exiting
autocmd VimLeave * silent !echo -ne "\e[5 q"
endif
endif
augroup END
" Custom bindings when debugging
augroup termdebug_bindings
au!
autocmd SourcePost termdebug.vim tnoremap <Esc> <C-\><C-n>
augroup END
" Highlight word under cursor
function! HighlightCurrentWord()
if exists('w:old_cword') && w:old_cword == expand('<cword>')
" Do not delete and readd the match if on the same word
return
endif
if exists('w:cword_match_id')
call matchdelete(w:cword_match_id)
unlet w:cword_match_id
endif
if (expand('<cword>') != '')
let w:old_cword = expand('<cword>')
let w:cword_match_id = matchadd(
\ 'CursorColumn',
\ '\V\<' . escape(expand('<cword>'), '/\') . '\>',
\ -1)
endif
endfunction
augroup highlight_current_word
au!
au CursorMoved * call HighlightCurrentWord()
au CursorMovedI * call HighlightCurrentWord()
augroup END
" When switching focus to another window, keep the cursor location highlighted.
function! HighlightOldCursorPos()
let w:cursor_pos_match_id = matchaddpos(
\ 'TermCursor',
\ [getcurpos()[1:2]])
endfunction
function! ClearOldCursorPos()
if exists('w:cursor_pos_match_id')
echo 'foo'
call matchdelete(w:cursor_pos_match_id)
unlet w:cursor_pos_match_id
endif
endfunction
augroup highlight_old_cursor_pos
au!
au WinLeave * call HighlightOldCursorPos()
au WinEnter * call ClearOldCursorPos()
" TODO: WinLeave is not triggered when entering command line mode and
" CmdlineEnter is triggered **after** entering
" nnoremap : :call HighlightOldCursorPos()<CR>:
" au CmdlineLeave * call ClearOldCursorPos()
augroup END
" Do not mark input from stdin as modified
augroup stdin_not_modified
au!
au StdinReadPost * set nomodified
augroup END
" Start in insert mode when opening a new file that does not exist yet
augroup newfile_insert
au!
autocmd BufNewFile * startinsert
augroup END