Perché eshell preferisce le funzioni lisp anche quando eshell-prefer-lisp-funzioni è zero?


8

Se avvio emacs 24.5.2 con emacs -Qe faccio M-x eshell, quindi eseguo :

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

Ottengo la versione di eshell. Ma se C-h v eshell-prefer-lisp-functionsvedo il valore è zero. Tuttavia la documentazione afferma:

Se si preferisce utilizzare i comandi integrati anziché i comandi esterni, impostare eshell-prefer-lisp-funzioni su t.

è un insetto? Ho pensato che i documenti potrebbero essere all'indietro, quindi ho provato a impostare la variabile su t, ma il comportamento rimane lo stesso, continuo a ottenere l'implementazione di eshell anziché la versione in / bin.


Mi chiedo se il problema sia which. Se lo fai rm --version, cosa ottieni?
zck,

@zck Ottengo quello che otterrei da / bin / rm, ma l'intero motivo per cui ho iniziato a indagare è perché ho creato una directory di grandi dimensioni che ha causato il blocco di tutti gli emacs, indicando che stava usando la versione di eshell. Credo che le versioni di eshell fallback alla versione di sistema quando incontrano un argomento non riconosciuto per motivi di compatibilità, quindi penso che il fatto che produca informazioni sulla versione rm dei coreutils sia in realtà fuorviante, e sta usando la versione di eshell.
Joseph Garvin,

Bene, questo è confuso. Vorrei poter aiutare di più.
zck,

Perché non usare il comando diretto invece di fare affidamento sulle impostazioni preferite ? Ad esempio: $ *rm filename. L'avvio *farà eshellsaltare la ricerca di comandi integrati. Questo metodo è utile per bypassare i comandi integrati, indipendentemente dalle impostazioni preferite .
Utente Emacs il

Risposte:


4

Eshell preferisce sempre le funzioni Lisp. eshell-prefer-lisp-functionsinfluenza solo l'interpretazione di *rm, non l'interpretazione di rm.

Fonte: il codice sorgente ... Da 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-functioncerca una funzione sotto il eshell/prefisso. C'è una logica simile in eshell/which.

La documentazione della variabile è decisamente fuorviante e anche il manuale è piuttosto fuorviante. Immagino che il comportamento sia in base alla progettazione (dopo tutto, perché dovresti definire una funzione eshell se non deve usarla?), Quindi è un bug di documentazione.

Per richiamare l'utilità esterna, chiamare /bin/rmo, a condizione che sia stato eshell-prefer-lisp-functionsimpostato su zero, chiamare *rm*. Se vuoi rminvocare sempre l'utilità esterna, puoi definire un alias: alias rm "rm $*"(grazie GDP2 ).


Questa è una segnalazione di bug, non una risposta. Elimina la risposta o modificala con una soluzione praticabile.
Utente Emacs il

2
Utente Emacs: di cosa stai parlando? La domanda è "Perché eshell preferisce le funzioni lisp anche quando eshell-prefer-lisp-funzioni è zero?" e questa è al 100% una risposta a questa domanda.
phils,

"L'unico modo per far rmsempre invocare il comando esterno è quello di assicurarsi che non venga chiamata alcuna funzione eshell/rm. (Che, o ovviamente avvisando o ridefinendo parte del codice di Eshell.)" Non è l'unico modo per far rminvocare il comando esterno. Come documentato nel manuale, potresti creare un alias che punta rma *rm(vedi anche emacs.stackexchange.com/a/880/10761 ).
PIL 2

@Gilles Nessun problema.
PIL 2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.