vim: beda dua bagian dalam dua file, tetapi tidak seluruh file?

14

Saya memutakhirkan sistem dari Nagios 2 ke Nagios 3, dan sekarang saya membandingkan beberapa perbedaan dalam file konfigurasi lama dan baru.

Ada perubahan signifikan pada file konfigurasi, dan saya tidak ingin melakukan diff pada seluruh file karena vimdiff menunjukkan kepada saya terlalu banyak perbedaan yang tidak relevan dan kesulitan menangani #komentar di awal baris, dll.

Dapatkah saya menggunakan vim, atau fungsionalitas seperti vimdiff untuk melakukan perbedaan pada dua bagian tertentu dalam dua file yang berbeda?

Sebagai contoh, saya hanya ingin membedakan garis-garis yang terlihat seperti ini:

# Define a service to check the load on the local machine. 

define service{
    use                             local-service         ; Name of service template to use
    host_name                       localhost
    service_description             Blah Blah
    check_command                   Blah Blah
    }
Stefan Lasiewski
sumber

Jawaban:

18

Kedengarannya seperti linediff.vim mungkin yang Anda inginkan: "Lakukan perbedaan interaktif pada dua blok teks".

Anda menentukan setiap blok (rentang garis) dengan :Linediffperintahnya (misalnya :4,10Linediff, atau melakukan pemilihan visual pertama, lalu ketik :Linediff(yang keluar sebagai :'<,'>LineDiff)). Rentang dapat dari file / buffer yang sama atau yang berbeda. Setelah Anda menentukan dua rentang, ini akan membuka tab baru yang memiliki dua buffer mode-baru (secara terpisah) untuk rentang yang ditentukan. Anda dapat mengedit dan :wdi salah satu buffer ini untuk memperbarui rentang asli. Setelah selesai, :qkeluar dari buffer berbeda dan :LinediffResetuntuk menyingkirkan penentu rentang di buffer asli.

The Stackoverflow jawaban di mana saya pertama kali belajar dari linediff.vim juga menunjukkan beberapa pemetaan. Jawaban lain untuk pertanyaan itu juga menyebutkan solusi khusus dan plugin lain yang dapat mengatasi masalah yang sama ini.

Chris Johnsen
sumber
6

Saya belum menemukan cara yang sangat mudah untuk melakukan ini, tapi saya sudah cukup sukses dengan plugin NrrwRgn (Narrow Region), http://www.vim.org/scripts/script.php?script_id=3075 . Ini memungkinkan Anda memilih wilayah buffer dan membuka wilayah itu di buffer baru. Anda dapat mengedit buffer baru itu dan ketika Anda menutupnya, plugin secara otomatis menyalin teks Anda yang sudah diedit kembali ke wilayah asalnya di file asli. Anda juga dapat menyalin wilayah berbeda dari satu atau lebih file ke buffer baru, lalu diff buffer baru itu. Begitulah cara saya biasanya menggunakan plugin - untuk memeriksa perbedaan antara fungsi serupa yang didefinisikan dalam satu file.

Dalam kasus Anda, Anda bisa membuka kedua file di Vim, lalu gunakan Vuntuk memilih bagian yang diminati di file pertama dan ketik \nruntuk menyalin bagian itu ke buffer baru. Ulangi untuk bagian yang serupa di file lain. Kemudian di masing-masing dari dua buffer baru, jalankan :diffthis.

garyjohn
sumber
Terima kasih! Apa yang akan \nrdilakukan
Stefan Lasiewski
1
Plugin memetakan <Leader>nr, tempat <Leader>defaultnya adalah `\`, ke perintah plugin yang menyalin wilayah yang dipilih ke buffer baru.
garyjohn
@garyjohn bagaimana Anda mengatur NrrrRgnpemisahan?
dev
1
@dev: Saya memiliki dua baris konfigurasi NrrwRgn berikut di ~ / .vimrc: let g:nrrw_rgn_vert = 1dan let g:nrrw_rgn_protect = 'n'. Dengan yang pertama, NrrwRgn terbelah terbuka di sebelah kiri jendela saat ini. Saya lupa jika mereka langsung terbuka ke kiri atau ke kiri. Yang mengatakan, saya tidak lagi menggunakan NrrwRgn untuk ini, setelah menemukan sesuatu yang lebih baik: Linediff. Ini membuka daerah baru di tab baru, yang menurut saya lebih rapi dan lebih nyaman. Anda dapat menemukan LInediff di http://www.vim.org/scripts/script.php?script_id=3745atau https://github.com/AndrewRadev/linediff.vim.
garyjohn
Banyak terima kasih @garyjohn. NrrwRgnapakah yang paling kiri atau atas, yang membuat perpecahan cukup banyak yang tidak terkendali. Saya bahkan mencoba !varian tetapi terbukti sangat rapuh (kesalahan skrip + tidak ada cara bersih untuk kembali ke file asli). Akan linediff.vimmencoba juga meskipun saya berharap NrrwRgnmeningkatkan di masa depan.
dev