Comment puis-je accéder à l'emplacement de ma dernière édition?

68

J'apporte souvent des modifications au milieu d'un fichier volumineux, j'utilise l' gghabitude de sauter au sommet pour vérifier quelque chose, puis je réalise que j'ai oublié de définir une marque à l'endroit où j'étais en train de l'éditer. Existe-t-il un moyen intégré pour accéder à l'emplacement de la dernière ligne modifiée?

Bdesham
la source

Réponses:

84

La `.commande vous amènera à votre dernier changement.

Le `va à une marque, et .est une marque "spéciale" qui est automatiquement placée à la position où la dernière modification a été faite. Voir :help `.pour plus d'informations.

Il y a aussi ``qui vous ramènera à l'endroit où se trouvait le curseur avant de faire votre dernier saut. Voir : aide`` pour plus d'informations.

Une autre marque utile est `^; c'est la position où le curseur était la dernière fois que le mode insertion a été arrêté. Voir :help `^.

Voyez :help mark-motionsdes informations plus générales sur l’utilisation des repères (y compris d’autres repères "spéciaux" automatiquement définis).

Howardh
la source
7
Vous pouvez également utiliser g;et g,pour passer d’une position à l’autre dans la liste des modifications. Voir :h g;et:h g,
Peter Rincker
3
Vous pouvez également utiliser '(apostrophe) au lieu de `(backtick).
Sparhawk
21

Voici une autre approche qui correspond à votre scénario, et qui ira à l’endroit précédent gg(pas à la dernière ligne modifiée).

Utilisation CtrlO

Lorsque vous appuyez sur gg, votre ancienne position de curseur est ajoutée à la liste de sauts . De :help jumplist:

Les sauts sont mémorisés dans une liste de sauts. Avec la commande CTRL-Oet, CTRL-Ivous pouvez accéder aux positions du curseur avant les sauts plus anciens, et inversement. Ainsi, vous pouvez monter et descendre dans la liste. Il existe une liste de sauts distincte pour chaque fenêtre. Le nombre maximum d'entrées est fixé à 100.

[…]

Si vous utilisez une commande de saut, le numéro de ligne actuel est inséré à la fin de la liste de sauts. Si la même ligne était déjà dans la liste de sauts, elle est supprimée. Le résultat est que lors de la répétition, CTRL-Ovous ne retrouverez qu'une fois les anciennes positions.

Cela nécessite que vous utilisiez Vim (pas vi) avec la +jumplistfonctionnalité. Si vous :echo has('jumplist')imprimez 1, vous pouvez l'utiliser.

wchargin
la source
19

Pour ajouter à la réponse de dnetserr et au commentaire de Peter Rincker, Vim tient à jour une liste de modifications et dispose de certaines commandes associées.

:changes

listera les changements, en vous indiquant où ils étaient et ce qu’ils étaient. Par exemple:

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

La ligne avec les >spectacles où vous vous trouvez dans la pile de modifications, un peu comme la liste de sauts ( :jumps) ou la pile de balises ( :tags). De même que la liste de sauts et la pile de balises, vous pouvez parcourir cette liste.

En mode normal, les mouvements doivent g;aller à un emplacement de changement précédent et g,au suivant. Vous pouvez également saisir le numéro de la modification avant g;ou g,pour accéder à cette modification dans la liste. Ci-dessus, 2g;m'emmènerait à l'endroit où le changement impliquant stdio.h s'est produit.

Lorsque vous êtes au milieu de la pile, les numéros des :changesmises à jour indiquent les distances relatives. Par exemple:

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

Cela montre que je peux revenir en arrière ( 1g;ou tout simplement g;) ou avancer ( 1g,ou tout simplement g,).

C’est génial si le changement que vous voulez obtenir s’est produit il ya quelques modifications.

L'inconvénient est qu'il ne semble pas agir comme un mouvement normal. Par exemple, vous ne pouvez pas dg;supprimer du curseur le point de changement précédent, alors d'.que d'^vous travaillez en tant que mouvements.

John O'M.
la source
15

g; ira à la ligne précédemment modifiée.

Dnetserr
la source
3
Vous pouvez également utiliser g, (virgule) pour accéder à une nouvelle position d’édition.
James
5

Étant donné que la commande d'annulation dans Vi agira comme une répétition lorsque la dernière commande était annulée, j'ai utilisé uucomme moyen de revenir à l'endroit où j'ai édité pour la dernière fois.

Si vous utilisez Vim avec nocompatibleset (comme la plupart des gens), vous souhaitez utiliser usuivi de CTRL+Rpour annuler et rétablir. Sinon, uucela fonctionnera comme dans Vi.

Hlovdal
la source
Ce sera si :set nocompatiblen'est pas utilisé.
Muru
2
Mon vim(avec nocompatible) fait deux annulations avec uu, mais j'utilise uet CTRL+rpour le même effet.
Shahbaz
Cette réponse a l’avantage de fonctionner aussi avec vi, au cas où vous n’auriez pas de vim sur Aix / HPUX / Solaris / d’autres variantes Unix.
Guntram Blohm le