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 .zshrc
in /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 ./.zshrc
mit expand('%')
dem oben genannten autocmd
gibt mir:
/tmp/.zshrc .zshrc ./.zshrc
<afile>
nur der Dateiname und<amatch>
der vollständige Pfad für die Datei angegeben werden?%
ist jedoch dem treu, was ich tatsächlich erwähnt habe. Aber ich bin mir nicht sicher, ob ich%
hier vertrauen kann . : /vim /tmp/.zshrc
sie die gleichen Zeichenfolgen. Wenn Ihr cwd ist, erhalten/tmp
Sie einen absoluten Pfad und einen relativen Pfad, und obwohl es sich nicht um dieselben Zeichenfolgen handelt, handelt es sich um dieselben Pfade.vim .zshrc
expand('<amatch>') == expand('%:p')
undexpand('<afile>') == expand('%')
. Was denken Sie ? Edit:expand('<afile>') == expand('%')
Antworten:
<amatch>
ist genau das, was mit demautocmd
Muster übereinstimmt . Fürautocmd
s, 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 wiefnamemodify(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).quelle
autocmd
s 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? :)