emacs下使用clang補全C

2021-06-04 00:18:33 字數 2436 閱讀 8657

我想,很多人都希望能夠在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上的...