Wann genau unterscheidet sich <afile> von <amatch>?

7

Die Dokumentation sagt:

<afile>    When executing autocommands, is replaced with the file name
           for a file read or write.
<abuf>     When executing autocommands, is replaced with the currently
           effective buffer number (for ":r file" and ":so file" it is
           the current buffer, the file being read/sourced is not in a
           buffer).
<amatch>   When executing autocommands, is replaced with the match for
           which this autocommand was executed.  It differs from
           <afile> only when the file name isn't used to match with
           (for FileType, Syntax and SpellFileMissing events).

Wenn ich das hätte autocmd:

autocmd BufNewFile * echo expand('<amatch>') expand('<afile>')

Und geöffnet, sagen wir .zshrcin /tmp( cd /tmp; vim .zshrc), ich bekomme:

/tmp/.zshrc .zshrc

Sie sind nicht gleich. Was ist los?

%ist treu zu dem, was ich tatsächlich getippt habe. vim ./.zshrcmit expand('%')dem oben genannten autocmdgibt mir:

/tmp/.zshrc .zshrc ./.zshrc
muru
quelle
Denken Sie, dass der Unterschied darin bestehen kann, dass <afile>nur der Dateiname und <amatch>der vollständige Pfad für die Datei angegeben werden?
nobe4
Ja @ Nobe4, das ist immer , wie sich herausstellt. %ist jedoch dem treu, was ich tatsächlich erwähnt habe. Aber ich bin mir nicht sicher, ob ich %hier vertrauen kann . : /
Muru
Wenn Sie eingeben, sind vim /tmp/.zshrcsie die gleichen Zeichenfolgen. Wenn Ihr cwd ist, erhalten /tmpSie einen absoluten Pfad und einen relativen Pfad, und obwohl es sich nicht um dieselben Zeichenfolgen handelt, handelt es sich um dieselben Pfade.
Martin Tournoij
@ Carpetsmoker Ich tippte einfachvim .zshrc
muru
In expand können Sie haben: expand('<amatch>') == expand('%:p')und expand('<afile>') == expand('%'). Was denken Sie ? Edit: expand('<afile>') == expand('%')
Hab

Antworten:

8

<amatch>ist genau das, was mit dem autocmdMuster übereinstimmt . Für autocmds, die mit Dateinamen übereinstimmen, werden Symlinks aufgelöst, das Ergebnis kanonisiert und der vollständige Pfad zurückgegeben.

<afile>ist der kanonische vollständige Pfad wie oben, aber das Ergebnis wird auch verkürzt, was im Wesentlichen dasselbe ist wie fnamemodify(file, ':.')(die genauen Details sind komplizierter, aber die vorhergehende Beschreibung ist für alle "normalen" Fälle korrekt).

Also im Allgemeinen expand('<afile>') == expand('<amatch>:.')( bearbeiten: vorausgesetzt natürlich, dass sie sich auf dasselbe beziehen).

Sato Katsura
quelle
Das scheint das Verhalten zu sein, ja. Aber haben Sie etwas, um diese Antwort zu unterstützen?
Muru
3
@muru: Du meinst, abgesehen von meinem guten Aussehen und meinem perfekten Lächeln? ;) Ja, ich glaube schon: <afile> und <amatch> Quellen.
Sato Katsura
Im Allgemeinen ist afile nicht dasselbe wie amatch, da es je nach Autocommand-Ereignis sehr unterschiedlich sein kann.
Christian Brabandt
2
@ChristianBrabandt Ja. Der Punkt der Frage ist, können sie immer noch unterschiedlich sein für autocmds wo <afile>und <amatch> sie beziehen sich auf die gleiche Sache (nämlich in einer Datei), im Gegensatz zu dem, was das Handbuch impliziert. Meine Antwort erklärt, wie und warum sie sich in diesem speziellen Fall unterscheiden. Besser jetzt? :)
Sato Katsura