Por que eshell prefere funções lisp mesmo quando eshell-prefer-lisp-functions é nulo?

8

Se eu inicializar o emacs 24.5.2 com emacs -Qe faço M-x eshell, execute:

$ which rm
eshell/rm is a compiled Lisp function in `em-unix.el'

Eu recebo a versão eshell. Mas se eu C-h v eshell-prefer-lisp-functionsvejo o valor é nulo. No entanto, a documentação declara:

Se você preferir usar os comandos internos em vez dos externos, defina eshell-prefer-lisp-functions como t.

Isso é um inseto? Eu pensei que os documentos pudessem estar invertidos, então tentei definir a variável como t, mas o comportamento permanece o mesmo, continuo obtendo a implementação do eshell em vez da versão em / bin.

Joseph Garvin
fonte
Gostaria de saber se o problema está com which. Se você faz rm --version, o que você ganha?
Zck
@zck Eu recebo o que obteria de / bin / rm, mas toda a razão pela qual comecei a investigar isso é porque eu tinha um diretório grande que causava o congelamento de todo o emacs, indicando que ele estava usando a versão eshell. Acredito que as versões do eshell se voltam para a versão do sistema quando encontram um argumento não reconhecido por questões de compatibilidade, então acho que o fato de exibir as informações da versão rm do coreutils é realmente enganador e está usando a versão do eshell.
Joseph Garvin
Bem, isso é confuso. Gostaria de poder ajudar mais.
Zck
Por que não usar o comando direto em vez de confiar nas configurações preferidas ? Por exemplo: $ *rm filename. Iniciar *fará eshellpular a procura de comandos internos. Este método é útil para ignorar comandos internos, independentemente das configurações preferidas .
Emacs usuário

Respostas:

4

Eshell sempre prefere funções Lisp. eshell-prefer-lisp-functionsafeta apenas a interpretação de *rm, não a interpretação de rm.

Fonte: o código fonte… Do Emacs 24.3:

(defun eshell-plain-command (command args)
  (let* ((esym (eshell-find-alias-function command))
    …
    (if (and …
             (or esym eshell-prefer-lisp-functions
                 (not (eshell-search-path command))))
        (eshell-lisp-command sym args)
      (eshell-external-command command args))))

eshell-find-alias-functionprocura uma função sob o eshell/prefixo. Existe uma lógica semelhante eshell/which.

A documentação da variável é absolutamente enganosa, e o manual também é enganoso. Eu acho que o comportamento é por design (afinal, por que você definiria uma função eshell se não deve usá-la?), Portanto é um erro de documentação.

Para chamar o utilitário externo, ligue /bin/rmou, desde que você tenha deixado eshell-prefer-lisp-functionsdefinido como nulo, ligue *rm*. Se você deseja rmsempre chamar o utilitário externo, pode definir um alias: alias rm "rm $*"(obrigado GDP2 ).

Gilles 'SO- parar de ser mau'
fonte
Este é um relatório de erro, não uma resposta. Exclua a resposta ou altere-a com uma solução viável.
Emacs usuário
2
Usuário do Emacs: Do que você está falando? A pergunta é "Por que o eshell prefere funções lisp mesmo quando as funções eshell-prefer-lisp são nulas?" e isso é 100% uma resposta a essa pergunta.
Phs #
"A única maneira de fazer rmsempre chamar o comando externo é garantir que não haja nenhuma função chamada eshell/rm. (Isso, é claro, aconselhando ou redefinindo parte do código de Eshell.)" Essa não é a única maneira de fazer rmchamar o comando externo. Conforme documentado no manual, você pode criar um alias que aponte rmpara *rm(consulte também emacs.stackexchange.com/a/880/10761 ).
GDP2 19/07/19
@ Gilles Não há problema.
GDP2 19/07/19