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

StackOverflow https://stackoverflow.com/questions/1211588

  •  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 . Помощь расскажет больше.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top