vim: diff hai phần trong hai tập tin, nhưng không phải toàn bộ tập tin?


14

Tôi đã nâng cấp một hệ thống từ Nagios 2 lên Nagios 3 và bây giờ tôi đang so sánh một số khác biệt trong các tệp cấu hình cũ và mới.

Có những thay đổi đáng kể đối với các tệp cấu hình và tôi không muốn thực hiện một khác biệt trên toàn bộ tệp vì vimdiff đang hiển thị cho tôi quá nhiều sự khác biệt không liên quan và gặp khó khăn khi xử lý các #nhận xét ở đầu dòng, v.v.

Tôi có thể sử dụng vim hoặc chức năng giống như vimdiff để thực hiện khác biệt trên hai phần cụ thể trong hai tệp khác nhau không?

Ví dụ, tôi chỉ muốn khác biệt các dòng trông giống như thế này:

# 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
    }

Câu trả lời:


18

Nghe có vẻ như liniff.vim có thể là những gì bạn muốn: Kiếm Thực hiện một khác biệt tương tác trên hai khối văn bản.

Bạn chỉ định từng khối (phạm vi dòng) bằng :Linedifflệnh của nó (ví dụ: :4,10Linediffhoặc thực hiện lựa chọn trực quan trước, sau đó nhập :Linediff(xuất hiện dưới dạng :'<,'>LineDiff)). Các phạm vi có thể từ cùng một tệp / bộ đệm hoặc khác nhau. Khi bạn đã chỉ định hai phạm vi, nó sẽ mở một tab mới có hai bộ đệm chế độ khác, mới (trong một phần tách) cho các phạm vi được chỉ định. Bạn có thể chỉnh sửa và :wtrong một trong các bộ đệm này để cập nhật phạm vi ban đầu. Khi bạn đã hoàn tất, :qthoát khỏi bộ đệm khác và :LinediffResetđể loại bỏ các bộ xác định phạm vi trong bộ đệm ban đầu.

Các câu trả lời Stackoverflow nơi lần đầu tiên tôi học được của linediff.vim cũng gợi ý một vài ánh xạ. Các câu trả lời khác cho câu hỏi đó cũng đề cập đến một giải pháp tùy chỉnh và một plugin khác có thể giải quyết vấn đề tương tự.


6

Tôi chưa tìm thấy một cách thực sự đơn giản để làm điều này, nhưng tôi đã thành công khá tốt với plugin NrrwRgn (Vùng thu hẹp), http://www.vim.org/scripts/script.php?script_id=3075 . Nó cho phép bạn chọn một vùng của bộ đệm và mở vùng đó trong một bộ đệm mới. Bạn có thể chỉnh sửa bộ đệm mới đó và khi bạn đóng nó, plugin sẽ tự động sao chép văn bản đã chỉnh sửa của bạn trở lại khu vực mà nó xuất phát trong tệp gốc. Bạn cũng có thể sao chép các vùng khác nhau của một hoặc nhiều tệp vào bộ đệm mới, sau đó tìm các bộ đệm mới đó. Đó là cách tôi thường sử dụng plugin - để kiểm tra sự khác biệt giữa các chức năng tương tự được xác định trong một tệp.

Trong trường hợp của bạn, bạn có thể mở cả hai tệp trong Vim, sau đó sử dụng Vđể chọn phần quan tâm trong tệp đầu tiên và nhập \nrđể sao chép phần đó vào bộ đệm mới. Lặp lại cho phần tương tự trong các tập tin khác. Sau đó, trong mỗi hai bộ đệm mới, thực hiện :diffthis.


Cảm ơn bạn! Sẽ \nrlàm gì?
Stefan Lasiewski

1
Plugin ánh xạ <Leader>nr, trong đó <Leader>mặc định là `\`, cho lệnh plugin sao chép vùng đã chọn vào bộ đệm mới.
garyjohn

@ÿjohn làm thế nào để bạn sắp xếp các NrrrRgnphần chia?
dev

1
@dev: Tôi có hai dòng cấu hình NrrwRgn sau đây trong ~ / .vimrc: let g:nrrw_rgn_vert = 1let g:nrrw_rgn_protect = 'n'. Với cái trước, NrrwRgn tách ra ở bên trái của cửa sổ hiện tại. Tôi đã quên nếu họ mở ngay bên trái hoặc bên trái. Điều đó nói rằng, tôi không còn sử dụng NrrwRgn cho việc này, vì đã tìm thấy một thứ tốt hơn: Linediff. Nó mở các vùng mới trong một tab mới, mà tôi thấy gọn gàng hơn và thuận tiện hơn. Bạn có thể tìm thấy LInediff tại http://www.vim.org/scripts/script.php?script_id=3745hoặc https://github.com/AndrewRadev/linediff.vim.
garyjohn

Rất cám ơn @ÿjohn. NrrwRgnkhông ở bên trái hoặc trên cùng, điều này làm cho việc phân chia khá nhiều không thể quản lý được. Tôi thậm chí đã thử các !biến thể nhưng chúng tỏ ra rất mong manh (lỗi tập lệnh + không có cách nào rõ ràng để quay lại tệp gốc). Tôi cũng sẽ linediff.vimcố gắng mặc dù tôi hy vọng NrrwRgnsẽ cải thiện trong tương lai.
dev

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.