1. 程式人生 > >將Emacs打造成閱讀原始碼的神器

將Emacs打造成閱讀原始碼的神器

Start

Emacs是一個功能相對較多而且很複雜的text­editor,所以想要熟練使用必須要對emacs的一些基本概念進行了解,了解這些概念最好的教程就是emacs自帶的 “Emacs Tutorial“。可以通過點選選單欄的Help->Emacs Tutorial(choose language)進行學習。

將Emacs打造成舒適的程式碼閱讀器

要想將Emacs打造成舒適的程式碼閱讀環境除了需要Emacs本體之外,還需要幾種插 件來幫助我們實現這個願望。Emacs是一種擴充套件性很強的編輯器,並且定義了一種 elisp語言來專門配置Emacs並開發新的功能。我們為將emacs打造成程式碼閱讀器所 需要的外掛主要有 CEDET,ECB以及CSCOPE,下面分別介紹一下這幾個外掛的作用。

CEDET

cedet是一堆完全用elisp實現的emacs工具的集合。包含了很多的功能,這個外掛 的主要目的是為Emacs提供基礎功能的支援以使其變成變成類似Eclipse或VS系列 這樣的高階開發環境。

ECB

ECB是“Emacs Code Browser”的簡稱,從其名字就可以看出這個外掛的作用是將 Emacs變成一
個程式碼瀏覽器。使用了ECB之後的效果可見下圖。
ecb

CSCOPE

Cscope 是一款開源免費的 C/C++瀏覽工具,自帶一個基於文字的使用者介面,通過 cscope可以很方便地找到某個函式或變量的定義位置、被呼叫的位置等資訊。 Cscope對 C /C++支援較好,也可以自己定製來支援Java和Perl、Python等指令碼語 言。所以CSCOPE是一個為程式碼瀏覽提供基礎功能的程式,這個程式並不是為了 Emacs而專門開發的,因此要想在Emacs上使用這個程式需要在Emacs中安裝外掛調 用CSCOPE提供的功能。

安裝

接下來介紹這些外掛的安裝過程,首先CEDET的支援是直接包含在emacs中的並不 需要額外安裝,因此我們只要安裝ECB和CSCOPE就可以了。在介紹具體的安裝過程 之前先介紹下emacs的外掛配置過程。

Emacs的外掛配置

簡單地說Emacs的外掛配置主要有以下兩步,第一步是將外掛檔案拷貝到emacs的 外掛資料夾(預設是~資料夾下的.emacs.d/)中,第二部是在emacs的配置檔案 (~下的.emacs)中描述這個外掛的路徑loadpath)並啟用外掛。

ECB的安裝

https://github.com/alexott/ecb 下載ecb的tar檔案,解壓後將解壓出來的檔案 拷貝到.emacs.d中並編輯emacs配置檔案加入以下程式碼。注意將檔案的位置改成自 己的位置。

;;將ECB的路徑新增到讀取列表中
(add­to­list 'load­path "/home/augustus/.emacs.d/ecb­master")
;;告訴emacs啟用ecb
(require 'ecb)

儲存emacs配置檔案並重新啟動emacs就可以在選單欄的Tools­>Start Code Browser開啟ecb了。

CSCOPE的安裝

首先要在系統上安裝CSCOPE

sudo apt­get install cscope

然後去CSCOPE的官網http://cscope.sourceforge.net/ 下載原始碼包,並將其中的 xcscope.el拷貝到
loadpath包含的目錄裡。並在.emacs裡面加上

;;告訴emacs啟用cscope
(require 'xcscope)

至此,用emacs來閱讀c/c++原始碼所需要的工具包都安裝好了,當然用emacs來寫程式碼除錯程式碼都是很方便的,也有很多相關的外掛,但這已不在本文的範圍之內了。

CSCOPE使用方法

下面我們用bitvisor的原始碼為例展示一下用這套工具閱讀原始碼的強大之處。首先我們用配置好的emacs開啟vtmain.c檔案,然後在選單欄裡選擇Tools­>Start Code Browser(ECB)來開啟ECB,也可以使用M­x ‘ecb­activate來開啟ecb。並且可以看到選單欄裡出現了CSCOPE的選單,下面我就來一一介紹下CSCOPE提供的 這些功能都有什麼作用。

建立索引

首先CSCOPE對原始碼進行分析時需要對要分析的原始碼建立一個索引,否則就沒辦法 提供諸如程式碼跳轉之類的功能。通過在選單欄選擇Cscope­>Cscope Database­>Set Initial Dictionary設定程式碼的初始目錄,然後再選擇create list of files to index 並選擇一個目錄,這樣cscope就會對該目錄下的所有源 程式碼建立索引,也就意味著在你選擇的這個目錄範圍之內的所有原始碼都可以在你閱讀和分析的時候進行變量函式等內容的跳轉。

功能介紹

Find Symbol

我們以Find Symbol這個指令為例介紹下CSCOPE的使用,其他的指令和這個指令的 功能是類似的。如文字意思所述,這個指令提供的功能是在原始碼中搜索一個 Symbol,這個Symbol可以理解為變量,函式名稱,類名等有意義的符號。通過選 中想要查詢的內容然後選擇這個指令就可以在所有原始碼中搜索選中的這個符號了。 然後就會看到下圖的內容

function

CSCOPE給出了所有包含這個Symbol的檔案list, 只要點選滑鼠中鍵就可以檢視對應的那行程式碼了。當你看完程式碼想要回到跳轉之前的那段程式碼只要選擇Cscope選單裡的pop mark功能就好了。類似的功能有Find globaldefinition no prompting, Find text String, Find egrep pattern, Find a file等,都可以通過名字來判斷功能,使用方法上和Find Symbol是一樣 的。當然如果完全用滑鼠選擇這些功能的話效率是非常低下的,所以我們需要快 捷鍵來提高我們的工作效率, Emacs本身為這些功能定義好了一組快捷鍵,但是使 用起來一點都不方便,以Find Symbol為例他的快捷鍵是’C­c s s’,也就是說要按下Control+C 再按 s s才能完成這一功能,所以我們要改造Cscope的快捷鍵。

自定義快捷鍵

在emacs裡自定義快捷鍵是一件十分方便和快捷的事情,只要開啟.emacs檔案進行 設定就可以了,這裡我給出一段.emacs中設定快捷鍵的程式碼

;;將find­this­file功能繫結到Ctrl+F4上
(define­key global­map [(control f4)] 'cscope­find­this­file)
;;將find­this­symbol功能繫結到Ctrl+F5上
(define­key global­map [(control f5)] 'cscope­find­this­symbol)
(define­key global­map [(control f6)] 'cscope­find­this­text­string)
(define­key global­map [(control f7)] 'cscope­find­global­definition­no­prompting)
(define­key global­map [(control f8)] 'cscope­pop­mark)
(define­key global­map [(control f9)] 'cscope­prev­symbol)
(define­key global­map [(control f10)] 'cscope­next­symbol)
(define­key global­map [(control f11)] 'cscope­prev­file)
(define­key global­map [(control f12)] 'cscope­next­file)

這樣通過一番除錯和適應之後就能很快的學會Emacs看原始碼啦!