Question

J'ai un fichier, appelé WrongFileTypeDetection.R, contenant le texte suivant:

# This file is sometimes wrongly detected as a conf file

J'ai aussi deux versions de _vimrc, que je l'aurais pensé être absolument identiques. Cependant, lorsque j'utilise la première version, le fichier ci-dessus est incorrectement détecté comme un fichier « conf », même si je l'ai spécifiquement demandé pour tous les fichiers se terminant par .R être réglé sur filetype = r. Quand je change la deuxième version (mouvement « syntaxe sur » derrière la définition augroup), la détection fonctionne à nouveau correctement. Notez que ceci est le uniquement configuration je (Je me suis éloigné de mon vimrc norme pendant le débogage cela).

Première version:

syntax on
augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END

Deuxième version:

augroup filetypedetect
    autocmd! BufRead,BufNewFile *.r,*.R     setfiletype r
augroup END
syntax on

Il semble que vimrc est très sensible à l'ordre particulier des deux fichiers. Pourquoi serait-ce, étant donné que l'une des lignes est une autocommande qui sera exécuté beaucoup plus tard de toute façon? Est-ce un bogue dans Vim ou est-ce une caractéristique que je ne suis pas comprendre?

Était-ce utile?

La solution

La réponse simple à votre problème est que ces lignes ne devraient pas être dans votre vimrc du tout. La façon officiellement pris en charge pour gérer cela est de créer un fichier filetype.vim dans votre répertoire .vim contenant les éléments suivants:

" my filetype file
if exists("did_load_filetypes")
  finish
endif

augroup filetypedetect
  au! BufRead,BufNewFile *.r setfiletype r
augroup END

Quant à savoir pourquoi votre code se comporte comment il le fait, il est en fait un peu plus compliqué que @ de réponse trop php implique.

Dans la première version de votre vimrc, la détection de filetype est initialisée par votre ligne syntax on. Cela fonctionne en mettant en place un autocmd au feu lorsqu'un fichier avec une extension .r est ouverte, et ce autocmd appelle la fonction s:FTr() dans filetype.vim.

Cependant, votre ligne autocmd! existante autocmd remplace ce 1 , de sorte que la fonction s:FTr() ne fonctionne 2 . Votre autocmd puis les feux, mais ne pas définir le type de fichier, car la commande setfiletype pense que le type de fichier a déjà été mis en 3 .

Ensuite, parce que le type de fichier est toujours pas fait défini, Vim tente d'assigner une fonction du contenu du fichier, et finit par attribuer au type de conf 4 .

La meilleure référence pour tout cela est :help filetype. Et plus précisément dans votre cas :help new-filetype et :help remove-filetype. La commande :verbose est également très pratique pour déterminer quels paramètres ont été définis par ce script.

1: En raison de la !. Si vous deviez supprimer ce !, alors vous trouverez le type de fichier étant correctement réglé. Ce n'est pas la bonne solution, cependant, parce qu'alors vous autoriserons le fichier à régler à un type (et l'application de tous les paramètres de ce type de fichier), puis changer à l'autre. Si le second type de fichier ne remplace pas tous ces paramètres, certains peuvent rester, ce qui pourrait ne pas être ce que vous voulez.

2: Essayez :set autocmd BufRead *.r en cours d'exécution lorsque vous utilisez les deux fichiers vimrc différents. Notez la différence dans la sortie donnée.

3: Voir :help setfiletype. Notez que si vous modifiez la setfiletype r ligne en set ft=r dans la première version de votre vimrc, le type de fichier être réglé sur r. Cependant, voir la note 1 pour pourquoi ce n'est pas la meilleure solution.

4: ... dans une ligne de code qui est commenté: "vérifier ce dernier, il est juste deviner"

Autres conseils

Dans votre première version, syntaxe sur est le déclenchement de la détection de filetype avant votre autocommand a été ajouté.

Selon ce site

  

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

Il vous suffit d'ajouter deux lignes de code dans votre fichier vimrc.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top