Pregunta:
En algún momento mi Vim desharía una palabra entera cuando golpeo u
.
[i]typing some words[Cc][u]
Resultaría en
typing some
Sin embargo, la granularidad de deshacer parece haber cambiado para eliminar una letra a la vez.
[i]typing some words[Cc][u]
Resultados en
typing some word
Recuerdo haber leído algo sobre cómo personalizar la granularidad de deshacer en Practical Vim, pero no recuerdo cómo controlarlo. ¡Cualquier ayuda apreciada!
Respuesta:
Romper manualmente la secuencia de deshacer
Puede romper manualmente la secuencia de deshacer en el modo Insertar con <CG>u
. De la ayuda :
CTRL-G u break undo sequence, start new change
Ejemplo
iHello<C-G>u world!<Esc>u
Esto te dejará con el texto.
Hello
Desglose de comandos
i " Enter Insert mode
Hello " Type 'Hello'
<C-G>u " Break the undo sequence
world! " Type ' world!'
<Esc> " Return to Normal mode
u " Undo
Solución automática
Control de nivel de deshacer más detallado
Aquí hay un pequeño fragmento de VimScript que usa <CG>u
para crear pausas para deshacer cuando comienza a eliminar texto y también cuando comienza a ingresar texto nuevamente después de una eliminación.
function! s:start_delete(key)
let l:result = a:key
if !s:deleting
let l:result = "\<C-G>u".l:result
endif
let s:deleting = 1
return l:result
endfunction
function! s:check_undo_break(char)
if s:deleting
let s:deleting = 0
call feedkeys("\<BS>\<C-G>u".a:char, 'n')
endif
endfunction
augroup smartundo
autocmd!
autocmd InsertEnter * let s:deleting = 0
autocmd InsertCharPre * call s:check_undo_break(v:char)
augroup END
inoremap <expr> <BS> <SID>start_delete("\<BS>")
inoremap <expr> <C-W> <SID>start_delete("\<C-W>")
inoremap <expr> <C-U> <SID>start_delete("\<C-U>")
Notas
Esto funcionará para <BS>
, <CW>
(eliminar una palabra) y <CU>
(eliminar al principio de la línea). Si hay más formas de eliminar en el modo Insertar, se pueden inoremap
agregando llamadas inoremap
adicionales al final.