No entanto, depois de adicionar essas linhas ao .vimrc, ele não funcionou.
A razão para isso é que o Vim limpa os itens de sintaxe existentes ao definir a 'syntax'opção. Isso é feito porque manter os itens antigos da sintaxe levaria a algumas situações estranhas; se você tem um buffer que possui syntax=fooe usa set syntax=bar, você terminará com um buffer que possui destaque de sintaxe para ambos foo e bar.
Quando o Vim inicia, ele carrega seus vimrcarquivos uma vez (na inicialização), mas carrega os arquivos de tipo de arquivo e sintaxe toda vez que as opções filetypeou syntaxsão definidas, o que redefinirá os valores que você definiu no seu vimrc.
Mesmo que não o redefina, não seria uma boa ideia adicioná-lo ao seu vimrc, pois ele se aplicaria a todos os buffers, e não apenas aos buffers syntax=c.
O texto abaixo assume o Vim em um sistema Unix-y, mas também funciona para usuários do Neovim e Windows:
- Os usuários do Neovim devem substituir
~/.vim/por ~/.config/nvim/.
- Usuários do Windows devem substituir
~/.vim/por %USERPROFILE%\vimfiles\.
Substituindo um arquivo inteiro
A maneira mais fácil de mudar algo é simplesmente substituí-lo . Para fazer isso, crie um arquivo no ~/.vim/<file>.vim.
<file.vim>é o caminho relativo a $VIMRUNTIME(incluindo subdiretórios). No seu exemplo, deveria ser syntax/c.vim. Será carregado em vez do arquivo $VIMRUNTIME.
O resultado disso é que é mais fácil fazer alterações - alterar os arquivos de sintaxe existentes às vezes pode ser um pouco complicado. A desvantagem é que você não receberá nenhuma atualização futura no arquivo do sistema.
Costumo usar isso como ponto de partida para experimentar arquivos de sintaxe e depois extrair minhas alterações locais para uma adição local usando um dos métodos descritos abaixo.
Adições locais
Existem duas maneiras de adicionar adições locais aos arquivos de sintaxe: elas são funcionalmente idênticas e você pode usar o método que preferir.
Syntax autocmd
Use o Syntaxautocmd:
augroup ft_c
autocmd!
autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end
Observe que encadear vários comandos com |é problemático aqui, pois eles tendem a ser interpretados como parte do :syncomando, e é por isso que repeti autocmd Syntax cvárias vezes. Uma alternativa seria usar uma função:
fun s:c()
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunction gui=NONE guifg=#B5A1FF
endfun
augroup ft_c
autocmd!
autocmd Syntax c call s:c()
augroup end
A vantagem é que todas as alterações podem estar contidas em um único arquivo. A desvantagem é que é um pouco feio, especialmente se você tiver muitas alterações.
depois do diretório
Use o diretório pós-: ~/.vim/after/<file>.vim.
Isso será carregado depois de <file>.vimhas, onde <file.vim>está o caminho relativo a $VIMRUNTIME(incluindo subdiretórios). No seu exemplo, deveria ser syntax/c.vim.
Veja também :help after-directory.
A vantagem é que é um pouco mais legível que o autocmd, especialmente se você tiver muitas alterações. A desvantagem é que você precisará copiar um arquivo adicional se quiser espelhar sua configuração do Vim para máquinas diferentes (esse é um motivo importante para muitas pessoas manterem os arquivos do Vim em um repositório do GitHub, para que possam ser espelhados facilmente entre as máquinas. )
~/.vim/after/syntax/c.viminvés.