undo-redo – ¿Cómo cambiar la granularidad de deshacer en Vim?

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.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım