TL; DR : com find-file-noselectvocê 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-buffere em insert-file-contentsvez disso. Se você precisar de modos principais ou secundários específicos no buffer, ative-os explicitamente . Para gravar arquivos, use em with-temp-filevez disso, o qual, apesar do nome, permite gravar em arquivos arbitrários.
Efeitos colaterais
find-file-noselecttem 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-noselectcausou 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-noselectvocê precisa ter cuidado extra para matar o buffer novamente. find-file-noselectnã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-buffere 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-practicesetiqueta antes; é uma boa ideia usá-lo?