выделить суб-матч в Vim - PullRequest
3 голосов
/ 20 декабря 2011

Я пытаюсь выяснить, как выделить определенную часть совпадения в vim.

С учетом следующего примера правила (взято из файла синтаксиса coffeescript source ):

syn match coffeeExtendedOp /\%(\S\s*\)\@<=[+\-*/%&|\^=!<>?.]\+\|[-=]>\|--\|++\|:/ display

Это регулярное выражение соответствует различным операторам coffeescript.Операторы подсвечиваются (в моем vimrc) следующим образом:

hi Operator guifg=#ff0000

Например, поскольку coffeeExtendedOp связан с coffeeOperator, который связан с Operator, в приведенном выше исходном файле.Это все работает, но мне интересно, как конкретно выделить оператор ++, соответствующий приведенному выше syn match, другим цветом, скажем синим, внутри моего vimrc (то есть без изменения исходного исходного файла выше),Мне просто интересно, возможно ли это.

РЕДАКТИРОВАТЬ : я думаю, что правила помещены под кластером , поэтому, возможно, именно поэтому это ни на что не влияет.Есть ли способ получить доступ к правилу внутри кластера?

РЕДАКТИРОВАТЬ : Вопрос был уточнен.

Решение:

syn match plusplus /++/ contained containedin=coffeeExtendedOp display
hi plusplus guifg=#0000ff

Проблема сейчасв том, что это работает только когда я запускаю их как команды в vim, но не когда я помещаю это в мой файл vimrc.Есть идеи?Может быть, материал спрятан за кластером?Но тогда почему это видно в vim через команду?Я пробовал , включая файл синтаксиса , но, похоже, он не дал никакого эффекта.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

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

Прозрачные элементы синтаксиса

Вы могли бы взглянуть на прозрачный правила синтаксиса: (http://vimdoc.sourceforge.net/htmldoc/usr_44.html)

In a C language file you would like to highlight the () text after a "while"
differently from the () text after a "for".  In both of these there can be
nested () items, which should be highlighted in the same way.  You must make
sure the () highlighting stops at the matching ).  This is one way to do this:

    :syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
        \ contains=cCondNest
    :syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
        \ contains=cCondNest
    :syntax region cCondNest start=/(/ end=/)/ contained transparent

Частичные совпадения в регулярном выражении

Если вы действительно просто означали подсвечивание подсовпадений, взгляните на

\zs      start match
\ze      end match

Короче говоря,

: при совпадении Error / foo \ zsbar \ zered /

выделит только 'bar' в 'foobarred'

2 голосов
/ 20 декабря 2011

Если посмотреть на связанный с ним coffee.vim, кажется, что точка принадлежит элементу синтаксиса coffeeDotAccess.Таким образом, вы можете выделить это, выполнив следующее:

:hi coffeeDotAccess ctermfg=blue
...