Vim: déplacer le curseur à sa dernière position

252

Est-il possible dans (g) Vim de déplacer le curseur à sa position précédente (en mode normal)? Quelque chose à parcourir dans les deux sens dans la liste des positions précédentes du curseur serait idéal. Mais il suffit également de basculer vers le dernier emplacement (quelque chose comme cd -dans bash avec des répertoires).

Voici une petite démonstration:

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

Et supposons que je l'ai fait 2j, voici comment c'est maintenant:

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

Maintenant, je voudrais appuyer sur quelque chose (autre 2kqu'évidemment) pour revenir à la première position et éventuellement aux positions précédentes.

Idan K
la source

Réponses:

410

Le moyen le plus rapide consiste à toucher:

''

(deux apostrophes) ou:

``

(deux backticks). Notez que la différence est que le backtick va au même emplacement sur la ligne, tandis que l'apostrophe va au début de la ligne. Sur un clavier britannique, l'apostrophe est plus accessible, j'ai donc tendance à l'utiliser. Il y a des tas de marques utiles comme celle-ci, voyez :help mark-motions.

Pour certains autres mouvements (pas 2jje pense), il y a aussi la liste de raccourcis qui vous permet de naviguer dans les deux sens parmi un certain nombre de mouvements. CtrlOet CtrlIfaites cette navigation, mais voyez :help jump-motionspour plus d'informations.

DrAl
la source
3
en fait, aucun de ceux-ci ne se comporte exactement comme je l'espère, mais je suppose qu'il n'y a rien d'autre disponible.
Idan K
1
@Idan K - comment `` (double backtick) ne vous donne pas exactement ce que vous voulez? (Sauf pour l'aspect "historique").
Dan
3
@Dan: si je l'essaye sur l'exemple ci-dessus, je vois ce comportement: je me tiens sur la ligne 1, puis jj'appuie deux fois de suite (maintenant je suis sur la ligne 3), puis en appuyant sur la double touche pour atteindre la ligne 1 et j'attends pour passer à la ligne 2.
Idan K
2
Je pense que vous devez vous déplacer (2j ou quelque chose), puis éditer (ou faire n'importe quelle action pour modifier le texte) puis utiliser '' pour revenir à la position précédente. Ce n'est pas logique d'utiliser "2j", de ne rien faire et de revenir à la position précédente
Asenar
8
@IdanK La jumplist n'est mise à jour (c'est-à-dire que la position précédente du curseur est enregistrée) lorsque vous utilisez un "saut" réel qui est (je pense) une commande de mouvement autre que les i j k lmouvements. (La liste complète, à partir des documents d'aide, est "'"', "`", "G", "/", "?", n", "N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", H" and the commands that start editing a new file.) Donc non, cela ne sera pas "annulé" 2jou similaire, mais cela fonctionnera pour presque tout le reste. Cela a du sens car 2jet al. ont déjà de simples inversions ( 2k, etc.), tandis que les autres n'en ont pas.
Kyle Strand
61

Vous pouvez également utiliser g;et g,pour vous déplacer en avant et en arrière dans la liste de vos emplacements de modification précédents .

Sur les claviers non américains

Sur mes dispositions de clavier suisse et allemand, taper de manière ;incommode nécessite l'utilisation de la Shifttouche. Par conséquent, je définissais g-comme un alias plus commode pour g;en $MYVIMRC:

" Map g- as an alias for g;
nnoremap g- g;
Serge Stroobandt
la source
Bien que j'aime beaucoup cela, il ne sautera qu'entre les changements dans un fichier. Si vous modifiez le tampon 1, puis modifiez le tampon 2, il ne reviendra pas au tampon 1.
thouliha
39

Pourquoi personne n'a compris le problème avec la réponse de DrAl ? Le ''ou ``ne résoudra pas le problème d'origine de ce message! Ces deux commandes ne fonctionneront pas pour certains mouvements de curseur comme2j , du moins pour moi. Cela rendra les débutants plus confus.

Le comportement de ''ou ``, et CtrlIou CtrlOest basé sur une liste de raccourcis. Le 2jne sauvegardera pas les changements de position dans la liste de sauts, donc cette commande ne fonctionnera pas 2j.

''ou ``basculer entre la dernière position et la position actuelle. CtrlIet CtrlOparcourir l'historique des listes de raccourcis.

g;et vous g,déplacer dans les positions d'édition, qui sont également très fréquemment utilisées.

ZhaoGang
la source
1
Merci de l'avoir signalé! Je me demande, qu'est-ce qui fonctionnera pour des cas comme ça 2j, alors?
33

Dès l'aide (: aidez à sauter):

: ju [mps] Imprime la liste des sauts (pas une commande de mouvement). {absent de Vi} {non disponible sans la liste | | fonctionnalité}

                          *jumplist*

Les sauts sont mémorisés dans une liste de sauts. Avec la commande CTRL-O et CTRL-I, vous pouvez aller à la position du curseur avant les sauts plus anciens, et inversement. Ainsi, vous pouvez vous déplacer de haut en bas dans la liste. Il existe une liste de raccourcis distincte pour chaque fenêtre. Le nombre maximum d'entrées est fixé à 100. {non disponible sans la | | jumplist | fonctionnalité}

Facundo Casco
la source