Tại sao eshell thích các hàm lisp ngay cả khi các hàm eshell-prefer-lisp-nil?


8

Nếu tôi khởi động emacs 24.5.2 bằng emacs -Qvà làm M-x eshell, thì hãy chạy:

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

Tôi nhận được phiên bản eshell. Nhưng nếu tôi C-h v eshell-prefer-lisp-functionsthấy giá trị là con số không. Tuy nhiên, các tài liệu nêu:

Nếu bạn muốn sử dụng các lệnh dựng sẵn thay vì các lệnh bên ngoài, hãy đặt các hàm eshell-prefer-lisp-lisp thành t.

Đây có phải là một lỗi? Tôi nghĩ rằng các tài liệu có thể bị ngược nên tôi đã thử đặt biến thành t, nhưng hành vi vẫn giữ nguyên, tôi tiếp tục thực hiện eshell thay vì phiên bản trong / bin.


Tôi tự hỏi nếu vấn đề là với which. Nếu bạn làm rm --version, bạn nhận được gì?
zck

@zck Tôi nhận được những gì tôi sẽ nhận được từ / bin / rm, nhưng toàn bộ lý do tôi bắt đầu điều tra điều này là do tôi đã tạo một thư mục lớn khiến tất cả các emacs bị đóng băng, cho biết nó sử dụng phiên bản eshell. Tôi tin rằng các phiên bản eshell dự phòng cho phiên bản hệ thống khi chúng gặp phải một đối số không được công nhận vì lợi ích tương thích, vì vậy tôi nghĩ rằng việc nó đưa ra thông tin phiên bản rm của coreutils thực sự gây hiểu lầm và nó đang sử dụng phiên bản eshell.
Joseph Garvin

Chà, thật khó hiểu. Chúc tôi có thể giúp nhiều hơn.
zck

Tại sao không sử dụng lệnh trực tiếp thay vì dựa vào cài đặt ưu tiên ? Ví dụ : $ *rm filename. Bắt đầu *sẽ eshellbỏ qua tìm kiếm các lệnh tích hợp. Phương pháp này hữu ích để bỏ qua các lệnh tích hợp cho dù cài đặt ưu tiên là gì .
Người dùng Emacs

Câu trả lời:


4

Eshell luôn thích các chức năng Lisp. eshell-prefer-lisp-functionschỉ ảnh hưởng đến việc giải thích *rmchứ không ảnh hưởng đến rm.

Nguồn: mã nguồn Từ From 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-functiontra cứu một chức năng dưới eshell/tiền tố. Có logic tương tự trong eshell/which.

Tài liệu của biến là hoàn toàn sai lệch và hướng dẫn cũng khá sai lệch. Tôi đoán hành vi là do thiết kế (sau tất cả, tại sao bạn lại xác định hàm eshell nếu không sử dụng nó?), Vì vậy đó là lỗi tài liệu.

Để gọi tiện ích bên ngoài, hãy gọi /bin/rm, hoặc, miễn là bạn eshell-prefer-lisp-functionsđặt thành không, gọi *rm*. Nếu bạn muốn rmluôn luôn gọi tiện ích bên ngoài, bạn có thể xác định bí danh: alias rm "rm $*"(cảm ơn GDP2 ).


Đây là một báo cáo lỗi, không phải là một câu trả lời. Xóa các phản hồi hoặc sửa đổi nó với một giải pháp khả thi.
Người dùng Emacs

2
Người dùng Emacs: Bạn đang nói về cái gì? Câu hỏi đặt ra là "Tại sao eshell thích các hàm lisp ngay cả khi các hàm eshell-prefer-lisp-nil?" và đây là 100% một câu trả lời cho câu hỏi đó.
phils

"Cách duy nhất để rmluôn luôn gọi lệnh bên ngoài là đảm bảo rằng không có chức năng nào được gọi eshell/rm. (Điều đó, hoặc tất nhiên là tư vấn hoặc xác định lại một số mã của Eshell.)" Đó không phải là cách duy nhất để thực hiện rmlệnh bên ngoài. Như tài liệu hướng dẫn, bạn có thể tạo một bí danh trỏ rmđến *rm(xem thêm emacs.stackexchange.com/a/880/10761 ).
GDP2

@Gilles Không có vấn đề.
GDP2
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.