Me gustaría comprobar si algún búfer (por ejemplo, actual) está visitando un archivo o no. Yo podría decir:
(if (buffer-file-name) ...)
pero parece no ser muy elegante: lo que me interesa es solo el valor booleano, no el nombre real del búfer en cuestión. Si la buffer-file-name
función se escribiera en Elisp, podría examinar su fuente para averiguar qué usa, pero está escrita en C, y aunque podría instalar las fuentes de Emacs, me temo que no encontraría un nombre elisp para la función que comprueba lo que busco allí de todos modos.
Lo que necesito es que quiero crear un directorio basado en el nombre del archivo del búfer actual, y actualmente estoy haciendo más o menos esto:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Entonces, ¿cuál sería la forma idiomática de Elisp de hacer esto?
buffer-file-name
realmente, es la forma correcta de hacerlo (si realmente lo deseat
, hágalo,(and (buffer-file-name) t)
pero eso es más feo). Su implementación es leer elfilename
campo de la estructura del búfer C, que de todos modos no es accesible directamente desde Elisp. Al final, es solo un puntero que es nulo o no.(and (buffer-file-name) t)
ve extraño.(if (buffer-file-name) ... )
sea elegante, entonces no has estado codificando en elisp por mucho tiempo. Solo se pone más feo desde aquí.Respuestas:
Yo diría que su uso es elisp idiomático, ya que el nombre del búfer es un valor booleano perfectamente apropiado por derecho propio. Citando del manual :
Para avanzar en el punto, consulte el código de
clone-buffer
. Espero que veas lo siguiente:Tenga en cuenta que esto está probando el enlace variable de en
buffer-file-name
lugar de llamar a la función sin argumento(buffer-file-name)
, pero los dos siempre deben comportarse igual.fuente
Puede usar ya sea
(buffer-file-name)
(con argumento de buffer opcional) o labuffer-file-name
variable local de buffer . Ambos evalúan al mismo valor para un búfer dado.Sin embargo, esa es la forma idiomática de hacer esto en Elisp, por lo que su código está bien. Si quisieras desesperadamente, siempre podrías hacer que una
buffer-has-file-p
envoltura funcione.fuente
(buffer-file-name BUFFER)
es ciertamente mejor(with-current-buffer BUFFER buffer-file-name)
, pero no creo que importe cuál use (y como la función está escrita en C, dudo que haya mucha diferencia en el rendimiento).Solo úsalo
buffer-file-name
. En Lisp a menudo usamos un nonil
valor para significar verdadero .Las únicas veces que querrá evitar esto es si la función es costosa o tiene efectos secundarios no deseados.
fuente
nil
es cierto, pensé en tomar el nombre cuando solo quiero saber si existe algún nombre que sea "costoso", pero aparentemente no lo es.Del capítulo "Lista de búfer" de la documentación:
Por lo tanto, debe encontrar una manera de buscar en la lista de buffers en vivo. Aquí hay uno:
fuente