Mengapa eshell lebih memilih fungsi lisp bahkan ketika fungsi eshell-prefer-lisp-nihil?

8

Jika saya memulai emacs -Qdan M-x eshellmenjalankan emacs 24.5.2 , maka jalankan:

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

Saya mendapatkan versi eshell. Tetapi jika saya C-h v eshell-prefer-lisp-functionsmelihat nilainya nihil. Namun dokumentasi menyatakan:

Jika Anda lebih suka menggunakan perintah bawaan daripada perintah eksternal, atur fungsi eshell-prefer-lisp-t ke t.

Apakah ini bug? Saya pikir dokumen mungkin mundur jadi saya mencoba mengatur variabel t, tetapi perilaku tetap sama, saya terus mendapatkan implementasi eshell daripada versi di / bin.

Joseph Garvin
sumber
Saya ingin tahu apakah masalahnya ada pada which. Jika Anda melakukannya rm --version, apa yang Anda dapatkan?
Zck
@zck Saya mendapatkan apa yang akan saya dapatkan dari / bin / rm, tetapi seluruh alasan saya mulai menyelidiki ini adalah karena saya rm akan direktori besar yang menyebabkan semua emacs membeku, menunjukkan itu menggunakan versi eshell. Saya percaya versi eshell mundur ke versi sistem ketika mereka menemukan argumen yang tidak diakui demi kompatibilitas, jadi saya pikir fakta bahwa ia menampilkan info versi rm coreutils sebenarnya menyesatkan, dan menggunakan versi eshell.
Joseph Garvin
Nah, itu membingungkan. Seandainya aku bisa membantu lebih banyak.
Zck
Mengapa tidak menggunakan perintah langsung bukan mengandalkan lebih memilih pengaturan? Sebagai contoh: $ *rm filename. Memulai *akan membuat eshelllompatan mencari perintah bawaan. Metode ini berguna untuk mem-bypass perintah bawaan, apa pun pengaturan yang diinginkan .
Pengguna Emacs

Jawaban:

4

Eshell selalu lebih suka fungsi Lisp. eshell-prefer-lisp-functionshanya mempengaruhi interpretasi *rm, bukan interpretasi rm.

Sumber: kode sumber ... Dari 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-functionmencari fungsi di bawah eshell/awalan. Ada logika serupa di eshell/which.

Dokumentasi variabel itu benar-benar menyesatkan, dan manualnya juga agak menyesatkan. Saya kira perilaku ini berdasarkan desain (setelah semua, mengapa Anda mendefinisikan fungsi eshell jika tidak menggunakannya?), Jadi ini adalah bug dokumentasi.

Untuk menjalankan utilitas eksternal, panggil /bin/rm, atau, asalkan Anda dibiarkan eshell-prefer-lisp-functionstidak ada, panggil *rm*. Jika Anda ingin rmselalu menjalankan utilitas eksternal, Anda dapat menetapkan alias: alias rm "rm $*"(terima kasih GDP2 ).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ini adalah laporan bug, bukan jawaban. Hapus respons atau ubah dengan solusi yang bisa diterapkan.
Pengguna Emacs
2
Pengguna Emacs: Apa yang Anda bicarakan? Pertanyaannya adalah "Mengapa eshell lebih suka fungsi lisp bahkan ketika fungsi eshell-prefer-lisp-adalah nihil?" dan ini adalah 100% jawaban untuk pertanyaan itu.
phils
"Satu-satunya cara untuk membuat rmselalu memohon perintah eksternal adalah untuk memastikan bahwa tidak ada fungsi yang disebut eshell/rm. (Itu, atau tentu saja menasihati atau mendefinisikan ulang beberapa kode Eshell.)" Itu bukan satu-satunya cara untuk membuat rmmemohon perintah eksternal. Seperti yang didokumentasikan dalam manual, Anda dapat membuat alias yang menunjuk rmke *rm(lihat juga emacs.stackexchange.com/a/880/10761 ).
GDP2
@Gilles Tidak masalah.
GDP2