2011-08-11 14 views
20

最近、私はM-x ielm(Emacsのself-REPL)を発見しました。このモードでは正常に動作していることにうれしく思いました。さて、私はecb-を入力してからTABを打つと、ielmはどのような機能がECBによって公開されているかを私に見せてくれるでしょう。探検に非常に便利です!Emacs-Lispモードでの自動補完

しかし、*.elのファイル(Emacs Lispメジャーモード)の編集を開始すると、TABはオートコンプリートとして機能しなくなり、インデントが実行されてしまいますが、残念です。

ielmの中でオートコンプリートがどのように働いているのかを、Emacs Lispモードに移植する方法を考えました。しかし、明らかに、ielmで自動補完は限り私は理解して、唯一のcomintベースのバッファに働く、comint-dynamic-completeを使用しています。私は、ここに運が出ていないことを意味します。

Emacs Lispのオートコンプリートを有効にするにはどうすればよいですか?

答えて

28

、あなたはTAB補完を可能に組み込み機能のあまり知られていない部分を使用することができますモードの設定に従ってインデントを調整しますが、インデントがすでに正しい場合は、完了がトリガーされます。これは通常望ましい動作であり、IMHOはsmart-tabのようなサードパーティのプラグインよりも優れています。しかし、いくつかのモードでは、TABindent-for-tab-commandにバインドされていないので、これらのモードにはさらにリビルドが必要であることに注意してください。 smart-tabとなります。また、モードが「バウンスインデント」(例えば、python-mode)を有する場合、この技法も機能しない。

2

私はいつでもインデントと完了の両方が参考ので、私は私がやった最後のものは、テキストを挿入されたか否かに基づいて選択した機能を持っている:

(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))) 

おそらくcomint-dynamic-completeの代わりdabbrevを使用することができますあなたはしたいが、私はdabbrevはlispのemacsのための偉大な動作することを発見した場合 - でもf-f-r-ofind-file-read-onlyにを拡張することができcompleter.el、と組み合わせる場合は特に。 - 通常indent-for-tab-commandにバインドされている - 最初の試行この設定で

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

TAB:Emacsの最近のバージョンで

+0

スマートなアイデア。インデントしたかったときに誤って補完を呼び出すことは決して良いことではありません。 – phils