Автоматичне виділення тексту однакових рядків


13

Я бачив досвідченого німдзя-віма, який робив це деякий час назад, але я не маю ідеї починати.

A) Чи є спосіб встановити колір фону vims так, щоб виділялися послідовні лінії з однаковим вмістом.

Б) Якщо хтось знає, як це зробити, це приємно змінити це, якби виділення траплялося на послідовних лініях, але враховувало лише перше слово (не весь рядок).

Друге налаштування, якщо підсвічування могло бути налаштоване на різні кольори, використовується на основі кількості відповідних рядків (або активних слів залежно від AB). Тож у нас є лише дві послідовні лінії, які відповідають зеленому, 3-5 послідовних рядків, потім помаранчевим, 6+ і червоним.


Відповіді:


10

Наступні matchнабори, здається, працюють для (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

Здається, тут важливим є порядок. Якщо відповідність Lowабо Mediumзбіги наступає після цього Critical, вони підпадають під більш низькі вимоги до них, а також для Lowwrt Medium.

Виділення не з’являється одразу після того, як ви додасте, скажімо, 3-ту чи 6-ту лінію дупа, але раз трохи переміщаєтесь після додавання. Я не впевнений, що саме це викликає.

Для B, я думаю, ви могли б замінити регулярний вираз на:

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

Загалом, замінити всі (.*)з (\S+).*і \1з \1.*, або те , що являє собою слово для вас.


Я дав цю відповідь галочкою, тому що мені це було як зробити підсвічування, яка мені потрібна (як це виражено в запитанні). @Matts регулярне вираження приємно, але не відповідає на запитання, яке я задав (змінивши підсвічування).
Мартін Йорк

8

Початково, ось шаблон пошуку, який відповідає дублюючим рядкам (ігноруючи зміни у провідному пробілі):

              \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 надасть додаткову інформацію про те, як зробити такі вирази

:help syntax покаже вам, як прийняти цей регулярний вираз і перетворити його на щось, що виділяється для вас

Навчитися писати синтаксичні сценарії може бути важким, тому хорошим короткостроковим рішенням є зробити це "на льоту", переконавшись 'incsearch', що встановлено так, щоб пошуки були виділені і відобразили ключ для виконання вищезазначеного пошуку, тобтоnnoremap <F5> /^\s*\(.\+\)\n\zs\(\s*\1\n\)\+<CR>


Чи існує якийсь автоматизований спосіб розподілу регулярного виразу? Це забезпечує таке чітке зображення.
муру

1
Я робив це вручну. Найпростішим швидким способом у vim було б зробити щось на кшталт yy10pлінії з повним регулярним виразом, а потім вибрати частини, які потрібно видалити, і натисніть r<space>. Можливо, я додам команду "замінити все, крім виділення в цьому рядку пробілами", щоб трохи прискорити роботу.
Метт Боем

Оце Так! Це досить зусиль!
муру

1
Я зробив (дійсно некрасиву) функцію vim, щоб зробити це трохи швидше: gist.github.com/mattboehm/da63a48eedf6f14375aa . Виберіть лінію, натисніть, ,rа потім з'єднайте лінії разом із <space>звичайним / візуальним режимом.
Метт Боем,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.