Sehr seltsames Verhalten bei Vim-Syntax und Dateityp-Erkennung

8

Ich habe eine Datei namens WrongFileTypeDetection.R, die den folgenden Text enthält:

%Vor%

Ich habe auch zwei Versionen von _vimrc, die ich für absolut identisch gehalten hätte. Wenn ich jedoch die erste Version verwende, wird die obige Datei fälschlicherweise als "conf" -Datei erkannt, obwohl ich ausdrücklich verlangt habe, dass alle Dateien mit der Endung .R auf filetype = r gesetzt werden. Wenn ich auf die zweite Version umschalte (die "Syntax ein" hinter der augroup-Definition), funktioniert die Erkennung wieder korrekt. Beachten Sie, dass dies die einzige Konfiguration ist, die ich habe (ich habe meinen Standard-vimrc beim Debuggen weggeschoben).

Erste Version:

%Vor%

Zweite Version:

%Vor%

Es scheint, dass vimrc sehr empfindlich auf die bestimmte Reihenfolge der zwei Dateien reagiert. Warum sollte das so sein, wenn man bedenkt, dass eine der Linien ein Autokommand ist, der sowieso viel später ausgeführt wird? Ist das ein Fehler in Vim oder ist das ein Feature, das ich gerade nicht verstehe?

    
Magnus 18.08.2009, 05:24
quelle

3 Antworten

10

Die einfache Antwort auf Ihr Problem ist, dass diese Zeilen nicht in Ihrem vimrc sein sollten. Die offiziell unterstützte Möglichkeit, dies zu umgehen, ist das Erstellen einer filetype.vim -Datei in Ihrem .vim -Verzeichnis, die Folgendes enthält:

%Vor%

Warum Ihr Code verhält, wie es funktioniert, ist es tatsächlich ein bisschen komplizierter als @ zu viel php's antwort impliziert.

In der ersten Version von vimrc wird die Erkennung von Dateitypen durch Ihre syntax on -Zeile initialisiert. Dies funktioniert, indem Sie ein AutoMCD einrichten, das ausgelöst wird, wenn eine Datei mit der Erweiterung .r geöffnet wird, und dieses AutoMD ruft die Funktion s:FTr() in filetype.vim.

auf

Allerdings überschreibt Ihre autocmd! -Zeile dieses vorhandene autocmd 1 , sodass die Funktion s:FTr() niemals 2 läuft. Ihr autocmd wird dann ausgelöst, aber setzt den Dateityp nicht , da der Befehl setfiletype denkt, dass der Dateityp bereits auf 3 gesetzt wurde.

Da der Dateityp immer noch nicht festgelegt ist, versucht Vim, basierend auf dem Inhalt der Datei einen zuzuweisen und ordnet ihn schließlich dem conf type 4 zu.

Die beste Referenz für all das ist :help filetype . Und speziell in Ihrem Fall :help new-filetype und :help remove-filetype . Der Befehl :verbose ist auch sehr praktisch, um herauszufinden, welche Einstellungen von welchem ​​Skript gesetzt wurden.

1: Wegen der ! . Wenn Sie ! entfernen würden, würden Sie feststellen, dass der Dateityp korrekt eingestellt ist. Dies ist jedoch nicht die richtige Lösung, da Sie dann zulassen, dass die Datei auf einen Typ festgelegt wird (und alle Einstellungen für diesen Dateityp übernommen werden) und dann in einen anderen Typ geändert wird. Wenn der zweite Dateityp nicht alle diese Einstellungen überschreibt, bleiben möglicherweise einige übrig, die möglicherweise nicht Ihren Vorstellungen entsprechen.

2: Versuchen Sie, :set autocmd BufRead *.r auszuführen, wenn Sie die zwei verschiedenen vimrc-Dateien verwenden. Beachten Sie den Unterschied in der angegebenen Ausgabe.

3: Siehe :help setfiletype . Beachten Sie, dass wenn Sie die Zeile setfiletype r in set ft=r in der ersten Version Ihres vimrc ändern, der Dateityp auf r gesetzt wird. Siehe jedoch Fußnote 1, warum dies nicht die beste Lösung ist.

4: ... in einer Codezeile, die kommentiert wird: "check this last, es ist nur raten"

    
Rich 17.02.2011, 16:52
quelle
7

In Ihrer ersten Version löst die Syntax auf die Dateityperkennung aus, bevor Ihr Autokommando hinzugefügt wurde.

    
too much php 18.08.2009 05:31
quelle
1

Laut dieser Seite

  

Ссылка

Sie müssen lediglich zwei Codezeilen in Ihre .vimrc-Datei einfügen.

%Vor%     
Ray Wang 29.03.2013 07:43
quelle