Vim: Mova o cursor para sua última posição

251

É possível (g) Vim mover o cursor para sua posição anterior (enquanto no modo normal)? Algo para percorrer a lista de posições anteriores do cursor seria o ideal. Mas também basta mudar para o último local (algo como cd -no bash com diretórios).

Aqui está uma pequena demonstração:

line |1| <- cursor position
line 2
line 3
line 4

E suponha que sim 2j, eis como está agora:

line 1
line 2
line |3| <- cursor position
line 4

Agora eu gostaria de pressionar algo (que não seja 2kobviamente) para voltar à primeira posição e possivelmente às posições anteriores.

Idan K
fonte

Respostas:

409

A maneira mais rápida é acertar:

''

(dois apóstrofos) ou:

``

(dois backticks). Observe que a diferença é que o backtick vai para o mesmo local na linha, enquanto o apóstrofo vai para o início da linha. Em um teclado do Reino Unido, o apóstrofo é mais acessível, então eu costumo usá-lo. Existem muitas marcas úteis como esta, veja :help mark-motions.

Para alguns outros movimentos ( 2jacho que não ), há também a lista de atalhos que permite navegar de um lado para o outro entre vários movimentos. CtrlOe CtrlIfaça essa navegação, mas veja :help jump-motionspara obter mais informações.

DrAl
fonte
3
na verdade, nenhum deles se comporta exatamente como eu esperava, mas acho que não há mais nada disponível.
Idan K
1
@Idan K - como `` (backtick duplo) não fornece exatamente o que você deseja? (Exceto pelo aspecto "histórico").
21411 Dan
3
@ Dan: se eu tentar no exemplo acima, vejo o seguinte comportamento: fico na linha 1 e pressiono jduas vezes seguidas (agora estou na linha 3) e, em seguida, pressionar double backtick chega à linha 1 e espero que ele se mova para a linha 2.
Idan K
2
Eu acho que você precisa se mover (2j ou algo assim), depois editar (ou fazer alguma ação para modificar o texto) e usar '' para voltar à posição anterior. Não é lógico usar "2j", não fazer nada e voltar à posição anterior
Asenar
8
@IdanK O jumplist é atualizado apenas (ou seja, a posição anterior do cursor é gravada) quando você usa um "salto" real, que é (eu acho) qualquer comando de movimento que não seja o i j k lmovimento. (A lista completa, dos documentos de ajuda, é "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file.) Portanto, não, isso não será "desfazido" 2jou semelhante, mas funcionará para quase todo o resto. Isso faz sentido porque 2jet al. já tem inversões simples ( 2k, etc), enquanto as outras não.
Kyle Strand
61

Você também pode usar g;e g,para avançar e retroceder na lista dos locais de edição anteriores .

Em teclados fora dos EUA

Nos layouts de teclado suíço e alemão, a digitação ;inconveniente exige o uso da Shifttecla. Daí, eu definido g-como um alias mais conveniente para g;em $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;
Serge Stroobandt
fonte
Embora eu goste muito disso, ele só vai pular entre as alterações em um arquivo. Se você editar o buffer 1 e depois editar o buffer 2, ele não retornará ao buffer 1.
thouliha
39

Por que ninguém descobriu o problema com a resposta do DrAl ? O ''ou ``não resolverá o problema original deste post! Esses dois comandos não funcionarão com movimentos do cursor como 2j, pelo menos para mim. Isso fará com que o novato vim fique mais confuso.

O comportamento de ''ou ``, e CtrlIou CtrlOé baseado na lista de saltos. O 2jnão salvará as alterações de posição na lista de saltos, para que esses comandos não funcionem 2j.

''ou ``alternar entre a última posição e a posição atual. CtrlIe CtrlOtrabalhe no histórico da lista de atalhos.

g;e g,percorra as posições de edição, que também são usadas com muita frequência.

ZhaoGang
fonte
1
Obrigado por apontar isso! Gostaria de saber, o que vai funcionar para casos como 2j, então?
33

Desde a ajuda (: help jump):

: ju [mps] Imprime a lista de saltos (não é um comando de movimento). {não está no Vi} {não disponível sem o | + jumplist | característica}

                          *jumplist*

Os saltos são lembrados em uma lista de saltos. Com os comandos CTRL-O e CTRL-I, você 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. {não disponível sem o | + jumplist | característica}

Facundo Casco
fonte