Vim выделяет весь текст после нескольких "#"

491
haz

Я пытаюсь сделать текст жирным, если он появляется после серии #хэшей. Это строка в моем .vimrc:

au BufRead,BufNewFile *.txt hi header cterm=cyan ctermbg=red 

и мои попытки регулярных выражений:

au BufRead,BufNewFile *.txt syn match header /\n#+\zs.*\ze/ au BufRead,BufNewFile *.txt syn match header /^#+\zs.*\ze/ "Why doesn't ^ work? 

Этот вид работает, но он также соответствует #s и некоторому некорректному тексту. Это также очень медленно и занимает около 10 секунд, чтобы соответствовать на моем MacBook:

au BufRead,BufNewFile *.txt syn match header /\zs\n#*\w*\ze/ 

Я не уверен, что я делаю неправильно - они работают над онлайн-тестерами регулярных выражений.

В этом тестере регулярное выражение ^#*(.*)работает отлично, где я сопоставляюсь с первой группой захвата. Как мне перевести это для vim?

Приветствия.

1

1 ответ на вопрос

2
Ingo Karkat

Множитель для 1 или более совпадений равен \+; Вы забыли обратную косую черту (или \vмодификатор «очень волшебный»). Использование \zeв конце излишне. ^совпадения в каждом начале строки, \nначиная только со второй строки. Имейте в виду, что Vim использует специальный диалект регулярного выражения, поэтому, как говорят различные веб-сайты, вам может понадобиться адаптация. Эти :help patternстраницы являются лучшими и авторитетным справочным.

syn match header /^#\+\zs.*/ 

Кроме того, добавление вашего синтаксиса может быть скрыто существующими правилами синтаксиса. Вы можете попробовать добавить containedin=ALL, но это не общее решение. Возможно, вам придется проанализировать существующий синтаксис и разработать специальное решение для каждого синтаксиса. В качестве альтернативы вы можете использовать :matchкоманду. Это работает поверх (и независимо) подсветки синтаксиса. Недостатком является то, что это локальное окно, поэтому вам нужна :autocmdмагия, если вы хотите применить это только к определенным буферам или также к разделению окон.

match header /^#\+\zs.*/ 

критика стиля

С вашим au BufRead,BufNewFile *.txt syn match, вашим смешением нескольких аспектов: обнаружение типов файлов (сопоставление *.txt(здесь: неявный) тип файлов), настройка типов файлов, подсветка синтаксиса). Было бы чище (и более расширяемо) отделить вещи:

  1. Определение textтипов файлов: au BufRead,BufNewFile *.txt setf text. Это обнаружение может уже существовать в вашей версии Vim.
  2. Определите подсветку синтаксиса (или расширение) в ~/.vim/syntax/text.vim(или ~/.vim/after/syntax/text.vimдля расширения существующего синтаксиса).
Это прекрасно работает - спасибо за вашу помощь! Особенно критика стиля - может быть трудно найти правильные соглашения. haz 6 лет назад 0