Como o vim determina o tamanho de uma única "edição" ao usar "u" e "CTL-R"?

17

Ao usar uou CTL-Rdesfazer ou refazer uma edição no vim, pareço alterar trechos de texto, não apenas as teclas mais recentes.

O que determina o tamanho do pedaço que é considerado uma única edição?

DQdlM
fonte

Respostas:

19

Você está procurando a definição de undo-blocks.

De :h undo-blocks:

Um comando desfazer normalmente desfaz um comando digitado, independentemente de quantas alterações esse comando fizer. Essa sequência de alterações que podem ser desfeitas forma um bloco de desfazer. Portanto, se a (s) tecla (s) digitada (s) chamam uma função, todos os comandos na função são desfeitos juntos.

O mesmo bloco é usado para redo. De :h redo:

As últimas alterações são lembradas. Você pode usar os comandos desfazer e refazer acima para reverter o texto como estava antes de cada alteração. Você também pode aplicar as alterações novamente, retornando o texto antes de desfazer.

vappolinario
fonte
4
Você também pode separar manualmente um único desfazer bloco com o comando CTRL-G uno modo de inserção, o que é útil se você tiver algumas macros do modo de inserção.
fruglemonkey
8

Edição modal do Vim é muitas vezes visto como um operador (por exemplo c, d...) aplicado sobre um movimento (por exemplo iw, w, }, ...). Como um produto maravilhoso, o Vim recebe desfazer pedaços. Onde outros editores precisam adivinhar para transformar muitos pequenos desfazer em blocos de desfazer, o Vim faz isso naturalmente. Outro efeito colateral é que isso fornece um operador de repetição .(também conhecido como comando dot).

Sua pergunta menciona especificamente pressionamentos de teclas, portanto, presumo que você queira saber como desfazer pequenas alterações enquanto estiver no modo de inserção. A resposta é que este não é "o caminho do Vim". "The Vim Way" significa que você estará no modo de inserção por breves momentos de cada vez. Isso significa que quando erros são cometidos no modo de inserção, você geralmente sai do modo normal e corrige o texto ou apenas desfaz ue reescreve o texto.

Às vezes, é necessário dividir um bloco de desfazer no modo de inserção. Isso pode ser feito através do <c-g>umodo de inserção. Veja :h :undoje :h undo-blockspara mais informações.

Para obter mais ajuda, sugiro o seguinte:

:h undo-blocks
:h :undoj
:h undo-tree
:h persistent-undo
:h undo.txt

Existem também alguns screencasts sobre esse assunto:

Peter Rincker
fonte
"Chunky undo" - a melhor descrição que eu já vi.
Matt Parker
6

Você também pode pensar dessa maneira: toda vez que você insere o modo para editar o texto e pressiona Esc, isso forma um bloco. Se você tentar desfazer esse bloco, irá para a mesma posição antes de entrar no modo de inserção.

Portanto, você pode "salvar" suas alterações apenas saindo do modo de inserção de tempos em tempos: digamos que você vá para o modo de inserção e escreva uma função. Você pode continuar codificando e ir para a próxima função, mas às vezes é preferível voltar ao modo normal e alternar para o modo de inserção novamente. Dessa forma, você pode ter seu código estruturado de maneira simples e, se precisar voltar, poderá saber em que posição você terminará.

Nota: se você usar setas para mover, é como se você pressionasse Esc+ [ hjkl]

Wylex
fonte