Gvim Поиск по блоку - PullRequest
       32

Gvim Поиск по блоку

2 голосов
/ 23 августа 2011

Мне было интересно, есть ли какой-нибудь способ в Gvim перемещаться по результатам поиска по "блоку".«Блок» имеет шаблон поиска, встречающийся в каждой строке.Таким образом, команда должна перейти от строки 1 к строке 5, n + 1, n + 4 и так далее.Он должен игнорировать совпадения, происходящие в последовательных строках (блок!), И переходить к следующему блоку.Также, если есть какой-то способ определить размер «блока без шаблона»

Line 1: Pattern
Line 2: Pattern
Line 3: Pattern
Line 4: 
Line 5: Pattern
---- No Pattern here ----
Line n+1: Pattern
Line n+2: 
Line n+3: 
Line n+4: Pattern
Line n+5: Pattern

Ответы [ 3 ]

0 голосов
/ 23 августа 2011

Можно использовать две разные стратегии, чтобы описать ваше определение блока. Во-первых, шаблон поиска может быть разработан, чтобы соответствовать первой строке блок, то есть строка, которая соответствует шаблону, но не следует за линией совпадающие по той же схеме.

/\%(\1\n\)\@<!\(pattern\)

Во-вторых, можно искать несколько последующих строк, соответствующих шаблону. Но чтобы пропустить целый блок, чтобы найти следующее вхождение, требуется поставить курсор на конец блока при сопоставлении.

/\(pattern\)\%(\n\1\)*/e

Лично я предпочитаю первое решение.

0 голосов
/ 27 августа 2011

Вы можете сложить для этого.

Чтобы сложить блоки смежных линий, содержащие последний искомый шаблон:

:se fdm=expr foldenable foldexpr=getline(v:lnum)=~@/

Теперь вы можете использовать обычную навигацию сгиба

  • zM - закрыть все сгибы
  • zR - открыть все сгибы
  • zj переместить один сгибвниз, zk сдвинуться на один раз вверх

  • zcdd вернуть текущий блок в регистр по умолчанию

0 голосов
/ 23 августа 2011

Сразу же я не могу вспомнить, есть ли у vim возможность выполнять многострочное сопоставление. Если это так, вы можете указать новые строки в шаблоне поиска. В Perl это выглядело бы примерно так (я быстро вынул это, не просматривая многострочное регулярное выражение, поэтому у меня может быть неправильный синтаксис, но он достаточно близок, чтобы служить примером).

/(pattern)(\n(pattern)*){4}/m

Это будет искать 'pattern', затем 4 строки, которые могут содержать или не содержать 'pattern'.

Проблема в том, что если у вас есть два блока, которые перекрываются, я думаю, что этот поиск запутается.

Другая вещь, которую вы могли бы сделать, это определить макрос vim, который будет искать, а затем двигаться вниз на 5 строк.

Макрос определяется с помощью + q +, затем выполняется с помощью + @ +. Так что для вашего примера «поиск шаблона», используя «t» как, вы бы сделали что-то вроде этого:

<esc>qt   # start macro 't' 
/pattern  # search for 'pattern'
5j        # move down 5 lines
<esc>q    # end macro

Затем вы начинаете с верхней части документа и многократно нажимаете '@ t'

...