eshell-prefer-lisp-functionsがnilの場合でも、eshellがlisp関数を優先するのはなぜですか?


8

emacs 24.5.2をemacs -Qとで起動した場合はM-x eshell、次のコマンドを実行します。

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

eshellバージョンを取得します。しかし、私がC-h v eshell-prefer-lisp-functionsその値を見るとnilです。それでもドキュメントには次のように記載されています:

外部コマンドの代わりに組み込みコマンドを使用する場合は、eshell-prefer-lisp-functionsをtに設定します。

これはバグですか?私はドキュメントが逆になっているのではないかと思ったので、変数をtに設定してみましたが、動作は同じで、/ binのバージョンではなくeshell実装を取得し続けます。


問題はにあるのでしょうかwhich。あなたがするならrm --version、あなたは何を得るのですか?
zck

@zck私は/ bin / rmから取得するものを取得します、これを調査し始めた全体の理由は、すべてのemacsをフリーズさせ、eshellバージョンを使用していることを示す大きなディレクトリをrmしたためです。eshellバージョンは、互換性のために認識されない引数に遭遇するとシステムバージョンにフォールバックすると思います。そのため、coreutilsのrmバージョン情報を出力するという事実は実際には誤解を招くものであり、eshellバージョンを使用しています。
Joseph Garvin、2015

まあ、それは混乱しています。もっとお役に立てれば幸いです。
zck

優先設定に依存する代わりに、ダイレクトコマンドを使用しないのはなぜですか?次に例を示します$ *rm filename。開始*するとeshell、組み込みコマンドの検索がスキップされます。この方法は、優先設定に関係なく、組み込みコマンドをバイパスするのに役立ちます。
Emacsユーザー

回答:


4

Eshellは常にLisp関数を優先します。eshell-prefer-lisp-functionsの解釈にのみ影響し、の解釈には影響し*rmませんrm

ソース:ソースコード…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-functioneshell/接頭辞の下で関数を検索します。にも同様のロジックがありeshell/whichます。

変数のドキュメントはまったく誤解を招くものであり、マニュアルもかなり誤解を招くものです。動作は仕様によるものだと思うので(結局、eshell関数を使用しないのに、なぜ定義するのでしょうか)、それはドキュメントのバグです。

外部ユーティリティを呼び出すには、を呼び出す/bin/rmか、eshell-prefer-lisp-functionsnilに設定したままの場合はを呼び出します*rm*。あなたがしたい場合rm:常に外部ユーティリティ呼び出すには、エイリアスを定義することができますalias rm "rm $*"(感謝のGDP2を)。


これはバグレポートであり、回答ではありません。応答を削除するか、実行可能なソリューションで修正します。
Emacsユーザー

2
Emacsユーザー:何の話ですか?問題は、「eshell-prefer-lisp-functionsがnilであるにもかかわらず、なぜeshellがlisp関数を好むのか」です。これはその質問に対する回答の100%です。
phils 2015

rm常に外部コマンドを呼び出す唯一の方法は、という関数がないことを確認することeshell/rmです(それ、またはもちろん、Eshellのコードの一部をアドバイスまたは再定義します)。」これrmが外部コマンドを呼び出す唯一の方法ではありません。マニュアルに記載されているように、あなたはポイントエイリアス作ることができるrmために*rm(も参照emacs.stackexchange.com/a/880/10761を)。
GDP2

@ギレス問題ありません。
GDP2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.