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=foo
e 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 vimrc
arquivos uma vez (na inicialização), mas carrega os arquivos de tipo de arquivo e sintaxe toda vez que as opções filetype
ou syntax
sã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 Syntax
autocmd:
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 :syn
comando, e é por isso que repeti autocmd Syntax c
vá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>.vim
has, 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.vim
invés.