Si inicio emacs 24.5.2 con emacs -Q
y do M-x eshell
, entonces ejecuto:
$ which rm
eshell/rm is a compiled Lisp function in `em-unix.el'
Me sale la versión eshell. Pero si veo C-h v eshell-prefer-lisp-functions
que el valor es nulo. Sin embargo, la documentación dice:
Si prefiere utilizar los comandos integrados en lugar de los comandos externos, establezca eshell-prefer-lisp-functions en t.
¿Es esto un error? Pensé que los documentos podrían estar al revés, así que intenté establecer la variable en t
, pero el comportamiento sigue siendo el mismo, sigo obteniendo la implementación de eshell en lugar de la versión en / bin.
which
. Si lo hacesrm --version
, ¿qué obtienes?$ *rm filename
. Al comenzar,*
seeshell
omitirá la búsqueda de comandos integrados. Este método es útil para omitir los comandos integrados sin importar las configuraciones preferidas .Respuestas:
Eshell siempre prefiere las funciones de Lisp.
eshell-prefer-lisp-functions
solo afecta la interpretación de*rm
, no la interpretación derm
.Fuente: el código fuente ... De Emacs 24.3:
eshell-find-alias-function
busca una función debajo deleshell/
prefijo. Hay una lógica similar eneshell/which
.La documentación de la variable es francamente engañosa, y el manual también es bastante engañoso. Supongo que el comportamiento es por diseño (después de todo, ¿por qué definirías una función eshell si no es para usarla?), Por lo que es un error de documentación.
Para invocar la utilidad externa, llame
/bin/rm
o, siempre que lo haya dejadoeshell-prefer-lisp-functions
en cero, llame*rm*
. Si desearm
invocar siempre la utilidad externa, puede definir un alias:alias rm "rm $*"
(gracias GDP2 ).fuente
rm
siempre se invoque el comando externo es asegurarse de que no se llame a ninguna funcióneshell/rm
. (Eso, o por supuesto aconsejar o redefinir parte del código de Eshell)." Esa no es la única forma derm
invocar el comando externo. Como se documenta en el manual, se puede hacer un alias que puntosrm
a*rm
(véase también emacs.stackexchange.com/a/880/10761 ).