emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全
基于 Emacs 的 company 模式并配合 semantic 文法分析器,實現 Emacs 的 C/C++ 代碼自動補全。
關于 Emacs 的代碼自動補全
代碼自動補全的功能,對于使用 Emacs 寫代碼的程序員而言其重要性不言而喻的,但是搜了一些所謂的 “Emacs 完美的 C++ 自動補全” 的文章,絲毫也沒有感覺到美,反而只是讓我不斷的追憶 MS 的 Visual Stdio (.net) 的 C/C++ 代碼自動補全功能,所以干脆就只當沒這回事。一個本性就有些懶惰的人,最好不要面對太多容易令自己失望的東西。
"在 Emacs 下用 C/C++ 編程" 較為詳細地講述了使用 Emacs 內置的 hippie-expand 模式并配合 semantic 來解決 C/C++ 代碼自動補全問題。在我知道 company-mode 項目之前,個解決方案或許是最好的選擇了。實際上,我不滿意 hippie-expand + semantic 組合,主要是因為配置有些麻煩,并且補全的界面也有些丑陋。
Company-mode 是什么
Company-mode(Complete anything-mode)是 Emacs 的代碼自動補全擴展包,它的主要工作是配合許許多多的處理后端來實現比較方便并且清晰的代碼補全。可以在一份簡短的視頻中獲得對 company-mode 的直觀認識。
要使用 company-mode 來解決 Emacs 的 C/C++ 代碼自動補全問題,可選擇的處理后端(tag 工具)有 etags、gtags 和 semantic。由于我之前從未用過這些工具,所以只好對比了一些資料并依賴直覺選擇了 semantic,但愿未有選錯
如果面對的問題是 c/c++ 之外的代碼補全,那么 company-mode 擴展包中提供的那些后端或許可以滿足大部分需求了,這意味著不用像 C/C++ 那樣折騰。
安裝所需要的軟件包
炫耀一下我用的 gentoo 可以很方便地安裝 company-mode 和 semantic(當然你也有足夠的理由來炫耀你的系統):
$ echo "app-emacs/company-mode semantic" | sudo tee -a /etc/portage/package.use
$ sudo emerge company-mode
由于開啟了 company-mode 的 "semantic" USE 標識,會自動依賴安裝 cedet(它包含 semantic)。
配置,配置……很容易令人厭倦
要在 Emacs 中生活的好,前提是得好好學習,天天配置。我這個 Emacs 世界的窮人,卻每天都希望眼前不要出現那些括號套括號的代碼,大有窮且益堅之勢。
因為窮,所以也很容易感恩。Gentoo 在安裝 emacs 的擴展包之后,會在 /usr/share/emacs/site-gentoo.el 文件中自動添加所安裝擴展包的加載代碼,因此我可以在自己的 .emacs 配置文件中省卻類似以下的代碼:
(load "/usr/share/emacs/site-lisp/cedet/common/cedet" nil t)
(add-to-list 'load-path "/usr/share/emacs/site-lisp/company-mode")
(autoload 'company-mode "company" nil t)
真好。
下面,先來配置一下 semantic,目的是讓它可以幫助我們更好的分析出現在 Emacs 中的 C/C++ 代碼,從中提取出那些有用的 tag。將下面代碼寫入個人的 .emacs 配置文件中。
(setq semanticdb-default-save-directory "~/.emacs.d/semanticdb")
(semantic-load-enable-code-helpers)
上面的第 1 行代碼是設定 semantic 生成的 tag 文件保存目錄(請手動建立該目錄)。如果不設置這個目錄的話,據說 semantic 會將生成的 tag 文件放在當前的工作目錄。第 2 行代碼是設置 semantic 分析代碼文法的方式,據說共有 5 種級別的分析方式,詳見“在 Emacs 中使用 semantic”,對于 C/C++ 代碼自動補全問題而言,選擇 semantic-load-enable-code-helpers 沒錯。
配置完 semantic 之后,緊接著就是配置 company-mode 了,配置代碼只有一行:
(setq company-idle-delay t)
這行代碼是告訴 company-mode 擴展包,在彈出自動補全窗口之時莫要猶豫。如果不是很苛求自動補全窗口的彈出速度(假如你不認為 1 秒種有多么長),這行配置代碼完全可以不需要的。
這令人厭倦的配置工作終于做完了,好累
體驗一下 company-mode
現在,可以用 emacs 編輯一份 C 程序源文件,內容大致如下:
#include
typedef struct tagPoint {
double x;
double y;
double z;
} Point;
int main (void)
{
Point *pt = (Point *) malloc (sizeof (Point));
pt->x = 0.0;
pt->y = 0.0;
pt->z = 0.0;
return 0;
}
在打開 C 文件之后,需要使用 “M-x company-mode" 命令開啟 company-mode,這樣自動補全才可以工作。下面看看我在編輯代碼過程中的截圖:
感覺很舒服。所以再花點時間進一步配置一下。
只針對 C/C++ 的配置
因為只是想在 C/C++ 代碼編輯過程中啟用 company-mode 和 semantic,所以前面所講的配置雖然可以工作,但是有點鋪張浪費。可以利用 Emacs 的 hook 函數,將上述配置代碼插入 C/C++ 編輯模式中。這樣,只有在使用 Emacs 編輯 C/C++ 源文件時,有關 company-mode 和 semantic 的配置才會生效。
現在請冷酷將前面的配置代碼從 .emacs 文件中清除掉,換上下面稍微有點復雜的配置。
(add-hook 'c-mode-hook
(lambda ()
(setq semanticdb-default-save-directory "~/.emacs.d/semanticdb")
(semantic-load-enable-code-helpers)
(setq company-idle-delay t)
(company-mode)))
上述配置是針對 C 語言的模式。如果你是用 C++ 模式,那么就將 c-mode-hook 替換為 c++-mode-hook 吧。
上述配置代碼的作用是定義了一個匿名的 elisp 函數(lambda 函數),然后這個函數插入到 c-mode-hook 的函數列表中。當 Emacs 編輯 C 文件時,便會自動調用那個 lambda 函數,從而 semantic 和 company-mode 的一些設置代碼開始工作,最后并自動啟用 company 模式。
總結
以上是生活随笔為你收集整理的emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#版TXT文本分割器
- 下一篇: C++跨平台开发——SOCKET网络编程