TL; DR : com find-file-noselect
você não tem controle sobre o que realmente acontece, e você pode acabar com modos secundários arbitrários ativados no buffer, dependendo do que o usuário ativou nos seus init.el
. Além disso, a limpeza é difícil.
Use with-temp-buffer
e em insert-file-contents
vez disso. Se você precisar de modos principais ou secundários específicos no buffer, ative-os explicitamente . Para gravar arquivos, use em with-temp-file
vez disso, o qual, apesar do nome, permite gravar em arquivos arbitrários.
Efeitos colaterais
find-file-noselect
tem muitos efeitos colaterais, incluindo
- fazer perguntas interativamente (isso por si só é proibido no uso não interativo),
- ativar automaticamente o modo de visualização para arquivos somente leitura,
- entrando no modo normal, caso contrário,
- e correndo
find-file-hook
.
Modo Normal em si
- seleciona automaticamente um modo principal adequado para o buffer atual,
- executa todos os ganchos correspondentes dos modos principal e secundário,
- e lê todas as variáveis locais para o buffer atual, ou seja, variáveis de arquivo e variáveis de diretório, que novamente podem fazer perguntas interativas sobre variáveis locais inseguras.
Como todos os ganchos são executados, você obtém todos os modos secundários e funções de gancho ativados pelo usuário init.el
, o que pode causar tudo, desde pequenos inconvenientes (se modos secundários indesejáveis estão ativados) a grandes estragos (se o usuário adicionou uma função de gancho que espera ser chamado de um contexto interativo).
Consulte https://github.com/flycheck/flycheck/issues/366 para obter um exemplo. O uso de find-file-noselect
causou a verificação de sintaxe de um arquivo de dados pelo Flycheck e, como estava acontecendo no desligamento do Emacs, não havia tempo para limpar adequadamente novamente, deixando um arquivo temporário para trás.
Limpar
Com find-file-noselect
você precisa ter cuidado extra para matar o buffer novamente. find-file-noselect
não faz isso por você.
Você precisa se lembrar do buffer em algum lugar e usá unwind-protect
-lo com cuidado para garantir que o buffer seja morto, mesmo no caso de saídas não locais.
Alternativas
Para ler arquivos, use with-temp-buffer
e insert-file-contents
, que faz apenas as coisas mais básicas, por exemplo, conversão do sistema de codificação, mas não faz perguntas, ativa ganchos ou configura variáveis locais:
(with-temp-buffer
(insert-file-contents (locate-user-emacs-file "foo.el"))
;; Enter the major mode explicitly
(emacs-lisp-mode)
;; …
)
with-temp-buffer
cuida para matar adequadamente o buffer temporário no final de seu corpo.
Para gravar arquivos, use with-temp-file
, o que cria um buffer temporário e grava o conteúdo no nome do arquivo especificado no final do corpo:
(with-temp-file (locate-user-emacs-file "foo.el")
(prin1 (list 'my 'data) (current-buffer)))
good-practices
etiqueta antes; é uma boa ideia usá-lo?