我想,很多人都希望能夠在vim或者emacs中實現c++的自動補全,我個人也不例外。
折騰過ctags,etags,cscope,最後也折騰過cedet。說實話,cedet還是可以實現補全的,只是速度有點讓人難以忍受。
上面的幾種工具,都是通過對源**進行預處理,分析出其包含的**資訊。但是,大部分程式都是通過靜態分析**,這點在**或者標頭檔案頻繁變更的情況下,是非常讓人頭痛的事情。像visual stuido中**補全功能,基本上全是動態的,當頭檔案發生變化後,補全也會馬上跟著變化。
我們是否也能實現這樣的功能呢?
在clang這個llvm的c++前端出現之前,或許只能說遺憾了。靜態的ctags補全必須完全掃瞄所有的檔案,這樣的效率是不可以接受的。
不過現在有了clang,這為我們系提供了非常好的工具,來實現這個願望。
1. 不用說了,肯定是需要clang了。
clang需要自己編譯。由於我使用的是windows,所以,這裡有乙個我自己編譯的版本。
(wttr/prepend-to-exec-path "~/.emacs.d/extra-bin/clang")
2. auto-complete和auto-complete-clang.el
auto-complete是乙個非常好用的emacs擴充套件,而auto-complete-clang就是在這個擴充套件的基礎上完成的。所以兩者必須同時安裝:
這裡是我現在正在使用的auto-complete擴充套件,已經包含了clang。
首先是載入auto-complete擴充套件:
;; 載入auto-complete
(wttr/prepend-to-load-path "~/.emacs.d/plugins/auto-complete-1.3.1")
(require 'pos-tip)
(require 'auto-complete)
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/auto-complete-1.3.1/dict")
(ac-config-default)
(global-auto-complete-mode t)
;; 使用ctrl+enter按鍵觸發自動補全
(define-key ac-mode-map [(control return)] 'auto-complete)
下面設定auto-complete-clang
;; 載入clang
(require 'auto-complete-clang)
;; 新增c-mode和c++-mode的hook,開啟auto-complete的clang擴充套件
(defun wttr/ac-cc-mode-setup ()
(make-local-variable 'ac-auto-start)
(setq ac-auto-start nil) ;auto complete using clang is cpu sensitive
(add-hook 'c-mode-hook 'wttr/ac-cc-mode-setup)
(add-hook 'c++-mode-hook 'wttr/ac-cc-mode-setup)
新增系統標頭檔案的目錄,這點非常重要,clang就是通過ac-clang-flags這個變數中的設定,來正確找到所有的系統標頭檔案的。
但是請注意,不是新增標頭檔案,是新增標頭檔案的*目錄*。
其實,這個變數就是命令列中clang所能接受的引數,-ipath代表include這個path路徑作為系統標頭檔案路徑。-dsome表示定義some這個巨集。
我想使用過gcc的人都了解,這個是編譯器的命令列引數。
我使用windows下的mingw的標頭檔案路徑,所以設定如下:
(setq ac-clang-flags (list
"-ic:/mingw/include"
"-ic:/mingw/lib/gcc/mingw32/4.6.1/include"
"-ic:/mingw/lib/gcc/mingw32/4.6.1/include/c++"
"-ic:/mingw/lib/gcc/mingw32/4.6.1/include/c++/mingw32"
"-d__msvcrt__="))
好了,現在開啟乙個test.cpp檔案可以試一下,由於我的設定,補全通過ctrl-enter觸發。
不止能補全函式,還能補全引數,auto-complete是個非常好的框架。
ps:wttr開頭是所有的函式,是我自己定義的,可以參考這裡。
以上~
Emacs基本配置,自動補全
很久之前用過emacs不過也只是學習了一點點基本的命令。發現相對與vim來說命令方面確實不那麼好用,因為vim的命令相對比較簡單,emacs需要不少的組合按鈕。而且相對與vim來說emacs感覺比較重量級,這使得我後來放棄了對emacs的學習,也當作是給自己乙個不學的藉口吧。不過後來看了一些人的博文...
windows下clang的安裝與使用
然後編寫測試用的c 儲存為demo1.c include int main int argc,char ar 使用win r,切換到demo1.c的目錄下,然後執行clang verbose demo1.c會遇到錯誤 找不到stdio.件,之後我在網上搜尋了好久,比如這一篇文章 ld.exe unr...
mac lion下的emacs使用
1 lion下brew的安裝 2 使用brew安裝emacs及全屏設定 3 emacs類似source singht的語法高亮 4 cscope的安裝和配置 5 cedet的安裝 內容1 lion下brew的安裝 brew全名為homebrew,是mac os下的一套包管理軟體,類似ubuntu上的...