Quelle est la méthode recommandée pour copier les modifications avec vimdiff?

117

Lors de la comparaison de fichiers et de la mise à jour d'un référentiel de code source, j'aime utiliser vimdiff. Pour copier les modifications apportées d'un fichier à l'autre, j'utilise généralement une séquence de touches comme celle-ci: -

Shift + V (select line)
k or j; { or }; Up or down arrow keys (select more lines)
y  (copy selected lines)
Ctrl + w, left/right arrow (move to other pane)
p (paste lines)

Vim, en tant que maître des raccourcis clavier, devrait sûrement avoir un moyen plus facile d’exécuter cette même tâche. Est-ce qu'il y a un? Qu'est-ce que vous utilisez pour mettre à jour manuellement les modifications de code source?

Alex Leach
la source
2
Merci d’avoir mis mon vague sens de "ce n’est pas ce que cela devrait être" dans une question sérieuse. La réponse obtenue est une chose que j'aurais dû apprendre il y a longtemps.
Caleb
1
Les meilleures réponses à votre question sont ici: stackoverflow.com/questions/5288875/…
erik

Réponses:

181

do(diff obtenir) et dp(diff put) est ce dont vous avez besoin. Voici une petite liste d'autres commandes utiles en mode normal dans ce contexte.

]c               - advance to the next block with differences
[c               - reverse search for the previous block with differences
do (diff obtain) - bring changes from the other file to the current file
dp (diff put)    - send changes from the current file to the other file
zo               - unfold/unhide text
zc               - refold/rehide text
zr               - unfold both files completely
zm               - fold both files completely

REMARQUE:
Les deux doet dptravailler si vous êtes sur un bloc ou une seule ligne sous un bloc en mode normal , mais pas en mode visuel. Lors de la sélection de lignes de texte en mode visuel, vous devez utiliser les commandes normales

  • :'<,'>diffget et
  • :'<,'>diffput.

Voir aussi :h copy-diffs.

:diffupdate va ré-analyser les fichiers pour les changements.

Marco
la source
4
Vrai. Au début, je trouvais cela assez déroutant, car des blocs entiers (contigus) étaient copiés. Cela, avec le masquage automatique de lignes identiques par le mode diff, je me suis dit que "Qu'est-ce qui se passait?", Avant de vérifier trois fois chaque mouvement, dans les deux volets. Supposons que vous ayez modifié l'indentation de l'un des fichiers. alors j'imagine que tout va être déplacé. Pour un contrôle plus fin (sélection visuelle), j’ai trouvé que les commandes complètes :[range]diffgetet :[range]diffputsont nécessaires.
Alex Leach
8
Vous pouvez utiliser le mode visuel avec diffgetet diffput: ① Entrez dans le mode visuel et marquez du texte / des lignes. Puis tapez :diffputpour pousser les lignes sélectionnées vers l'autre fichier ou :diffgetpour obtenir les lignes sélectionnées de l'autre fichier.
erik
6
Bonjour, est-ce que quelqu'un sait s'il y a un équivalent de "do" (obtenir la différence) pour JUST une ligne? Supposons que vous ayez un bloc de codes (plus d'une ligne) différent, "faire" avec le curseur, soit sur l'une des lignes de ces codes, mais uniquement sur la ligne située en dessous de ce code, la différence sera obtenue pour tout le bloc de code --- Mais Je veux juste obtenir la différence pour UNE ligne. Chaque fois que je dois visuellement sélectionner cette ligne, suivie de "diffget", un peu fastidieux ...
wiswit
12
Il est important de noter que la commande d'annulation ne fonctionnera que dans le tampon qui a été modifié. Par conséquent, si vous utilisez dpet changez d'avis, vous devez passer à l'autre tampon pour annuler.
Random832
1
@wiswit: Vpour sélectionner la ligne entière, puis dopour copier une ligne spécifique dans vim (8.0) actuel, quelle qu'en soit la valeur.
dannysauer