Como posso adicionar regras de destaque de sintaxe adicionais no meu vimrc local?

10

Eu instalei o gvim no Fedora e no Win7. Eu descobri que o vim e o gvim no Fedora não destacavam o nome da função no código c, enquanto o gvim no win7 o destacava.

Eu descobri que no win7, vim73/syntax/c.vimtem as linhas adicionais no final:

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

Se eu adicionar essas linhas c.vimno Fedora, o gvim também poderá destacar o nome da função.

Para manter a portabilidade, quero apenas modificar o .vimrcpara destacar o nome da função. No entanto, depois de adicionar essas linhas ao .vimrc, ele não funcionou.

Então, alguém pode me ajudar? Eu fiz uma pesquisa e existem muitas soluções para destacar os nomes das funções no vim. Mas estou curioso para saber como fazer essas linhas funcionarem .vimrc. Muito obrigado!

tamlok
fonte
5
Tente adicioná-lo ao ~/.vim/after/syntax/c.viminvés.
Muru
@ muru Sim, funciona. Mas e quanto a adicioná-lo .vimrc?
tamlok
Você provavelmente teria que usar algo como autocmd BufEnter *.c hl ..., mas deve mantê-lo after/syntax/c.vim. Qualquer versão moderna do Vim entenderá o .vim/after/diretório. No Windows, o caminho seria vimfiles/after/..., portanto, a portabilidade não deve ser um grande problema (especialmente se você usar algum plug-in).
Muru

Respostas:

13

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. )

Martin Tournoij
fonte