Как переопределить подсветку синтаксиса по умолчанию в vim? - PullRequest
12 голосов
/ 31 июля 2009

В VIM мне нужно выполнить простую задачу - выделить «(» и «)». Я могу сделать это легко, введя две команды:

:syn match really_unique_name display "[()]"
:hi really_unique_name guifg=#FF0000

Но если я добавлю те же команды (конечно, без ':') в пустой .vimrc и перезапущу VIM - "(" и ")" больше не будут выделены в файлах .cpp. Кажется, что если я создаю / загружаю файл .cpp, VIM загружает для него файл синтаксиса, который переопределяет мои пользовательские выделения. Как настроить основные моменты в моем файле .vimrc, чтобы они выполнялись после стандартных определений синтаксиса или не были затронуты стандартным определением синтаксиса?

Ответы [ 4 ]

24 голосов
/ 31 июля 2009

Существует четыре варианта (два из которых были предложены другими):

  1. Использовать структуру after в vimfiles (~ / .vim / after / syntax / cpp.vim):

    :help after-directory
    
  2. Использовать совпадение для текущего окна:

    :match really_unique_name "[()]"
    
  3. Используйте matchadd (), снова для текущего окна, но это позволяет вам удалять отдельные совпадения, если вам позже потребуется:

    :call matchadd('really_unique_name', "[()]")
    " Or
    :let MyMatchID = matchadd('really_unique_name', "[()]")
    " and then if you want to switch it off
    :call matchdelete(MyMatchID)
    
  4. Установите плагин Dr Chip rainbow.vim для подсветки фигурных скобок различными цветами в зависимости от уровня отступа.

В этой ситуации я бы порекомендовал вариант 1, так как похоже, что вы хотите включить его в общий синтаксис. Если вы хотите использовать совпадения и хотите, чтобы они были привязаны к буферу (а не к окну), вам понадобится что-то вроде:

function! CreateBracketMatcher()
    call clearmatches()
    call matchadd('really_unique_name', "[()]")
endfunc
au BufEnter <buffer> call CreateBracketMatcher()

Для получения дополнительной информации см .:

:help after-directory
:help :match
:help matchadd()
:help matchdelete()
:help clearmatches()
:help function!
:help autocmd
:help autocmd-buffer-local
:help BufEnter

Вас также может заинтересовать мой ответ на на этот вопрос , который охватывает более общую подсветку операторов.

9 голосов
/ 31 июля 2009

Поместите настройки в ~ / .vim / after / syntax / cpp.vim

4 голосов
/ 31 июля 2009

Вместо использования syn match, просто используйте match. например:

hi really_unique_name guifg=#FF0000
match really_unique_name "[()]"

match имеет более высокий приоритет, чем syn-match (то есть: его подсветка переопределит подсветку, генерируемую syn-match), и синтаксические файлы (с хорошим поведением) не должны связываться с ним.

Единственное предостережение с соответствием - это то, что это для каждого окна, а не для буфера.

Если вам нужны дополнительные совпадения, вы можете использовать 2match и 3match.

См. :help :match в Vim для получения дополнительной информации.

2 голосов
/ 10 декабря 2012

Я обычно делаю это так:

:hi really_unique_name guifg=#FF0000
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]"

au означает autocmd. Помощь подскажет больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...