Je voudrais vérifier si un tampon (disons, actuel) visite un fichier ou non. Je pourrais dire:
(if (buffer-file-name) ...)
mais il ne semble pas très élégant - ce qui m'intéresse, c'est seulement la valeur booléenne, pas le nom réel du tampon en question. Si la buffer-file-name
fonction était écrite en Elisp, je pourrais regarder sa source pour savoir ce qu'elle utilise - mais elle est écrite en C, et bien que je puisse installer les sources Emacs, j'ai peur de ne pas trouver de nom elisp pour la fonction qui vérifie ce que je recherche de toute façon.
Ce dont j'ai besoin, c'est que je veux créer un répertoire basé sur le nom du fichier du tampon actuel, et actuellement je fais plus ou moins ceci:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Alors, quelle serait la façon idiomatique Elisp de faire cela?
buffer-file-name
vraiment à l'utilisation , c'est la bonne façon de le faire (si vous le voulez vraimentt
, faites-le,(and (buffer-file-name) t)
mais c'est plus laid IMO). Son implémentation est la lecture dufilename
champ de la structure du tampon C, qui n'est de toute façon pas accessible directement depuis Elisp. En fin de compte, c'est juste un pointeur qui est nul ou non.(and (buffer-file-name) t)
air étrange.(if (buffer-file-name) ... )
élégant, alors vous n'avez pas codé en elisp depuis très longtemps. Cela devient plus laid d'ici.Réponses:
Je dirais que votre utilisation est idiomatique, car le nom du tampon est une valeur booléenne parfaitement appropriée en soi. Citant du manuel :
Pour approfondir le point, consultez le code pour
clone-buffer
. J'espère que vous verrez ce qui suit:Notez que cela teste la liaison de variable
buffer-file-name
au lieu d'appeler la fonction sans argument(buffer-file-name)
, mais les deux doivent toujours se comporter de la même manière.la source
Vous pouvez utiliser
(buffer-file-name)
(avec l' argument tampon en option) ou le tampon localbuffer-file-name
variable. Les deux évaluent à la même valeur pour un tampon donné.C'est la façon idiomatiques de le faire dans Elisp, cependant, de sorte que votre code est bien. Si vous le vouliez désespérément, vous pourriez toujours créer une
buffer-has-file-p
fonction wrapper.la source
(buffer-file-name BUFFER)
c'est certainement plus agréable que cela(with-current-buffer BUFFER buffer-file-name)
, mais sinon je ne pense pas que celui que vous utilisez soit important (et comme la fonction est écrite en C, je doute qu'il y ait même beaucoup de différence dans les performances).Utilisez simplement
buffer-file-name
. En Lisp, nous utilisons souvent une non-nil
valeur pour dire vrai .Les seules fois où vous voudrez peut-être éviter cela, c'est si la fonction est coûteuse ou a des effets secondaires indésirables.
la source
nil
est non -vrai est vrai, je pensais juste que saisir le nom quand je veux seulement savoir si un nom existe est "coûteux" - mais apparemment ce n'est pas le cas.A partir du chapitre "Buffer List" de la documentation:
Vous devez donc trouver un moyen de rechercher dans la liste des tampons en direct. En voici un:
la source