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?

Foi útil?

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

http://www.build-doctor.com/2008/06/04/how-to-set-the-filetype-in-vim-when-the-extension-doesnt-match/

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top