Qual è il modo consigliato di copiare le modifiche con vimdiff?


117

Quando si confrontano i file e si aggiorna un repository di codice sorgente, mi piace usare vimdiff. Per copiare le modifiche apportate da un file all'altro, di solito utilizzo una sequenza di tasti come questa: -

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, essendo il maestro delle scorciatoie da tastiera, dovrebbe sicuramente avere un modo più semplice di eseguire questa stessa attività. Ce n'è uno? Cosa usi per aggiornare manualmente le modifiche al codice sorgente?


2
Grazie per aver messo il mio vago senso di "questo non è quello che dovrebbe essere" in una domanda significativa. La risposta suscitata è qualcosa che avrei dovuto imparare molto tempo fa.
Caleb,

1
Le migliori risposte alla tua domanda sono qui: stackoverflow.com/questions/5288875/…
erik

Risposte:


181

do(diff get) e dp(diff put) è ciò di cui hai bisogno. Ecco un piccolo elenco di altri utili comandi in modalità normale in questo contesto.

]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

NOTA:
Sia doe dplavorare se siete su un blocco o solo una riga sotto un blocco in modalità normale, ma non in modalità visiva. Quando si selezionano le righe di testo in modalità visiva, è necessario utilizzare i normali comandi

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

Vedi anche :h copy-diffs.

:diffupdate eseguirà nuovamente la scansione dei file per le modifiche.


4
Vero. L'ho trovato inizialmente piuttosto confuso, poiché interi blocchi (contigui) vengono copiati. Che, insieme al nascondimento automatico delle linee identiche in modalità diff, mi sono trovato a pensare "Che diavolo è appena successo?", Prima di controllare tre volte ogni mossa, in entrambi i riquadri. Supponi di aver modificato il rientro su uno dei file; allora immagino che tutto verrà spostato. Per un controllo più accurato (cioè selezione visiva), ho scoperto che sono necessari i comandi completi :[range]diffgete :[range]diffput.
Alex Leach,

8
È possibile utilizzare la modalità visiva insieme a diffgete diffput: ① Accedere alla modalità visiva e contrassegnare del testo / delle linee. Type Quindi digitare :diffputper spingere le linee selezionate sull'altro file o :diffgetper ottenere le linee selezionate dall'altro file.
Erik,

6
Ciao, qualcuno sa se esiste un equivalente di "do" (ottenere la differenza) per SOLO una riga? Supponiamo che tu abbia un blocco di codici (più di una riga) che sono diversi, "esegui" con il cursore in corrispondenza di una riga di questi codici solo per la riga sotto questi codici otterrà la differenza per l'intero blocco di codice --- Ma Voglio solo ottenere la differenza per UNA linea. Ogni volta che devo selezionare visivamente questa linea, seguita da "diffget", un po 'noioso ...
wiswit

12
È importante notare che il comando annulla funzionerà solo nel buffer che è stato modificato, quindi se si utilizza dpe si cambia idea, è necessario passare all'altro buffer per annullare.
Casuale 832

1
@wiswit: Vper selezionare l'intera riga, quindi dolavora per copiare su una riga specifica nell'attuale vim (8.0), per quello che vale.
dannysauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.