Как переопределить подсветку синтаксиса по умолчанию в 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
. Справка расскажет больше.