Có cách nào để hạn chế kết quả tìm kiếm với sự khác biệt trong một khác biệt không?


7

Tôi muốn chỉ có thể tìm kiếm trong các DiffTextvùng của tệp mà tôi đang chỉnh sửa.

Câu hỏi liên quan: /programming/2683521/vim-search-in-cc-code-lines

Câu trả lời được chấp nhận ở đây dường như hoạt động rất tốt để nói, Commenthoặc Typecác nhóm cú pháp, nhưng bất kỳ nhóm Diff nào cũng không hoạt động. Tôi phỏng đoán nó một cái gì đó để làm với các nhóm khác được lồng trong các nhóm khác.

Kịch bản cụ thể của tôi là tôi đã xóa một loạt các tab và dấu cách từ một loạt các tệp. Tôi đã phân biệt các tệp với bản gốc và muốn đảm bảo rằng không có gì ngoại trừ các tab và dấu cách là khác nhau.

Tái bút: Tôi không muốn thay thế toàn bộ các tab vì người tiền nhiệm của tôi đã sử dụng thụt đầu dòng không nhất quán và tôi cần kiểm tra thủ công tất cả các tab.


2
:set diffopt+=iwhite, hoặc tôi đã hiểu lầm?
Antony

Hmm, tôi cho rằng sẽ làm việc cho kịch bản cụ thể của tôi. Cảm ơn! Tuy nhiên, tôi vẫn muốn biết liệu có cách nào để hạn chế kết quả tìm kiếm cho các tình huống có thể khác hay không.
Tumbler41


Bài đăng đó liên kết đến QI được đăng. : P
Tumbler41

Câu trả lời:


7

Không phải bản chất (tôi cũng đã viết một bản vá, điều đó sẽ cho phép thêm biểu thức bỏ qua vào hàm search (), nhưng điều này chưa được đưa vào).

Nhưng bạn có thể giải quyết nó bằng cách viết chức năng của riêng bạn để kiểm tra xem liệu kết quả khớp có nằm trong vùng khác không. Một cái gì đó như thế này (cách tiếp cận rất cơ bản):

function! Search(pat)
    while search(a:pat, 'w') > 0
        if diff_hlID(line('.'),col('.')) != 0
            break
        endif
    endwhile
endfunction

com! -nargs=1 Search :call Search(<q-args>)

Lỗi kiểm tra và xử lý nhiều trường hợp cạnh hơn (hủy bỏ sau khi tìm kiếm được bao quanh, ví dụ như) để lại cho người dùng.


Man, vim rất lớn; thậm chí không biết diff_hlID tồn tại. Cảm ơn!
Antony

1
Tuyệt vời! Chỉ, trừ khi tôi hiểu điều gì đó sai, tôi nghĩ câu lệnh if của bạn phải là if... != 0Vì vậy, nó sẽ ngừng tìm kiếm khi nó rơi vào một khác biệt. Đó là những gì dường như làm việc cho tôi ít nhất. (Tôi biết chức năng của bạn chưa có ý định hoàn thành, nhưng tôi khá chắc chắn rằng điều này là ngược.)
Tumbler41

@ Tumbler41 Tôi nghĩ rằng điều này là chính xác.
Christian Brabandt

@ChristianBrabandt Chỉnh sửa tâm trí cho độc giả tương lai? :)
Tumbler41

3

Chà, cách đơn giản để tìm kiếm sự khác biệt (tất cả các dòng khác nhau, không chỉ DiffText, xin lỗi) sẽ là chạy difftrên hai tệp, đặt đầu ra vào bộ đệm và tìm kiếm ở đó. Giả sử bạn đang xem filea và fileb trong vimdiff:

:new | r! diff -u0 filea fileb
/search-for-something

Số dòng sẽ ở đầu ra, trong các dòng như

@@ -9,3 +8,6 @@

vì vậy bạn có thể dễ dàng chuyển đến dòng (9) trong tệp gốc:

?@@<CR>0/\d<CR>yw:q!:@"<CR>

Điều này tìm kiếm ngược cho một dòng số dòng, sắp xếp số dòng thành @ ", đóng bộ đệm tìm kiếm tạm thời và nhảy đến số dòng. Bạn có thể muốn xoa bóp nó để tính đến bố cục cửa sổ của mình, v.v., và có thể ánh xạ nó tới một phím.

Bạn cũng có thể bao gồm các dòng ngữ cảnh trong diff, để dễ đọc hơn, nhưng hãy đảm bảo rằng các tìm kiếm của bạn nhìn theo các dòng có thay đổi, tức là các dòng bắt đầu bằng một khoảng trống:

/^\S.*\zssearch-for-something

2
Ah, một cách tiếp cận lọc. Không hoàn toàn những gì tôi có trong tâm trí, nhưng tôi có thể nhận được đằng sau này. Vẫn đang cố gắng để hiểu đầy đủ vĩ mô của bạn mặc dù. Dòng tiêu đề của tôi ở dạng : @@ -292,2 +283,7 @@. Điều đó đang được nói, tôi hoàn toàn không thể hiểu được những gì 0/dành cho mẫu tìm kiếm của bạn. Ngoài ra, yWsẽ có nghĩa là WORD 292,2. Khi bạn thực thi :@"Điều này sẽ đưa bạn đến dòng 2 thay vì 292. Tôi nghĩ rằng tôi sẽ nghĩ ra thứ gì đó như thế này : ?@@.*+?e+1<CR>yw:q!<CR>:@"<CR>. Bạn có thể thay đổi người đầu tiên +để -phụ thuộc vào tập tin bạn muốn xem xét. Suy nghĩ?
Tumbler41

Rất tiếc, lỗi đánh máy ở đó, xin lỗi. Đã chỉnh sửa.
Antony

1
Có một thiếu sót <CR>để chấm dứt mô hình tìm kiếm, và yWnên ywgiống như bạn đã nói!
Antony

2
Vâng, đó là những gợi ý tốt cho tôi. Bạn có thể có hai ánh xạ, tùy thuộc vào tệp bạn muốn chuyển đến hoặc bạn có thể tự động làm việc đó từ đầu +hoặc -ở đầu dòng và tên tệp trong tiêu đề.
Antony
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.