function! s:replace_word_under_cursor(...) abort
let l:action = 'main'
if len(a:000) > 0
let l:action = a:000[0]
endif
if l:action ==# 'main'
let b:replace_word_data = {}
let b:replace_word_data['changenr'] = changenr()
let l:regex_prefix = ''
let l:regex_suffix = ''
if mode() ==# 'n'
normal! diw
let l:regex_prefix = '\<'
let l:regex_suffix = '\>'
else
echoerr 'Unsupported mode: ' . mode()
return
endif
let b:replace_word_data['string'] = substitute(@@, '\v\n+$', '', 'g')
let b:replace_word_data['escaped_string'] =
\ '\V' . l:regex_prefix .
\ escape(b:replace_word_data['string'], '/\') .
\ l:regex_suffix
startinsert
augroup ReplaceString
autocmd!
autocmd InsertLeave * call s:replace_word_under_cursor('insert_leave')
augroup END
return
endif
if l:action ==# 'insert_leave'
autocmd! ReplaceString InsertLeave
let l:new_string = expand('<cword>')
if empty(l:new_string)
execute 'undo ' . b:replace_word_data['changenr']
return
endif
let l:cursor_pos = getpos('.')
execute 'keeppatterns silent! %substitute/' .
\ b:replace_word_data['escaped_string'] . '/' .
\ escape(l:new_string, '/\') . '/g'
call setpos('.', l:cursor_pos)
echo 'Replace: ' . b:replace_word_data['string'] . ' -> ' . l:new_string
unlet b:replace_word_data
return
endif
endfunction
nnoremap <Leader>rr :call <SID>replace_word_under_cursor()<CR>
Code language: Vim Script (vim)