Frage

Ich habe eine Datei namens WrongFileTypeDetection.R, den folgenden Text enthalten:

# This file is sometimes wrongly detected as a conf file

Ich habe auch zwei Versionen von _vimrc, dass ich absolut identisch sein gedacht hätte. Allerdings, wenn ich die erste Version verwendet, wird die obige Datei fälschlicherweise als „conf“ Datei erkannt, obwohl ich speziell für alle Dateien gefragt habe mit .R Endung gesetzt werden = r zu filetype. Als ich in der zweiten Version (moving „Syntax“ hinter der augroup Definition) zu ändern, arbeitet Erkennung korrekt wieder. Beachten Sie, dass dies die nur Konfiguration Ich habe (ich zog meinen Standard vimrc weg beim Debuggen dieser).

Erste Version:

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

Zweite Version:

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

Es scheint, dass vimrc auf die besondere Anordnung der beiden Dateien sehr empfindlich ist. Warum sollte dies sein, wenn man bedenkt, dass eine der Leitungen eine automatische Befehl ist, die viel später sowieso laufen wird? Ist das ein Fehler in Vim oder ist dies eine Funktion, die ich einfach nicht verstehen?

War es hilfreich?

Lösung

Die einfache Antwort auf Ihr Problem ist, dass diese Zeilen nicht in Ihrer vimrc sein sollten. Der offiziell unterstützte Weg zu handhaben ist, eine filetype.vim Datei in Ihrem .vim Verzeichnis erstellen mit folgendem Inhalt:

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

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

Was, warum Ihr Code verhält, wie es der Fall ist, ist es eigentlich ziemlich viel komplizierter als @ zu viel php Antwort impliziert.

In der ersten Version Ihrer vimrc, Dateityp Erkennung wird von Ihrer syntax on Linie initialisiert. Dies funktioniert, indem ein autocmd Einrichtung zu feuern, wenn eine Datei mit einer .r Erweiterung geöffnet wird, und diese autocmd ruft die Funktion s:FTr() in filetype.vim.

Allerdings Ihre autocmd! Zeile überschreibt diese bestehende autocmd 1 , so dass die s:FTr() Funktion läuft nie 2 . Ihre autocmd dann feuert, aber es nicht setzen Sie den Dateityp, weil der setfiletype Befehl meint, dass die Datei des Typs bereits festgelegt wurde 3 .

Dann, weil die Datei des Typs noch nicht wirklich gesetzt ist, versucht Vim eine Basis zuweisen auf den Inhalt der Datei, und endet an die conf Typ zuweisen 4 .

Die beste Referenz für all dies ist :help filetype. Und speziell in Ihrem Fall :help new-filetype und :help remove-filetype. Der :verbose Befehl ist auch sehr praktisch, um herauszufinden, welche Einstellungen sind durch das, was Skript festgelegt wurde.

1: Wegen der !. Wenn Sie diese ! entfernen waren, dann würden Sie finden die Datei des Typs richtig eingestellt werden. Dies ist nicht die richtige Lösung, aber, weil dann Sie die Datei auf einen Typ festgelegt werden werden, so dass (und für diesen Dateityp alle Einstellungen der Anwendung) und dann zu einem anderen wechseln. Wenn die zweite Datei des Typs diese Einstellungen alle nicht überschrieben werden, bleiben einige können, was vielleicht nicht, was Sie wollen.

2: Laufen :set autocmd BufRead *.r Versuchen Sie, wenn Sie die zwei verschiedenen vimrc Dateien verwenden. Beachten Sie den Unterschied in der Ausgabe gegeben.

3: Siehe :help setfiletype. Beachten Sie, wenn Sie die Zeile setfiletype r in set ft=r in der ersten Version Ihrer vimrc ändern, wird die Datei des Typs wird auf r eingestellt werden. Doch siehe Fußnote 1 dafür, warum dies nicht die beste Lösung.

4: ... in einer Codezeile, die kommentiert wird: "überprüft diese letzte, es ist nur zu raten"

Andere Tipps

In Ihrer ersten Version, Syntax auf: ist die Auslösung der Datei des Typs Erkennung vor Ihr automatischen Befehl hinzugefügt wird.

Nach dieser Seite

  

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

Sie müssen nur zwei Zeilen Code in Ihrer .vimrc Datei hinzuzufügen.

au BufRead,BufNewFile *.R set filetype=r
au BufRead,BufNewFile *.r set filetype=r
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top