9
votes

Comportement très étrange avec la syntaxe VIM et la détection de filetype

J'ai un fichier, appelé malfiletypedetection.r, contenant le texte suivant:

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


0 commentaires

3 Réponses :


7
votes

Dans votre première version, Syntaxe sur déclenche la détection de type type avant votre autocommand a été ajouté.


0 commentaires

11
votes

La réponse simple à votre problème est que ces lignes ne devraient pas être dans votre VIMRC du tout. La voie officiellement prise en charge de gérer cela est de créer un fichier filetype.vim dans votre répertoire .vim contenant: xxx

comme pour pourquoi votre code se comporte comment il fait, c'est en fait un peu plus compliqué que @ Trop de réponses de PHP implique.

dans la première version de votre VIMRC , la détection de type type est initialisée par votre Syntaxe sur ligne. Cela fonctionne en configurant un autocmd pour tirer lorsqu'un fichier avec un extension d'un .r est ouvert, et cette autocmd appelle la fonction S: FTR () dans FileType.vim.

Cependant, votre autocmd! La ligne écrase cette autocmd existant 1 , donc le S: FTR () fonction ne fonctionne jamais 2 . Votre autocmd déclenche ensuite, mais il ne doit pas définit le fichierype, car la commande SetFileType pense que le type de fichier a déjà été défini 3 . < / p>

Ensuite, car le type de filetype n'est toujours pas défini, VIM tente d'attribuer une base sur le contenu du fichier et finit par l'attribuer à la conf type 4 .

La meilleure référence pour tout cela est : Aide FileType . Et spécifiquement dans votre cas : Aide New-FileType et : Aide Supprimer-FileType . La commande : verbose est également très pratique pour comprendre quels paramètres ont été définis par quel script.

1: en raison du ! . Si vous deviez supprimer ce ! , vous trouverez le type de fichier défini correctement. Ce n'est pas la solution correcte, cependant, car vous permettrez de définir le fichier sur un type (et d'appliquer tous les paramètres de ce type de type), puis de la modifier à un autre. Si le second filetype n'écrit pas tous ces paramètres, certains peuvent rester, ce qui pourrait ne pas être ce que vous voulez.

2: Essayez d'exécuter : SET Autocmd bubead * .r lorsque vous utilisez les deux fichiers VIMRC différents. Notez la différence de sortie donnée.

3: voir : Aide SetFileType . Notez que si vous modifiez la ligne setfileType R dans définir ft = r dans la première version de votre VIMRC, le fichier type sera être défini sur r . Cependant, voir la note de bas de page 1 pour la raison pour laquelle ce n'est pas la meilleure solution.

4: ... dans une ligne de code qui est commenté: "Vérifiez ce dernier, c'est juste deviner "


5 commentaires

Merci, riche, c'est une réponse très détaillée et réfléchie. Je vais garder cela à l'esprit et y réfléchir chaque fois que je dois jouer avec la détection de filetype dans Vim.


@Magnus vous êtes la bienvenu. Je n'ai pas ajouté à la réponse, car je pensais qu'il y avait déjà beaucoup d'informations là-bas, mais j'ai aussi fait des débogage avec vim -d pour vous aider à comprendre exactement ce qui a été défini à quelle heure .


Malheureusement, ce problème semble avoir recadré au moins au moins dans Centos 7.6.1810 avec Vim version 7.4.160-5 au moins et j'utilise réellement ~ / .vim / filetype.vim et seulement des options pour les types par exemple. Options de formatage dans .VIMRC. C'est comme ça que je suis tombé sur cette question. C'est assez énervant car toute directive de pré-processeur C dans les fichiers source / en-tête rend VIM le détecte comme un fichier Conf la prochaine fois qu'il est ouvert. Modifiant ainsi complètement les options de coloration, etc.


@PRYFTAN Bien que ce soit le même symptôme, cela ressemble à la cause de la racine est subtilement différent pour vous. Pour déboguer, vous pouvez essayer d'abord la double vérification que votre autocommand est tiré, puis vérifiez ce qui remplace le type de fichiers en exécutant la commande : verbeze Filetype? dans un tampon où le type de fichier est faux.


@Rich ta. En fait, il semblait se résoudre. Honnêtement, je ne sais pas ce que c'était. J'ai été tellement épuisé aussi que je ne sais pas quoi faire confiance. De toute façon, il semble bien maintenant. Je l'avais pensé étrange et donc c'était. Plus étrange, c'est que je n'ai rien changé de tout pas plus ni des mises à jour. Quoi qu'il en soit, merci pour la suggestion. En fait, bien que je vérifiais : définissez le fichier de type mais pas : Verbose ... Tout ce que j'ai remarqué, c'est que cela s'est passé si le fichier avait des lignes (sans pareillement qu'à partir de mais aucune idée de WhitSpace) '#'. Et seulement après l'avoir ouvert: si je l'avais ajouté dans un nouveau fichier, ce n'était pas un problème.