So reproduziere ich das beobachtete Verhalten.
Zuerst gebe ich diesen Befehl ein:
echo aaaaa > a
vim a
In Vim gebe ich folgende Befehle ein:
:ls
:e #
:echo bufname('#')
Hier ist die Ausgabe der obigen drei Befehle:
:ls
1 %a "a" line 1
:e #
E194: No alternate file name to substitute for '#'
:echo bufname('#')
Der bufname('#')
Befehl erzeugt keine Ausgabe.
Jetzt gebe ich diesen Befehl ein:
:bd #
Der aktuelle Puffer wird gelöscht und durch einen Puffer "[No Name]" ersetzt:
:ls
2 %a "[No Name]" line 1
Ich hatte erwartet, den E194
Fehler beim Ausführen zu bekommen :bd #
. Warum wurde stattdessen der aktuelle Puffer gelöscht?
Ich benutze VIM - Vi IMproved 8.0
.
buffers
vim-windows
Einsamer Lernender
quelle
quelle
NVIM v0.3.0-dev
, habe ich überprüft.Antworten:
Beweise
Da es keine alternative Datei gibt, die Sie gerade ausführen
:bd
, löschen Sie den aktuellen Puffer. Versuchen Sie es ohne#
und Sie werden sehen, dass das Ergebnis dasselbe ist. Ähnliches passiert mit:buffer
,:sbuffer
und zumindest ein paar andere Befehle , die akzeptieren#
als Argument: sie so leise verhalten , wenn keine Argumente übergeben wurden.In diesem Sinne erhalten Sie beim Versuch folgende
:bunload #
Fehlermeldung :E90: Cannot unload last buffer
. Führen Sie es:bunload
ohne Argumente aus, und Sie erhalten erneut das gleiche Ergebnis.Die Docs
Wir haben also Beweise,
#
die durch "nichts" ersetzt werden (wahrscheinlich eine leere Zeichenfolge). Was machen wir jetzt? Ich stöberte eine Weile in den Hilfedateien herum und versuchte, dieses Verhalten zu erwähnen. Es gab nichts explizites als zu:h cmdline-lines
sagen (ein oder zwei Seiten nach unten scrollen) ...Ich habe das als Vim gelesen, der
#
dieexpand()
Funktion (dhexpand('#')
) oder zumindest den gleichen zugrunde liegenden Code durchläuft, der dort verwendet wird.:h expand()
sagt:Klingt vertraut.
Der Code
Jetzt ist keines der oben genannten Punkte endgültig oder gibt einen Hinweis darauf, warum? Also habe ich noch etwas Zeit damit verbracht zu graben ... diesmal im Code. Mein C ist sehr rostig und ich habe keine guten Tools installiert, aber ich habe es geschafft, eine Funktion zu finden, die ein Setup für
:bdelete
aufgerufen ausführtdo_bufdel()
. Dies sendet Befehlszeilenargumente, überbuflist_findpat()
die bei#
Auftreten ein Wert zurückgegeben wirdcurwin->w_alt_fnum
. Das ist die "Puffernummer" des alternativen Puffers ... was in unserem Szenario kein positiver Wert sein kann. (Es wird nicht überprüft, ob die Alt-Datei gültig ist / existiert, bevor dieser Rückgabewert ausgewählt wird.)Bereits aus
do_bufdel()
einer Überprüfung vorgenommen , gegen diesen Rückgabewert für eine Puffernummer kleiner als 0 ist in diesem Fall der Parameter - Verarbeitungsschleife unterbrochen ist aus. Das würde dazu führen, dass dem Kerncode keine Parameter präsentiert:bdelete
werden ... was genau meinen früheren Intuitionen entspricht.Was kommt als nächstes?
Es scheint so zu funktionieren, als hätte ich nichts gesehen, was wie ein klarer Fehler aussah. Möglicherweise jedoch Unterlassungssünde ... ein Eckfall, der übersehen wurde und daher keine anmutige Behandlung hat. Aber nur die Entwickler, die dies geschrieben haben, wissen es mit Sicherheit. Der letzte Schritt wäre also, zu versuchen, ihren Input zu bekommen. Wie Christian B. sagte, ist das Fragen auf der Vim-Dev-Liste der richtige Weg.
(Beachten Sie, dass
buflist_findpat()
eine Nutzenfunktion ist so wäre es nicht eine Ausdehnung der Phantasie erfordert , dass zu übernehmen:bunload
,:buffer
etc. verwendet es auch ... , die ihr gemeinsames Verhalten in Bezug auf erklären würden#
.)quelle