comportamento muito estranho com a sintaxe Vim e detecção filetype
-
18-09-2019 - |
Pergunta
Eu tenho um arquivo, chamado WrongFileTypeDetection.R, contendo o seguinte texto:
# This file is sometimes wrongly detected as a conf file
Eu também tenho duas versões do _vimrc, que eu teria pensado para ser absolutamente idênticos. No entanto, quando eu uso a primeira versão, o arquivo acima é detectado incorretamente como um arquivo "conf", embora eu tenha pedido especificamente para todos os arquivos que terminam com .R para ser definido como filetype = r. Quando eu mudar para a segunda versão (movendo "sintaxe" por trás da definição augroup), detecção funciona corretamente novamente. Note-se que esta é a única Configuração eu (eu me afastei meu vimrc padrão durante a depuração isso).
Primeira versão:
syntax on
augroup filetypedetect
autocmd! BufRead,BufNewFile *.r,*.R setfiletype r
augroup END
A segunda versão:
augroup filetypedetect
autocmd! BufRead,BufNewFile *.r,*.R setfiletype r
augroup END
syntax on
Parece que vimrc é muito sensível à ordenação particular dos dois arquivos. Por que isso seria, considerando que uma das linhas é um autocommand que será executado muito mais tarde, afinal? É este um bug no Vim ou isso é uma característica que eu não estou entendendo?
Solução
A resposta simples para o problema é que essas linhas não deve estar no seu vimrc em tudo. A maneira oficialmente apoiados para lidar com isso é criar um arquivo filetype.vim
em seu diretório .vim
contendo o seguinte:
" my filetype file
if exists("did_load_filetypes")
finish
endif
augroup filetypedetect
au! BufRead,BufNewFile *.r setfiletype r
augroup END
Quanto ao porquê de seu código está se comportando como ele faz, é realmente um pouco mais complicado do que @ muito do php implica.
Na primeira versão do seu vimrc
, detecção filetype é inicializado por sua linha syntax on
. Isso funciona através da criação de um autocmd ao fogo quando um arquivo com uma extensão .r
é aberto, e este autocmd chama a função s:FTr()
em filetype.vim.
No entanto, a sua linha autocmd!
substitui esse existente autocmd 1 , então a função s:FTr()
nunca fica 2 . Seu autocmd seguida, incêndios, mas não definir o tipo de ficheiro, porque o comando setfiletype
pensa que o filetype já foi definido 3 .
Em seguida, porque o tipo de arquivo ainda não é realmente definidos, tentativas Vim para um atribuir com base no conteúdo do arquivo, e acaba atribuindo-lhe com o tipo conf
4 .
A melhor referência para tudo isso é :help filetype
. E, especificamente, no seu caso :help new-filetype
e :help remove-filetype
. O comando :verbose
também é muito útil para descobrir quais configurações foram definidas por aquilo script.
1: Por causa da !
. Se você fosse para remover esta !
, então você teria que encontrar o tipo de arquivo que está sendo definido corretamente. Esta não é a solução correta, porém, porque então você estará permitindo que o arquivo a ser definido para um tipo (e aplicar todas as configurações para esse tipo de arquivo) e, em seguida, alterá-lo para outro. Se o segundo filetype não substituir todas essas configurações, alguns podem permanecer, o que pode não ser o que quiser.
2: Tente executar :set autocmd BufRead *.r
quando você estiver usando os dois arquivos vimrc diferentes. Observe a diferença na saída dada.
3: Veja :help setfiletype
. Note que se você alterar o setfiletype r
linha em set ft=r
na primeira versão do seu vimrc, o filetype irá ser definido para r. No entanto, ver nota de rodapé 1 os motivos porque esta não é a melhor solução.
4: ... em uma linha de código que é comentou: "verificar esta última, é apenas adivinhando"
Outras dicas
Na sua primeira versão, sintaxe on está provocando a detecção filetype antes seu autocommand foi adicionado.
De acordo com este site
Você só precisa adicionar duas linhas de código em seu arquivo .vimrc.
au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r