2011-07-21 10 views
6

Tôi đã sử dụng chế độ ido trong vài tháng, với tính năng ido-everywhere được bật và thường khá hài lòng với nó. Có một điều tôi ước mình có thể thay đổi. Khi tôi nhập C-u M-x shell để tạo bộ đệm vỏ mới có tên cụ thể, ido cung cấp cho tôi danh sách hoàn chỉnh tất cả các bộ đệm mở của tôi. Nếu tôi chọn một, một trình bao mới được khởi chạy trong bộ đệm đó và nó được đưa vào chế độ shell, bất kể nó chứa gì. Thật khó để tưởng tượng một trường hợp sử dụng hữu ích cho việc này.Tắt chế độ ido cho các lệnh cụ thể?

Có cách nào để tắt chế độ ido cho lệnh trình bao không? (Cũng như bất kỳ lệnh tương tự nào khác mà tôi có thể vấp ngã trong tương lai, tất nhiên.)

+0

Tôi biết rằng đối với một số lệnh, sử dụng phím tắt cuối cùng hai lần vô hiệu hóa tạm thời ido (ví dụ, để mở tệp, 'Cx Cf Cf' sử dụng giao diện mở tệp cổ điển trong minibuffer) nhưng tôi không ' t biết với lệnh 'Mx'. – Seki

Trả lời

5

Heh, hóa ra bạn sẽ nhận được các lựa chọn hoàn thành tương tự cho dù bạn đã bật kích hoạt ido-everywhere hay chưa.

Không có cách tích hợp để thực hiện những gì bạn muốn. ido-mode chỉ cung cấp móc để bạn có thể ghi đè hành vi find-file được thực hiện qua ido hay không. read-buffer hiện tại là luôn là bị ghi đè bởi ido-everywhere.

May mắn thay, một chút Emacs lisp có thể có được những gì bạn muốn:

(put 'shell 'ido 'ignore) 
(defadvice ido-read-buffer (around ido-read-buffer-possibly-ignore activate) 
    "Check to see if use wanted to avoid using ido" 
    (if (eq (get this-command 'ido) 'ignore) 
     (let ((read-buffer-function nil)) 
     (run-hook-with-args 'ido-before-fallback-functions 'read-buffer) 
     (setq ad-return-value (apply 'read-buffer (ad-get-args 0)))) 
    ad-do-it)) 

Và đối với bất kỳ lệnh khác mà bạn không muốn sau ido-everywhere để lựa chọn đệm có thể được tùy chỉnh bằng cách thêm một biểu thức mới vào trình duyệt. emacs:

(put 'other-command-i-want-untouched 'ido 'ignore) 
+1

Tuyệt vời, cảm ơn! – Sean

+2

... Mặc dù điều này không hoàn toàn hoạt động như được viết, như tôi đã phát hiện sau. Bạn phải nói '(setq ad-return-value (áp dụng 'read-buffer (ad-get-args 0)))' thay vì chỉ '(áp dụng' read-buffer (ad-get-args 0))'. – Sean

+0

@Sean duh, tôi chỉ kiểm tra xem liệu việc hoàn thành có thay đổi hay không, tôi đã quên thực sự sử dụng nó. Cảm ơn, tôi đã cập nhật câu trả lời. –