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?

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).


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.


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.


15

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.