Em uma resposta recente de lunaryorn , ele declarou:
No entanto, eu recomendaria contra a maioria das outras partes da organização, por razões já declaradas nos comentários: É antiga e cheia de práticas legadas e prejudiciais (por exemplo, find-file-noselect para ler arquivos de maneira não interativa).
Alguém pode explicar por que é find-file-noselect
uma má idéia ler arquivos nos programas Elisp? Existe uma maneira melhor? Estou perguntando, porque eu estava pensando em usá-lo em um dos meus projetos.
good-practices
etiqueta antes; é uma boa ideia usá-lo?good-practices
se enquadra na categoria "meta tag", que é desaprovada pela SE.Respostas:
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 seusinit.el
. Além disso, a limpeza é difícil.Use
with-temp-buffer
e eminsert-file-contents
vez disso. Se você precisar de modos principais ou secundários específicos no buffer, ative-os explicitamente . Para gravar arquivos, use emwith-temp-file
vez disso, o qual, apesar do nome, permite gravar em arquivos arbitrários.Efeitos colaterais
find-file-noselect
tem muitos efeitos colaterais, incluindofind-file-hook
.Modo Normal em si
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
einsert-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
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:fonte
Na seção 24.3 do manual Elisp:
Pesquisando na documentação do Elisp
find-file-noselect
, é óbvio que ele faz muito mais do que apenas ler um arquivo em um buffer. Talvez as pessoas que acham que usar essa função seja uma má idéia estejam pensando nos efeitos colaterais possivelmente indesejados? Eu acho que depende do que você deseja alcançar. Se você deseja ter o conteúdo do buffer o mais limpo / intocado possível, pode ser uma boa ideia usar a combinação antiga e confiávelwith-temp-buffer
+insert-file-contents
. Se você quiser o conteúdo do buffer para ser tão perto do quefind-file
produzir, talvez você não quiser usarfind-file-noselect
? Ou talvez ele estivesse pensandofind-file
;)fonte
find-file
processo.