Jaki jest zalecany sposób kopiowania zmian za pomocą vimdiff?


117

Porównując pliki i aktualizując repozytorium kodu źródłowego, lubię używać vimdiff. Aby skopiować zmiany dokonane z jednego pliku do drugiego, zwykle używam następującej sekwencji klawiszy:

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, który jest mistrzem skrótów klawiaturowych, z pewnością powinien mieć łatwiejszy sposób wykonywania tego samego zadania. Czy jest jeden Czego używasz do ręcznej aktualizacji zmian w kodzie źródłowym?


2
Dziękuję, że postawiłem sensowne pytanie w moim mglistym odczuciu „nie tak powinno być”. Uzyskałem odpowiedź, której powinienem się nauczyć dawno temu.
Caleb

1
Najlepsze odpowiedzi na twoje pytanie znajdują się tutaj: stackoverflow.com/questions/5288875/…
erik

Odpowiedzi:


181

do(diff uzyskać) i dp(diff put) jest to, czego potrzebujesz. Oto mała lista innych pomocnych poleceń trybu normalnego w tym kontekście.

]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

UWAGA:
Oba doi dpdziałają, jeśli jesteś na bloku lub tylko jednej linii pod blokiem w trybie normalnym, ale nie w trybie wizualnym. Wybierając wiersze tekstu w trybie wizualnym, musisz używać normalnych poleceń

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

Zobacz także :h copy-diffs.

:diffupdate ponownie przeskanuje pliki w poszukiwaniu zmian.


4
Prawdziwe. Na początku wydawało mi się to dość mylące, ponieważ kopiowane są całe (ciągłe) bloki. To, wraz z automatycznym ukrywaniem identycznych linii w trybie różnicowym, sprawiło, że pomyślałem „Co do diabła się właśnie stało?”, Po trzykrotnym sprawdzeniu każdego ruchu, w obu oknach. Powiedzmy, że zmieniłeś wcięcie w jednym z plików; wtedy wyobrażam sobie, że wszystko zostanie przeniesione. Dla dokładniejszej kontroli (tj. Selekcji wizualnej), odkryłem, że pełne polecenia :[range]diffgeti :[range]diffputsą potrzebne.
Alex Leach

8
Można użyć trybu wizualnego razem z diffgeti diffput: ① Wejdź w tryb wizualny i oznaczyć niektóre tekst / linie. Type Następnie wpisz, :diffputaby przesunąć wybrane linie do innego pliku lub :diffgetpobrać wybrane linie z innego pliku.
erik

6
Cześć, czy ktoś wie, czy istnieje odpowiednik „do” (uzyskaj różnicę) dla JUST jednej linii? Powiedzmy, że masz blok kodów (więcej niż jeden wiersz), które są różne, „zrób” kursorem albo w dowolnym wierszu tych kodów, ponieważ tylko wiersz poniżej tych kodów uzyska różnicę dla całego bloku kodu --- Ale Chcę tylko uzyskać różnicę dla JEDNEJ linii. Za każdym razem, gdy muszę wizualnie wybrać tę linię, a następnie „diffget”, trochę nudne ...
wis

12
Ważne jest, aby pamiętać, że polecenie cofania działa tylko w buforze, który został zmieniony, więc jeśli używasz dpi zmieniasz zdanie, musisz przełączyć się na inny bufor, aby cofnąć.
Random832

1
@wiswit: Vzaznacz całą linię, a następnie zacznie dokopiować określoną linię w bieżącym vimie (8.0), niezależnie od jej wartości.
dannysauer
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.