Ich möchte überprüfen, ob ein (z. B. aktueller) Puffer eine Datei besucht oder nicht. Ich könnte sagen:
(if (buffer-file-name) ...)
aber es scheint nicht sehr elegant zu sein - was mich interessiert, ist nur der boolesche Wert, nicht der tatsächliche Name des fraglichen Puffers. Wenn die buffer-file-name
Funktion in Elisp geschrieben wäre, könnte ich in ihrer Quelle nachsehen, was sie verwendet - aber sie ist in C geschrieben, und während ich die Emacs-Quellen installieren könnte, befürchte ich, dass ich keinen Elisp-Namen finden würde für die Funktion, die prüft, was ich dort sowieso bin.
Wofür ich es brauche, möchte ich ein Verzeichnis erstellen, das auf dem Namen der Datei des aktuellen Puffers basiert, und derzeit mache ich mehr oder weniger Folgendes:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Also, was wäre die Elisp-idiomatische Art, dies zu tun?
buffer-file-name
bin mir nicht sicher, warum Sie die Verwendung wirklich ablehnen, es ist der richtige Weg, dies zu tun (wenn Sie es wirklich wirklich wollent
, tun Sie es,(and (buffer-file-name) t)
aber das ist hässlicher, IMO). Seine Implementierung liest dasfilename
Feld der Puffer-C-Struktur, auf die ohnehin nicht direkt von Elisp aus zugegriffen werden kann. Am Ende ist es nur ein Zeiger, der entweder null ist oder nicht.(and (buffer-file-name) t)
sieht seltsam aus.(if (buffer-file-name) ... )
elegant halten, haben Sie nicht lange in elisp programmiert. Ab hier wird es nur noch hässlicher.Antworten:
Ich würde argumentieren, dass Ihre Verwendung ein idiomatisches Elisp ist, da der Name des Puffers ein vollkommen geeigneter boolescher Wert für sich ist. Zitat aus dem Handbuch :
Überprüfen Sie den Code für
clone-buffer
. Ich gehe davon aus, dass Sie Folgendes sehen werden:Beachten Sie, dass hiermit die Variablenbindung von getestet wird,
buffer-file-name
anstatt die Funktion ohne Argument aufzurufen.(buffer-file-name)
Die beiden sollten sich jedoch immer gleich verhalten.quelle
Sie können entweder
(buffer-file-name)
(mit optionalem Pufferargument) oder diebuffer-file-name
Variable buffer-local verwenden . Beide werden für einen bestimmten Puffer auf den gleichen Wert ausgewertet.Das ist der idiomatische Weg , dies in Elisp zu tun, obwohl, so dass Ihr Code ist in Ordnung. Wenn Sie es unbedingt wollten, können Sie jederzeit eine
buffer-has-file-p
Wrapper-Funktion erstellen.quelle
(buffer-file-name BUFFER)
ist es sicherlich besser als(with-current-buffer BUFFER buffer-file-name)
, aber ansonsten denke ich nicht, dass es wichtig ist, welches Sie verwenden (und da die Funktion in C geschrieben ist, bezweifle ich, dass es sogar einen großen Unterschied in der Leistung gibt).Einfach benutzen
buffer-file-name
. In Lisp verwenden wir oft einen Nichtwertnil
, um wahr zu bedeuten .Möglicherweise möchten Sie dies nur vermeiden, wenn die Funktion teuer ist oder unerwünschte Nebenwirkungen aufweist.
quelle
nil
wahr ist, ich dachte nur, den Namen zu greifen, wenn ich nur wissen will, ob ein Name existiert, ist "teuer" - aber anscheinend ist es nicht so.Aus dem Kapitel "Pufferliste" der Dokumentation:
Sie müssen also einen Weg finden, um in der Liste der Live-Puffer zu suchen. Hier ist eine:
quelle