Как переопределить подсветку синтаксиса по умолчанию в vim?

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

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

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

Ответ 1

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

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

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

    :match really_unique_name "[()]"
    
  • Используйте 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)
    
  • Установите плагин 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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

au означает autocmd. Справка расскажет больше.