Adicionando realce de sintaxe adicional ao nvim; não pode obter .config / nvim / after / syntax para carregar o arquivo .vim

Jan 12 2021

Estou tentando adicionar realce de sintaxe adicional a um plugin que estou usando para realce de sintaxe. Eu tentei adicionar o arquivo de sintaxe adicional fstrings.vimà ~/.config/nvim/after/syntaxpasta, mas meu nvim não está pegando.

Coisas que eu tentei:

  1. Verifique se ~/.config/nvim/aftere / ou ~/.config/nvim/after/syntaxé adicionado ao meu caminho de tempo de execução.
  • ~/.config/nvim/afteré adicionado ao meu caminho - verificado com :set rtp>> runtimepath=~...,...,~/.config/nvim/after- no entanto, não vejo o arquivo carregado :scriptnames. Como faço para carregar o arquivo?
  1. Altere a localização do arquivo para em ~/.config/nvim/aftervez de~/.config/nvim/after/syntax
  • Isso também não funciona.
  1. Carregue o arquivo manualmente.
  • Isso realmente faz o trabalho surpreendentemente. Posso alterar manualmente a sintaxe do arquivo usando :set syntax=fstrings, no entanto, todo o realce de sintaxe original fornecido pelo plugin desaparece, e apenas o realce fornecido (veja a instrução de impressão na imagem abaixo) pelo fstrings.vimé usado. Isso me leva a acreditar que o caminho está configurado corretamente, porém o nvim não deseja carregá-lo durante a inicialização e / ou ignora por causa do plugin que está sendo usado.

Eu sei que a /after/pasta é usada para aplicar configurações após as configurações anteriores, em vez de substituir. Já tentei a solução aqui e aqui, mas não consegui fazer funcionar. Qualquer ajuda sobre como depurar isso seria apreciada.

" ~/.config/nvim/after/syntax/fstrings.vim

syn match pythonEscape +{{+ contained containedin=pythonfString,pythonfDocstring
syn match pythonEscape +}}+ contained containedin=pythonfString,pythonfDocstring

syn region pythonfString matchgroup=pythonQuotes
      \ start=+[fF]\@1<=\z(['"]\)+ end="\z1"
      \ contains=@Spell,pythonEscape,pythonInterpolation
syn region pythonfDocstring matchgroup=pythonQuotes
      \ start=+[fF]\@1<=\z('''\|"""\)+ end="\z1" keepend
      \ contains=@Spell,pythonEscape,pythonSpaceError,pythonInterpolation,pythonDoctest

syn region pythonInterpolation contained
      \ matchgroup=SpecialChar
      \ start=+{{\@!+ end=+}}\@!+ skip=+{{+ keepend
      \ contains=ALLBUT,pythonDecoratorName,pythonDecorator,pythonFunction,pythonDoctestValue,pythonDoctest

syn match pythonStringModifier /:\(.[<^=>]\)\?[-+ ]\?#\?0\?[0-9]*[_,]\?\(\.[0-9]*\)\?[bcdeEfFgGnosxX%]\?/ contained containedin=pythonInterpolation
syn match pythonStringModifier /![sra]/ contained containedin=pythonInterpolation

hi link pythonfString String
hi link pythonfDocstring String
hi link pythonStringModifier PreProc

Respostas

1 filbranden Jan 13 2021 at 07:17

As regras de sintaxe são geralmente nomeadas após o 'filetype'conjunto para o buffer, que por sua vez é normalmente detectado (com base na extensão do arquivo, nome do arquivo ou conteúdo do arquivo) e geralmente definido automaticamente.

Se você deseja estender o realce de sintaxe para Python, normalmente deve nomear seu script após o "python"tipo de arquivo.

Quando o Vim carrega regras de sintaxe para Python, ele carrega para arquivos nomeados syntax/python.vimou syntax/python/*.vim(as regras ftplugin também permitem python_*.vim, mas acontece que não é o caso da sintaxe).

Portanto, você deve nomear seu arquivo ~/.config/nvim/after/syntax/python.vim(ou ~/.config/nvim/after/syntax/python/fstrings.vim) para que ele seja carregado para arquivos Python e depois que as regras de tempo de execução agrupadas para Python forem carregadas.


Outra opção é definir a 'syntax'opção de incluir vários tipos, separados por um ponto. Por exemplo, :setlocal syntax=python.fstringscarregará primeiro syntax/python.vime depois syntax/fstrings.vim. Isso seria mais útil se você tivesse uma sintaxe um tanto genérica e pode fazer sentido para várias linguagens separadas (por exemplo, algum destaque de sintaxe para um formato de documentação dentro de comentários?) Não parece ser muito aplicável neste caso , onde f-strings são essencialmente uma sintaxe Python. Manter uma 'syntax'configuração separada da 'filetype'outra também pode ser complicado, ela precisa ser definida no local certo (nem muito cedo nem muito tarde) para evitar que a configuração padrão seja prejudicada.


Ao solucionar o problema de um script seu não ser carregado, você pode usar o :scriptnamescomando para verificar se o seu *.vimscript foi realmente carregado pelo Vim em algum ponto. Repita isso antes e depois de abrir um arquivo do tipo de arquivo específico que você está procurando para confirmar se ele foi acionado pela detecção desse tipo de arquivo.