1

Я пытаюсь сделать текст жирным, если он появляется после серии # хешей. Это строка в моем .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

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

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

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

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 для расширения существующего синтаксиса).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .