Se eu inicializar o emacs 24.5.2 com emacs -Q
e 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-functions
vejo 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.
which
. Se você fazrm --version
, o que você ganha?$ *rm filename
. Iniciar*
faráeshell
pular a procura de comandos internos. Este método é útil para ignorar comandos internos, independentemente das configurações preferidas .Respostas:
Eshell sempre prefere funções Lisp.
eshell-prefer-lisp-functions
afeta apenas a interpretação de*rm
, não a interpretação derm
.Fonte: o código fonte… Do Emacs 24.3:
eshell-find-alias-function
procura uma função sob oeshell/
prefixo. Existe uma lógica semelhanteeshell/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/rm
ou, desde que você tenha deixadoeshell-prefer-lisp-functions
definido como nulo, ligue*rm*
. Se você desejarm
sempre chamar o utilitário externo, pode definir um alias:alias rm "rm $*"
(obrigado GDP2 ).fonte
rm
sempre chamar o comando externo é garantir que não haja nenhuma função chamadaeshell/rm
. (Isso, é claro, aconselhando ou redefinindo parte do código de Eshell.)" Essa não é a única maneira de fazerrm
chamar o comando externo. Conforme documentado no manual, você pode criar um alias que aponterm
para*rm
(consulte também emacs.stackexchange.com/a/880/10761 ).