Gostaria de verificar se algum buffer (digamos, atual) está visitando um arquivo ou não. Eu poderia dizer:
(if (buffer-file-name) ...)
mas parece não ser muito elegante - o que me interessa é apenas o valor booleano, não o nome real do buffer em questão. Se a buffer-file-name
função fosse escrita no Elisp, eu poderia procurar na fonte para descobrir o que ela usa - mas está escrita em C e, embora eu possa instalar as fontes do Emacs, tenho medo de não encontrar um nome para o elisp para a função que verifica o que eu estou procurando lá de qualquer maneira.
O que eu preciso é que eu quero criar um diretório com base no nome do arquivo do buffer atual e atualmente estou fazendo mais ou menos isso:
(make-directory (if (buffer-file-name) (file-name-base) "default-dir"))
Então, qual seria a maneira idiomática do Elisp de fazer isso?
buffer-file-name
lo realmente, é a maneira certa de fazê-lo (se você realmente quert
,(and (buffer-file-name) t)
mas o IMO é mais feio). Sua implementação está lendo ofilename
campo do buffer C struct, que de qualquer maneira não é acessível diretamente do Elisp. No final, é apenas um ponteiro que é nulo ou não.(and (buffer-file-name) t)
parece estranho.(if (buffer-file-name) ... )
é elegante, você não está codificando no elisp há muito tempo. Só fica mais feio daqui.Respostas:
Eu diria que seu uso é elisp idiomático, já que o nome do buffer é um valor booleano perfeitamente apropriado. Citando o manual :
Para aprofundar o assunto, confira o código para
clone-buffer
. Espero que você veja o seguinte:Observe que isso está testando a ligação da variável em
buffer-file-name
vez de chamar a função sem argumento(buffer-file-name)
, mas os dois sempre devem se comportar da mesma maneira.fonte
Você pode usar
(buffer-file-name)
(com argumento de buffer opcional) ou abuffer-file-name
variável buffer-local . Ambos são avaliados com o mesmo valor para um determinado buffer.Essa é a maneira idiomática de fazer isso no Elisp, portanto, seu código está correto. Se você quisesse desesperadamente, sempre poderia fazer uma
buffer-has-file-p
função de invólucro.fonte
(buffer-file-name BUFFER)
certamente será melhor do que isso(with-current-buffer BUFFER buffer-file-name)
, mas, caso contrário, acho que não importa qual deles você use (e como a função está escrita em C, duvido que exista muita diferença no desempenho).Basta usar
buffer-file-name
. No Lisp, geralmente usamos um não-nil
valor para significar verdadeiro .As únicas vezes em que você pode evitar isso são se a função for cara ou tiver efeitos colaterais indesejados.
fonte
nil
seja verdadeira, só pensei em pegar o nome quando só quero saber se existe algum nome que seja "caro" - mas aparentemente não é.No capítulo "Buffer List" da documentação:
Então você tem que encontrar uma maneira de pesquisar na lista de buffers ao vivo. Aqui está um:
fonte