2011-08-11 37 views
20

Gần đây tôi đã phát hiện M-x ielm (Emacs self-REPL) và ngạc nhiên rằng có một tab làm việc hoàn thành trong chế độ đó. Giả sử, tôi có thể bắt đầu nhập ecb-, sau đó nhấn TAB và ielm sẽ cho tôi biết các chức năng nào được ECB trưng ra. Rất thuận tiện cho việc khám phá!emacs - tự động hoàn thành trong chế độ Emacs Lisp

Tuy nhiên, khi tôi bắt đầu chỉnh sửa một trong các tệp *.el của tôi (trong chế độ chính của Emacs Lisp), TAB không còn hoạt động như tự động hoàn thành và thực hiện thụt đầu dòng mà tôi thấy không may.

Tôi đã cố gắng tìm hiểu cách tự động hoàn thành hoạt động trong phạm vi ielm để có thể ghép nó vào chế độ Emacs Lisp. Tuy nhiên, rõ ràng, tự động hoàn thành trong ielm sử dụng comint-dynamic-complete, theo như tôi hiểu, chỉ hoạt động trong bộ đệm dựa trên comint. Tôi đoán, điều này có nghĩa là tôi không may mắn ở đây.

Vì vậy, tốt, làm cách nào để bật tự động hoàn thành cho Emacs Lisp?

Trả lời

28

Trong các phiên bản gần đây của Emacs, bạn có thể sử dụng một phần ít được biết đến chức năng built-in cho phép hoàn TAB:

(setq tab-always-indent 'complete) 
(add-to-list 'completion-styles 'initials t) 

Với thiết lập này, TAB - mà thường là ràng buộc để indent-for-tab-command - cố gắng đầu tiên để điều chỉnh thụt đầu dòng theo cài đặt của chế độ, nhưng nếu thụt đầu dòng đã chính xác, quá trình hoàn thành sẽ được kích hoạt. Đây thường là hành vi mong muốn và IMHO hoạt động tốt hơn các plugin của bên thứ ba như smart-tab.

Lưu ý, tuy nhiên, ở một số chế độ, TAB không bị ràng buộc với indent-for-tab-command, vì vậy việc khôi phục thêm là cần thiết cho các chế độ đó, ví dụ: với smart-tab. Ngoài ra, khi các chế độ có "thụt lề thư bị trả lại" (ví dụ: python-mode), kỹ thuật này cũng sẽ không hoạt động.

2

tôi tìm thấy cả hai thụt và hoàn thành hữu ích vào những thời điểm, vì vậy tôi có một chức năng mà sẽ lựa chọn dựa trên việc điều cuối cùng tôi đã làm được chèn văn bản hay không:

(global-set-key [tab] 'indent-or-expand) 
(defun indent-or-expand() 
    "Either indent according to mode, or expand the word preceding point." 
    (interactive) 
    (if (or 
     (eq last-command 'self-insert-command) 
     (eq last-command 'dabbrev-expand)) 
     (progn 
     (setq this-command 'dabbrev-expand) 
     (dabbrev-expand nil)) 
    (indent-according-to-mode))) 

Bạn có thể sử dụng comint-dynamic-complete thay vì dabbrev nếu bạn muốn, nhưng tôi thấy rằng dabbrev hoạt động tốt cho các emacs lisp - đặc biệt khi kết hợp với completer.el, có thể mở rộng ngay cả f-f-r-o thành find-file-read-only.

+0

Ý tưởng thông minh. Vô tình gọi hoàn thành khi bạn chỉ muốn thụt lề không bao giờ là một điều tốt. – phils

Các vấn đề liên quan