Warum bevorzugt eshell Lisp-Funktionen, auch wenn eshell-bevorzugen-Lisp-Funktionen gleich Null ist?

8

Wenn ich emacs 24.5.2 mit emacs -Qund starte M-x eshell, dann starte :

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

Ich bekomme die Eshell-Version. Aber wenn ich C-h v eshell-prefer-lisp-functionssehe, ist der Wert gleich Null. In der Dokumentation heißt es jedoch:

Wenn Sie lieber die integrierten Befehle als die externen Befehle verwenden möchten, setzen Sie die eshell-prepare-lisp-Funktionen auf t.

Ist das ein Fehler? Ich dachte, die Dokumente könnten rückwärts sein, also habe ich versucht, die Variable auf zu setzen t, aber das Verhalten bleibt gleich. Ich erhalte weiterhin die eshell-Implementierung und nicht die Version in / bin.

Joseph Garvin
quelle
Ich frage mich, ob das Problem mit ist which. Wenn ja rm --version, was bekommen Sie?
Zck
@zck Ich bekomme, was ich von / bin / rm bekommen würde, aber der ganze Grund, warum ich angefangen habe, dies zu untersuchen, ist, dass ich ein großes Verzeichnis erstellt habe, in dem alle Emacs eingefroren sind, was darauf hinweist, dass es die Eshell-Version verwendet. Ich glaube, dass die eshell-Versionen auf die Systemversion zurückgreifen, wenn sie aus Kompatibilitätsgründen auf ein nicht erkanntes Argument stoßen. Daher denke ich, dass die Tatsache, dass sie die rm-Versionsinformationen der coreutils ausgeben, tatsächlich irreführend ist und die eshell-Version verwendet.
Joseph Garvin
Das ist verwirrend. Ich wünschte, ich könnte mehr helfen.
Zck
Warum nicht den direkten Befehl verwenden, anstatt sich auf bevorzugte Einstellungen zu verlassen? Zum Beispiel : $ *rm filename. Beim Starten *wird die eshellSuche nach integrierten Befehlen übersprungen. Diese Methode ist nützlich, um integrierte Befehle zu umgehen, unabhängig von den bevorzugten Einstellungen.
Emacs User

Antworten:

4

Eshell bevorzugt immer Lisp-Funktionen. eshell-prefer-lisp-functionsbeeinflusst nur die Interpretation von *rm, nicht die Interpretation von rm.

Quelle: der Quellcode… Aus 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-functionsucht eine Funktion unter dem eshell/Präfix. Es gibt eine ähnliche Logik eshell/which.

Die Dokumentation der Variablen ist geradezu irreführend, und das Handbuch ist auch ziemlich irreführend. Ich denke, das Verhalten ist beabsichtigt (warum sollten Sie eine Eshell-Funktion definieren, wenn sie nicht verwendet werden soll?), Es handelt sich also um einen Dokumentationsfehler.

Um das externe Dienstprogramm aufzurufen, rufen Sie /bin/rman oder rufen Sie an , sofern Sie den eshell-prefer-lisp-functionsWert auf Null gesetzt haben *rm*. Wenn Sie rmimmer das externe Dienstprogramm aufrufen möchten , können Sie einen Alias ​​definieren: alias rm "rm $*"(danke GDP2 ).

Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist ein Fehlerbericht, keine Antwort. Löschen Sie die Antwort oder ändern Sie sie mit einer praktikablen Lösung.
Emacs User
2
Emacs User: Worüber sprichst du? Die Frage ist: "Warum bevorzugt eshell Lisp-Funktionen, auch wenn eshell-bevorzugen-lisp-Funktionen gleich Null sind?" und dies ist zu 100% eine Antwort auf diese Frage.
Phils
"Die einzige Möglichkeit, rmden externen Befehl immer aufzurufen, besteht darin, sicherzustellen, dass keine Funktion aufgerufen wird eshell/rm. (Dies oder natürlich das Empfehlen oder Neudefinieren eines Teils von Eshells Code.)" Dies ist nicht die einzige Möglichkeit, rmden externen Befehl aufzurufen. Wie im Handbuch dokumentiert, könnten Sie einen Alias machen , die Punkte rmzu *rm(siehe auch emacs.stackexchange.com/a/880/10761 ).
GDP2
@ Gilles Kein Problem.
GDP2