¿Por qué eshell prefiere las funciones lisp incluso cuando eshell-prefer-lisp-functions es nulo?

8

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.

Joseph Garvin
fuente
Me pregunto si el problema es con which. Si lo haces rm --version, ¿qué obtienes?
zck
@zck Obtengo lo que obtendría de / bin / rm, pero toda la razón por la que comencé a investigar esto es porque compré un directorio grande que provocó que todos los emacs se congelaran, lo que indica que está usando la versión eshell. Creo que las versiones de eshell recurren a la versión del sistema cuando encuentran un argumento no reconocido por razones de compatibilidad, por lo que creo que el hecho de que genera la información de la versión rm de coreutils es realmente engañoso, y está utilizando la versión de eshell.
Joseph Garvin
Bueno, eso es confuso. Ojalá pudiera ayudar más.
zck
¿Por qué no usar el comando directo en lugar de depender de la configuración preferida ? Por ejemplo: $ *rm filename. Al comenzar, *se eshellomitirá la búsqueda de comandos integrados. Este método es útil para omitir los comandos integrados sin importar las configuraciones preferidas .
Usuario de Emacs el

Respuestas:

4

Eshell siempre prefiere las funciones de Lisp. eshell-prefer-lisp-functionssolo afecta la interpretación de *rm, no la interpretación de rm.

Fuente: el código fuente ... De 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-functionbusca una función debajo del eshell/prefijo. Hay una lógica similar en eshell/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 dejado eshell-prefer-lisp-functionsen cero, llame *rm*. Si desea rminvocar siempre la utilidad externa, puede definir un alias: alias rm "rm $*"(gracias GDP2 ).

Gilles 'SO- deja de ser malvado'
fuente
Este es un informe de error, no una respuesta. Elimine la respuesta o modifíquela con una solución viable.
Usuario de Emacs
2
Usuario de Emacs: ¿De qué estás hablando? La pregunta es "¿Por qué eshell prefiere las funciones lisp incluso cuando eshell-prefer-lisp-functions es nulo?" y esto es 100% una respuesta a esa pregunta.
phils
"La única manera de hacer que rmsiempre se invoque el comando externo es asegurarse de que no se llame a ninguna función eshell/rm. (Eso, o por supuesto aconsejar o redefinir parte del código de Eshell)." Esa no es la única forma de rminvocar el comando externo. Como se documenta en el manual, se puede hacer un alias que puntos rma *rm(véase también emacs.stackexchange.com/a/880/10761 ).
GDP2
@Gilles No hay problema.
GDP2