Apa cara yang disarankan untuk menyalin perubahan dengan vimdiff?

117

Saat membandingkan file, dan memperbarui repositori kode sumber, saya suka menggunakan vimdiff. Untuk menyalin perubahan yang dilakukan dari satu file ke file lainnya, saya biasanya menggunakan urutan kunci seperti ini: -

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, sebagai ahli pintasan keyboard, pastinya memiliki cara yang lebih mudah untuk melakukan tugas yang sama ini. Apakah ada satu? Apa yang Anda gunakan untuk memperbarui perubahan kode sumber secara manual?

Alex Leach
sumber
2
Terima kasih telah mengutarakan pengertian "ini bukan seperti seharusnya" menjadi pertanyaan yang bermakna. Jawaban yang muncul adalah sesuatu yang seharusnya saya pelajari sejak lama.
Caleb
1
Jawaban terbaik untuk pertanyaan Anda ada di sini: stackoverflow.com/questions/5288875/…
erik

Jawaban:

181

do(diff dapatkan) dan dp(diff put) adalah apa yang Anda butuhkan. Berikut adalah daftar kecil dari perintah mode normal bermanfaat lainnya dalam konteks ini.

]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

CATATAN:
Keduanya dodan dpberfungsi jika Anda berada di blok atau hanya satu baris di bawah blok dalam mode normal tetapi tidak dalam mode visual. Saat memilih baris teks dalam mode visual, Anda harus menggunakan perintah normal

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

Lihat juga :h copy-diffs.

:diffupdate akan memindai ulang file untuk perubahan.

Marco
sumber
4
Benar. Saya merasa awalnya cukup membingungkan, karena seluruh blok (bersebelahan) disalin. Itu, bersama dengan mode otomatis yang menyembunyikan garis identik, saya mendapati diri saya berpikir "Apa yang baru saja terjadi?", Sebelum memeriksa tiga kali setiap gerakan, di kedua panel. Katakanlah Anda telah mengubah lekukan pada salah satu file; maka saya membayangkan semuanya akan dipindahkan. Untuk kontrol yang lebih halus (mis. Pemilihan visual), saya menemukan bahwa perintah lengkap :[range]diffgetdan :[range]diffputdiperlukan.
Alex Leach
8
Anda dapat menggunakan mode visual bersama dengan diffgetdan diffput: ① Masuk ke mode visual dan tandai beberapa teks / baris. ② Kemudian ketik :diffputuntuk mendorong baris yang dipilih ke file lain atau :diffgetuntuk mendapatkan baris yang dipilih dari file lain.
erik
6
Hai, apakah ada yang tahu jika ada yang setara dengan "lakukan" (dapatkan perbedaan) untuk HANYA satu baris? Katakanlah Anda memiliki satu blok kode (lebih dari satu baris) yang berbeda, "lakukan" dengan kursor baik pada baris mana pun dari kode ini karena hanya baris di bawah kode ini yang akan mendapatkan perbedaan untuk seluruh blok kode --- Tapi Saya hanya ingin mendapatkan perbedaan untuk SATU baris. Setiap kali saya harus memilih garis ini secara visual, diikuti oleh "diffget", sedikit membosankan ...
wiswit
12
Penting untuk dicatat bahwa perintah undo hanya akan berfungsi di buffer yang telah diubah, jadi jika Anda menggunakan dpdan berubah pikiran, Anda perlu beralih ke buffer lain untuk membatalkan.
Random832
1
@wiswit: Vuntuk memilih seluruh baris, kemudian doberfungsi untuk menyalin garis tertentu dalam vim saat ini (8.0), untuk apa pun nilainya.
dannysauer