Tự động đánh dấu văn bản dòng giống hệt


13

Tôi đã thấy một ninja vim lành nghề làm điều này một thời gian trước nhưng tôi không có ý tưởng nào để bắt đầu.

A) Có cách nào để thiết lập màu nền vims để các dòng liên tiếp có nội dung giống hệt nhau được tô sáng.

B) Nếu ai đó biết cách thực hiện một điều chỉnh tốt cho điều này sẽ là nếu việc tô sáng xảy ra trên các dòng liên tiếp nhưng chỉ xem xét từ đầu tiên (không phải toàn bộ dòng).

Một điều chỉnh thứ hai nếu việc tô sáng có thể được cấu hình thành các màu khác nhau được sử dụng dựa trên số lượng dòng phù hợp (hoặc các từ tùy thuộc vào AB đang hoạt động). Vì vậy, chúng tôi chỉ có hai dòng liên tiếp khớp với màu xanh lá cây, 3-5 dòng liên tiếp rồi màu cam, 6+ rồi màu đỏ.


Câu trả lời:


10

Các matchbộ sau đây dường như hoạt động cho (A):

:syn match Low /\v(.+)\n(\1\n)/
:syn match Medium /\v(.+)\n(\1\n){2,4}/
:syn match Critical /\v(.+)\n(\1\n){5,}/
:hi Critical  ctermfg=red
:hi Medium  ctermfg=yellow
:hi Low  ctermfg=green

Có vẻ như thứ tự là rất quan trọng ở đây. Nếu Lowhay Mediumcác trận đấu đến sau Critical, nó được gộp bởi các yêu cầu lỏng hơn trong số này, và tương tự cho Lowwrt Medium.

Việc tô sáng không xuất hiện ngay sau khi bạn thêm, ví dụ, dòng dupe thứ 3 hoặc thứ 6, nhưng một khi bạn di chuyển xung quanh một chút sau khi thêm chúng. Tôi không chắc chắn những gì kích hoạt nó, chính xác.

Đối với B, tôi tưởng tượng bạn có thể thay thế regex bằng:

/\v(\S+).*\n(\1.*\n)/

Nói chung, thay thế tất cả (.*)bằng (\S+).*\1với \1.*, hoặc bất cứ điều gì tạo thành một từ cho bạn.


Tôi đã đưa ra câu trả lời này vì tôi biết làm thế nào để làm nổi bật những gì tôi cần (như thể hiện bằng câu hỏi). @Matts biểu thức chính quy đẹp nhưng không trả lời câu hỏi thực tế tôi đã hỏi (thay đổi phần tô sáng).
Martin York

8

Là điểm bắt đầu, đây là mẫu tìm kiếm khớp với các dòng trùng lặp (bỏ qua các thay đổi trong khoảng trắng hàng đầu):

              \zs                marks start of the pattern. Everything before here will not be highlighted
 ^                               start of the line
  \s*                            leading whitespace
       .\+                       match 1 or more non-newline characters
     \(   \)                     and use parens to capture this in match group 1

            \n                   match the newline character
                 \(        \)\+  1 or more
                      \1         copies of what was in the match group 1
                   \s*  \n       with leading whitespace followed by a newline
/^\s*\(.\+\)\n\zs\(\s*\1\n\)\+   the full regex

:help pattern sẽ cung cấp thêm thông tin về cách tạo regexes như thế này

:help syntax sẽ chỉ cho bạn cách lấy biểu thức chính quy này và biến nó thành một cái gì đó được làm nổi bật cho bạn

Học cách viết các kịch bản cú pháp có thể khó khăn, vì vậy một giải pháp ngắn hạn tốt là thực hiện điều này 'nhanh chóng' bằng cách đảm bảo 'incsearch'được đặt để các tìm kiếm được tô sáng và ánh xạ một phím để thực hiện tìm kiếm ở trên, tức lànnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


Có một số cách tự động phân phối regex như vậy? Nó cung cấp một mô tả rõ ràng như vậy.
muru

1
Tôi đã làm nó bằng tay. Cách nhanh nhất dễ dàng nhất trong vim sẽ là làm một cái gì đó giống như yy10ptrên dòng với regex đầy đủ sau đó chọn các phần bạn muốn loại bỏ và nhấn r<space>. Có lẽ tôi sẽ thêm một lệnh 'thay thế mọi thứ trừ lựa chọn trên dòng này bằng dấu cách' để tăng tốc mọi thứ lên một chút.
Matt Boehm

Ồ Đó là một nỗ lực khá nhiều!
muru

1
Tôi đã tạo một hàm vim (thực sự xấu xí) để làm điều này nhanh hơn một chút: gist.github.com/mattboehm/da63a48eedf6f14375aa . Chọn một dòng, nhấn ,rrồi nối các dòng cùng với <space>ở chế độ bình thường / trực quan.
Matt Boehm
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.