2010-01-20 82 views
27

似乎有許多可選的Emacs自動完成機制。沒有詳盡的搜索,就會想到以下內容:ido,自動完成,冰柱,緩衝區完成,minibuffer完成和標準開箱即用完成。然後是代碼完成。很多。其中很大一部分依賴於語言。擁有一個Emacs guru(或三個)可以非常有用地總結主要參與者在代碼和非代碼自動完成方面的優勢。這就是堆棧溢出,不言而喻,確定最適合Emacs IDE類機制的自動完成模式將是一件好事。理解Emacs完成模式選項

更新:我剛剛發現the Emacs Wiki completion page,放大我的基本問題:所有這些選擇,什麼是好,什麼是不太好的,如果你只能用2-3打,你會建議?

回答

7

我通常使用兩個完成包(除了minibuffer和comint緩衝區中的內置TAB完成之外)。 (提示TAB)接受。通過查看詞頻來做出選擇。我喜歡這個,因爲它可以完成什麼的視覺指示 - 但它大多隻適用於一個完成。

hippie-expand - 它通常綁定到M-/代替dabbrev,因爲它可以完成所有的dabbrev和更多功能。當你可能需要循環一些選擇,或者如果你想完成一個文件名或其他的東西時,這很有效。

我喜歡這兩個,因爲它們不需要任何鼠標移動並且可以快速工作。

4

我在minibuffer中使用文件名的標準選項卡完成,M-x命令和其他東西。

我還經常使用M-/ keystroke(dabbrev-expand)動態完成任何Emacs緩衝區中的任何單詞。這太棒了,特別是對於長變量名稱。下面是文檔:

 
M-/ runs the command dabbrev-expand, which is an interactive 
autoloaded Lisp function in `dabbrev.el'. 

It is bound to M-/. 

(dabbrev-expand ARG) 

Expand previous word "dynamically". 

Expands to the most recent, preceding word for which this is a prefix. 
If no suitable preceding word is found, words following point are 
considered. If still no suitable word is found, then look in the 
buffers accepted by the function pointed out by variable 
`dabbrev-friend-buffer-function'. 

A positive prefix argument, N, says to take the Nth backward *distinct* 
possibility. A negative argument says search forward. 

If the cursor has not moved from the end of the previous expansion and 
no argument is given, replace the previously-made expansion 
with the next possible expansion not yet tried. 

The variable `dabbrev-backward-only' may be used to limit the 
direction of search to backward if set non-nil. 

See also `dabbrev-abbrev-char-regexp' and C-M-/. 
4

你可以看一下公司的模式或自動完成包,可能使用不同的完成源,包括CEDET,而且他們還允許定義新建成的來源...... 對於一些編程語言,你可以直接使用CEDET ...

+2

你可能是指http://cx4a.org/software/auto-complete/index.html,奇怪的是沒有人提到它。這是我的經驗中最好的。 – VitoshKa 2012-01-20 14:36:05

+0

是的,我的意思是這個軟件包 - 我總是忘記哪個包含' - '符號而不是;-) – 2012-01-20 18:42:27

8

WRT Icicles -

在大多數情況下,冰柱大約小緩衝區完成。有幾種情況提供了緩衝區內(例如代碼)完成的功能,但主要是關於小型緩衝區的完成。

當大多數人想到minibuffer完成時,他們會考慮文件名完成,緩衝區名稱完成和命令名完成。但它更多的是lot

作爲一名Emacs-Lisp編程人員,您可以在任何想要以交互方式向用戶提供選擇的地方使用完成功能。這很一般!

完成實際上是關於模式匹配來定義集合,然後您可以操作。大多數人認爲minibuffer完成的唯一目的是選擇一個名稱(文件,緩衝區,命令,變量,...)。但是完成的力量實際上是以不同的方式過濾並且可能對整套文件名,緩衝區名稱等進行排序,然後讓用戶對結果設置(不一定是單個對象) 。

這就是冰柱大概是:讓你動態(增量)使用定義設置模式匹配,然後在選定的成員還是那些集的所有成員採取行動。

這與其說的目的或其它完成封裝,頭盔(任何)可能是個例外。

不像Helm (Anything),其權限對象在對象類型和行動爲出發點,在冰柱你通常調用命令做一些到給定類型的一個或多個對象(例如,緩衝區),然後然後您縮小這些對象的集合,通常通過名稱匹配。在冰柱中經常出現這種情況,您可以在同一命令中以多種但相關的方式處理這些對象。

頭盔(任何),在一般的輸入是通過對象名稱第一個匹配的對所有類型的對象的整個宇宙,後來你縮小挑選一些操作(一個或多個)來執行。

最後,請記住,各種完成方法都爲最終用戶提供了某些內容(例如命令),併爲程序員提供了某些內容(例如完成功能)。

如果你正在做代碼完成那麼你一般只想完成名稱。有關代碼完成的主要問題是確定合適的候選人是什麼。爲此,文本(例如代碼)上下文通常是非常重要的。爲了提供明智的選擇,完成功能需要分析上下文(代碼),包括任何包含的上下文(例如項目代碼)。

另一方面,Minibuffer完成可用於任何種類的選擇和操作,包括具有多個操作的多項選擇。在這裏,所有的部分都很有趣:提供什麼候選人,你可以用他們做什麼等等。

不知道是否有幫助,但這是我的反應。