Como posso corrigir o destaque de sintaxe "ausente" para palavras-chave do Python como "self"?

12

Estou tentando corrigir o destaque de sintaxe para python; minhas cores são diferentes daquelas nas capturas de tela do que "deveria" parecer em diferentes esquemas de cores do vim. E você pode ver a diferença na comparação de .rb (que é exibida corretamente) com .py, que parece estar desativada:

insira a descrição da imagem aqui

Por exemplo, observe como selfnão está destacado. (Isso está na base16, mas a comparação seria semelhante em outros esquemas de cores). Geralmente, parece que o realce da sintaxe do objeto está errado.

Algumas coisas que eu tentei:

  1. Observando os scripts de sintaxe, o vim carrega; a única diferença entre .py e .rb no exemplo abaixo é que, obviamente, o ruby ​​obtém indent / ruby.vim e sintaxe / ruby.vim enquanto python obtém indent / python.vim e sintaxe / python.vim. Estes são os arquivos que acompanham o homebrew vim.
  2. Carregando os mesmos arquivos no macvim ao invés do terminal (iterm2) vim; mesmo problema, os arquivos são exatamente iguais aos da imagem.
  3. Adicionando o novo arquivo python.vim . Não resolve o problema, mesmo se usado como um .vim/afterscript.

Todas as sugestões são bem-vindas; Eu tenho batido minha cabeça nisso por horas, e não consigo descobrir por que o destaque não está funcionando como o esperado.

sl8r000
fonte
Observe que o Python não possui símbolos, e eu recomendo fortemente que você use a sintaxe do Python 3 para novo código.
Martin Tournoij 14/07/16

Respostas:

12

Como o destaque da sintaxe funciona em breve:

  • Na syntax/<filetype>.vimsintaxe, as regras são definidas com o :syntaxcomando Este comando define, bem, sintaxe. Ele diz "se o texto corresponde a essa expressão regular, é uma string" e assim por diante. Para isso, atribui um grupo de destaque . Ele não disse nada sobre cores como tal.

  • :highlightdiz "destaque esse grupo com essas cores". Isso é feito no esquema de cores , não no arquivo de sintaxe. Há um monte de grupos Destaque padrão ( String, Function, Speciale assim por diante), que todos os esquemas de cores deve definir.

    Entretanto, você não está restrito a esses grupos padrão e pode criar quantos grupos desejar (mas os arquivos de sintaxe padrão normalmente não o fazem).

  • O indent/<filetype>.vimarquivo controla o recuo automático. Por exemplo, para Ruby, ele diz "a linha após defdeve aumentar o nível de indentação" e "a linha após enddeve diminuir a indentação em um nível". Não faz nada com cores ou realce de sintaxe.


Por que diferentes linguagens de programação são destacadas de maneira diferente? Em parte por causa da estética pessoal e das opiniões de quem a escreveu. Por exemplo, no Ruby, o Typegrupo de destaque é usado para nomes de classes. Mas também poderia ter sido Functionou algo mais. Por que é isso Type? Provavelmente porque o autor pensou que ficaria melhor em seu esquema de cores.

Mais importante, porém, as línguas têm diferentes semânticas e sensibilidades. Em Ruby, selfé uma palavra-chave especial. Você não pode fazer self = "foo"ou def self(). Estes são erros. Mas este não é o caso em Python. É apenas outra variável sem propriedades especiais. Fazendo:

x = Object()
x.foo()

é realmente "traduzido" pelo Python para:

Object.foo(x)

O nome selfé apenas convenção (quase universalmente adotado), mas você pode nomear o que quiser; def x(this):ou def x(xxx):são igualmente válidos. Você também pode usar o nome em selfqualquer lugar que desejar; self = 'foo'e def self():estão perfeitamente bem.

Eu diria que isso selfnão deve ser destacado, pois não é uma palavra-chave especial nem uma variável predefinida (como str). Não há vestígios da palavra selfno arquivo de sintaxe; portanto, parece que o autor dela raciocinou da mesma maneira :-)


Se você deseja selfdestacar, precisará criar uma regra de sintaxe para isso:

:syn keyword pythonBuiltin self

O pythonBuiltinnome do grupo já está definido no arquivo de sintaxe padrão e vinculado ao Functiongrupo de destaque. Para usar um novo grupo de destaque, use algo como:

:syn keyword pythonSelf self
:highlight def link pythonSelf Special

Para fazer essas alterações, você não pode simplesmente colocá-las no seu arquivo vimrc. O arquivo de sintaxe o substituirá. Em vez disso, você precisará executá-lo após o carregamento do arquivo de sintaxe, o que pode ser feito de duas maneiras:

  1. Use um FileTypeautocmd:

    augroup python
        autocmd!
        autocmd FileType python
                    \   syn keyword pythonSelf self
                    \ | highlight def link pythonSelf Special
    augroup end
    
  2. Use o after-directory, ~/.vim/after/syntax/python.vim:

    syn keyword pythonSelf self
    highlight def link pythonSelf Special
    

Ambos os métodos são efetivamente os mesmos. Use o que você preferir.

Martin Tournoij
fonte