Можно ли включить искомый шаблон в регулярное выражение (Vim)? - PullRequest
4 голосов
/ 23 февраля 2012

Я очень плохо знаком с регулярными выражениями, и мне нужна помощь.Сначала я объясню свою мотивацию и некоторые диаграммы, так как это очень трудно объяснить иначе.

Я недавно установил Направляющие Vim Indent , которые отображают эти вертикальные полосы / линейки, как показано ниже (картинка из githubaccount):

Vertical Bars

Это достигается путем сопоставления пробелов в начале строки и добавления их либо к IndentGuidesEven, либо к IndentGuidesOdd.Проблема в том, что он не может сопоставить шаблон с пустыми строками, и вы получаете меньше, чем идеальное подсвечивание, например: Poor highlighting

Самое простое решение - удалить all empty / blankстроки, но код без пробелов может быть трудно читать.Я имел в виду преобразование кода в несколько этапов и, в конечном итоге, добавление пробелов, как показано ниже.

Animation

То, что я делаю, это:

  • удаление пробелов из всех строк только с пробелами %s/\s\+$//e
  • усечение всех нескольких пустых строк %s/\n\{3,}/\r\r/e
  • добавление пробелов в пустые строки %s/^\ \(\ *\)\([^\ ]\)\(.*\)\n^\ *$\n^\ /\ \1\2\3\r\ \1\r\ /gc

что делает последнее утверждение, так это смотрит на три строки, где первая и третья не пустые, а вторая пустая.Но это приводит к проблемам, если первая строка, например, имеет отступ в 8 раз, а третья - только в 3 раза.В любом случае, найдя первый шаблон (в данном случае 8 отступов), использовать его в одном шаблоне поиска, чтобы строки 1 и 3 начинались с одинакового количества пробелов?Я уверен, что мог бы сделать это с помощью итеративной функции и начать, например, с 30 отступов, и вернуться назад, но это может быть немного неэффективно.

Я знаю, что строки только с пробелами плохие.Тем не менее, удаление пробелов является тривиальным, и я назначил ключ, чтобы сделать это автоматически.При необходимости я могу быстро удалить их.Кроме того, я знаю, что проблема более сложная, чем эта, и есть еще несколько случаев, которые нужно рассмотреть, однако я буду разбираться с этими случаями по мере их появления.

Любой совет относительно того, как я мог бы поступить в этом направлении

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Чтобы выполнить третий шаг в соответствии с вашим последним комментарием, можно использовать следующую команду:

:%s/^$/\=repeat(' ',min([indent(line('.')-1),indent(line('.')+1)]))

Эта глобальная замена опирается на замену с помощью функции выражения (см. :help sub-replace-\=) длязамените пустые строки строкой, содержащей пробел, повторенный min([indent(line('.')-1),indent(line('.')+1)]) раз.Количество пробелов рассчитывается как минимум из двух значений, объединенных во временный список.Эти значения являются уровнями отступа строк, непосредственно предшествующих и следующих за текущей (line('.') оценивает его номер);уровни отступа определяются с помощью функции indent().

2 голосов
/ 23 февраля 2012

используйте vim для заполнения пробелов:

:g/^$/s//\=printf('%*s', strlen(matchstr(getline(line('.')-1), '^\s*')),'')

Или

:g/^$/s//\=matchstr(getline(line('.')-1), '^\s*')
...