Si inicio emacs 24.5.2 con emacs -Qy 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-functionsque 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,*seeshellomitirá 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-functionssolo afecta la interpretación de*rm, no la interpretación derm.Fuente: el código fuente ... De Emacs 24.3:
eshell-find-alias-functionbusca 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/rmo, siempre que lo haya dejadoeshell-prefer-lisp-functionsen cero, llame*rm*. Si desearminvocar siempre la utilidad externa, puede definir un alias:alias rm "rm $*"(gracias GDP2 ).fuente
rmsiempre 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 derminvocar el comando externo. Como se documenta en el manual, se puede hacer un alias que puntosrma*rm(véase también emacs.stackexchange.com/a/880/10761 ).