Como pulo para o local da minha última edição?

68

Frequentemente faço alterações no meio de um arquivo grande, uso ggpara pular para o topo para verificar algo e depois percebo que esqueci de definir uma marca onde estava editando. Existe uma maneira interna de pular para o local da última linha alterada?

Bdesham
fonte

Respostas:

84

O `.comando levará você à sua última alteração.

O `vai para uma marca, e .é uma marca "especial" que é automaticamente colocado na posição em que a última alteração foi feita. Veja :help `.para mais algumas informações.

Há também o ``que o levará de volta para onde estava o cursor antes de você dar o seu último salto. Veja : ajuda`` para mais informações.

Outra marca útil é `^; esta é a posição em que o cursor foi a última vez em que o modo de inserção foi parado. Veja :help `^.

Consulte :help mark-motionsalgumas informações mais gerais sobre o uso de marcas (incluindo outras marcas "especiais" que são definidas automaticamente).

howardh
fonte
7
Você também pode usar g;e g,para alternar entre as posições na lista de alterações. Veja :h g;e:h g,
Peter Rincker
3
Você também pode usar '(apóstrofo) em vez de `(backtick).
Sparhawk # 03
21

Aqui está outra abordagem que se ajusta ao seu cenário e saltará para onde você estava imediatamente antes da gg(não da última linha alterada).

Usar CtrlO

Quando você pressiona gg, sua antiga posição do cursor é empurrada para a lista de pulos . De :help jumplist:

Os saltos são lembrados em uma lista de saltos. Com o comando CTRL-Oe, CTRL-Ivocê pode ir para as posições do cursor antes dos saltos mais antigos e voltar novamente. Assim, você pode mover para cima e para baixo na lista. Há uma lista de atalhos separada para cada janela. O número máximo de entradas é fixado em 100.

[...]

Se você usar um comando de salto, o número da linha atual será inserido no final da lista de salto. Se a mesma linha já estava na lista de saltos, ela será removida. O resultado é que, ao repetir, CTRL-Ovocê retornará às posições antigas apenas uma vez.

Isso requer que você esteja usando o Vim (não o vi) com o +jumplistrecurso. Se :echo has('jumplist')imprimir 1, você pode usá-lo.

wchargin
fonte
19

Para adicionar à resposta de dnetserr e ao comentário de Peter Rincker, o Vim mantém uma lista de alterações e possui alguns comandos associados a isso.

:changes

listará as alterações, mostrando onde elas estavam e o que estavam. Por exemplo:

change line  col text
    2     8   17 #include <stdio.h>
    1     3    0 #include "stm32f407.auto.h"
>

A linha com os >shows onde você está na pilha de alterações, como a lista de pulos ( :jumps) ou a pilha de tags ( :tags). Também como a lista de pulos e a pilha de tags, você pode percorrer esta lista.

No modo normal, os movimentos são g;para ir para um local de alteração anterior e g,para o próximo. Você também pode digitar o número da alteração antes g;ou g,para ir para essa alteração na lista. Acima, 2g;me levaria para onde ocorreu a mudança envolvendo stdio.h.

Quando no meio da pilha, os números das :changesatualizações mostram as distâncias relativas. Por exemplo:

change line  col text
    1     8   17 #include <stdio.h>
>   0     3    0 #include "stm32f407.auto.h"
    1    10    4 other

Isso mostra que eu posso voltar um ( 1g;ou apenas g;) ou encaminhar um ( 1g,ou apenas g,).

Isso é ótimo se a alteração que você deseja obter realmente ocorreu algumas modificações atrás

A desvantagem disso é que ele não parece agir como um movimento normal. Por exemplo, você não pode dg;excluir o cursor do local de alteração anterior, d'.e d'^funciona como movimentos.

John O'M.
fonte
15

g; irá para a linha editada anteriormente.

dnetserr
fonte
3
Você também pode usar g, (vírgula) para ir para uma nova posição de edição.
James
5

Como o comando desfazer no Vi funcionará como uma refazer quando o último comando foi desfeito, usei uucomo meio para voltar ao local da última edição.

Se você estiver executando o Vim com nocompatibleset (como a maioria das pessoas), você deseja usar useguido de CTRL+Rpara desfazer e refazer. Caso contrário uu, funcionará como no Vi.

hlovdal
fonte
Será que se :set nocompatiblenão for usado.
muru
2
Meu vim(com nocompatible) faz dois desfazer com uu, mas eu uso ue CTRL+rpara o mesmo efeito.
Shahbaz
Esta resposta tem a vantagem de funcionar com o vi também, caso você não possua vim no Aix / HPUX / Solaris / outras variantes do Unix.
Guntram Blohm