Как переопределить подсветку синтаксиса по умолчанию в vim?
-
06-07-2019 - |
Вопрос
В VIM мне нужно выполнить простую задачу - выделить "(" и ")". Я могу легко это сделать, введя две команды:
:syn match really_unique_name display "[()]"
:hi really_unique_name guifg=#FF0000
Но если я добавлю те же команды (конечно, без ':') для очистки .vimrc и перезапущу VIM - " (") " больше не выделяются в файлах .cpp. Кажется, что если я создаю / загружаю файл .cpp, VIM загружает для него файл синтаксиса, который переопределяет мои пользовательские выделения. Как настроить основные моменты в моем файле .vimrc, чтобы они выполнялись после стандартных определений синтаксиса или не были затронуты стандартным определением синтаксиса?
Решение
Существует четыре варианта (два из которых были предложены другими):
<Ол> Используйте структуру 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)
Установите плагин 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
Вас также может заинтересовать мой ответ на этот вопрос , который охватывает более общую подсветку операторов.
Другие советы
Поместите настройки в ~ / .vim / after / syntax / cpp.vim
Вместо использования syn match просто используйте match. например:
hi really_unique_name guifg=#FF0000
match really_unique_name "[()]"
match
имеет более высокий приоритет, чем syn-match (то есть: его подсветка будет переопределять подсветку, генерируемую syn-match), и (с хорошим поведением) файлы синтаксиса не должны связываться с ним. р>
Единственное предостережение с соответствием - это то, что это для каждого окна, а не для каждого буфера.
Если вам нужны дополнительные совпадения, вы можете использовать 2match и 3match.
Для получения дополнительной информации см. : help: match
в Vim.
Обычно я делаю это так:
:hi really_unique_name guifg=#FF0000
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]"
au
означает autocmd
. Помощь расскажет больше.