把Vim打造成一個強大的IDE編輯工具

把Vim打造成一個強大的IDE編輯工具

1.實驗目的

通過配置把Vim打造成一個和Source Insight相媲美的IDE工具。

2.實驗步驟

Vim工具可以支持很多個性化的特性,並使用插件來完成代碼瀏覽和編輯的功能。使用過Source Insight的讀者也許會對如下功能讚歎有加。

  • 自動列出一個文件的函數和變量的列表。
  • 查找函數和變量的定義。
  • 查找哪些函數調用了該函數和變量。
  • 高亮顯示。
  • 自動補全。

這些功能在Vim裡都可以實現,而且比Source Insight高效和好用。本實驗將帶領讀者著手打造一個屬於自己的IDE編輯工具。

在打造之前先安裝git工具。

$ sudo apt-get install git

(1)插件管理工具Vundle

Vim支持很多插件,早期需要到每個插件網站上下載後複製到home主目錄的.vim目錄中才能使用。現在Vim社區有多個插件管理工具,其中Vundle就是很出色的一個,它可以在.vimrc中跟蹤、管理和自動更新插件等。

安裝Vundle需要使用git工具,通過如下命令來下載Vundle工具。

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

接下來需要在home主目錄下面的.vimrc配置文件中配置Vundle。

<.vimrc>
" Vundle manage
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype plugin indent on " required
/<.vimrc>

只需要在該配置文件中添加“Plugin xxx”,即安裝名為“xxx”的插件。

接下來就是在線安裝插件。啟動Vim,然後運行命令“:PluginInstall”,就會從網絡上下載插件並安裝。

(2)ctags工具

ctags工具全稱Generate tag files for source code。它掃描指定的源文件,找出其中包含的語法元素,並把找到的相關內容記錄下來,這樣在代碼瀏覽和查找時就可以利用這些記錄實現查找和跳轉功能。ctags工具已經被集成到各大Linux發行版中。在優麒麟Linux中使用如下命令安裝ctags工具。

$ sudo apt-get install ctags

在使用ctags之前需要手工生成索引文件。

$ ctags –R . //遞歸掃描源代碼根目錄和所有子目錄的文件並生成索引文件

上述命令會在當前目錄下面生成一個tags文件。啟動Vim之後需要加載這個tags文件,可以通過如下命令實現這個加載動作。

:set tags=tags

ctags常用的快捷鍵如表2.7所示。

把Vim打造成一個強大的IDE編輯工具


(3)cscope工具

剛才介紹的ctags工具可以跳轉到標籤定義的地方,但是如果想查找函數在哪裡被調用過或者標籤在哪些地方出現過,那麼ctags就無能為力了。cscope工具可以實現上述功能,這也是Source Insight強大的功能之一。

cscope最早由貝爾實驗室開發,後來由SCO公司以BSD協議公開發布。我們可以在優麒麟Linux發行版中安裝它。

$ sudo apt-get install cscope

在使用cscope之前需要對源代碼生成索引庫,可以使用如下命令來實現。

$ cscope -Rbq

上述命令會生成3個文件:cscope.cout、cscope.in.out和cscope.po.out。其中cscope.out是基本符合的索引,後面兩個文件是使用“-q”選項生成的,用於加快cscope索引的速度。

在Vim中使用cscope非常簡單,首先調用“cscope add”命令添加一個cscope數據庫,然後調用“cscope find”命令進行查找。Vim支持8種cscope的查詢功能。

  • s:查找C語言符號,即查找函數名、宏、枚舉值等出現的地方。
  • g:查找函數、宏、枚舉等定義的位置,類似ctags所提供的功能。
  • d:查找本函數調用的函數。
  • c:查找調用本函數的函數。
  • t:查找指定的字符串。
  • e:查找egrep模式,相當於egrep功能,但查找速度快多了。
  • f:查找並打開文件,類似Vim的find功能。
  • i:查找包含本文件的文件。

為了方便使用,我們可以在.vimrc配置文件中添加如下快捷鍵。

"-----------------------------------------------------------
" cscope:建立數據庫:cscope -Rbq; F5 查找c符號; F6 查找字符串; F7 查找函數定義; F8 查找函數誰調用了
"-----------------------------------------------------------
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out

endif
set csverb
endif
:set cscopequickfix=s-,c-,d-,i-,t-,e-
"nmap s :cs find s =expand("<cword>")
"F5 查找c符號; F6 查找字符串; F7 查找函數誰調用了
nmap <silent> :cs find s =expand("<cword>")
nmap <silent> :cs find t =expand("<cword>")
nmap <silent> :cs find c =expand("<cword>")
/<cword>
/<silent>
/<cword>
/<silent>
/<cword>
/<silent>
/<cword>

上述定義的快捷鍵如下。

  • F5:查找C語言符號,即查找函數名、宏、枚舉值等出現的地方。
  • F6:查找指定的字符串。
  • F7:查找調用本函數的函數。

(4)Tagbar插件

Tagbar插件可以把源代碼文件生成一個大綱,包括類、方法、變量以及函數名等,可以選中並快速跳轉到目標位置。

安裝Tagbar插件,在.vimrc文件中添加:

Plugin 'majutsushi/tagbar' " Tag bar"

然後重啟Vim,輸入並運行命令“:PluginInstall”完成安裝。

配置Tagbar插件,可以在.vimrc文件中添加如下配置。

" Tagbar
let g:tagbar_width=25
autocmd BufReadPost *.cpp,*.c,*.h,*.cc,*.cxx call tagbar#autoopen()

上述配置可讓打開常見的源代碼文件時會自動打開Tagbar插件。

(5)文件瀏覽插件NerdTree

NerdTree插件可以顯示樹形目錄。

安裝NerdTree插件,在.vimrc文件中添加:

Plugin 'scrooloose/nerdtree'

然後重啟Vim,輸入並運行命令“:PluginInstall”完成安裝。

配置NerdTree插件。

" NetRedTree
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
let NERDTreeWinSize=15
let NERDTreeShowLineNumbers=1
let NERDTreeAutoCenter=1
let NERDTreeShowBookmarks=1

(6)動態語法檢測工具

動態語法檢測工具可以在編寫代碼的過程中檢測出語法錯誤,不用等到編譯或者運行,這個工具對編寫代碼者非常有用。本實驗安裝的是被稱為ALE(Asynchronization Lint Engine)的一款實時代碼檢測工具。ALE工具在發現有錯誤的地方會實時提醒,在Vim的側邊會標註哪一行有錯誤,光標移動到這一行時下面會顯示錯誤的原因。ALE工具支持多種語言的代碼分析器,比如C語言可以支持gcc、clang等。

安裝ALE工具,在.vimrc文件中添加:

Plugin 'w0rp/ale'

然後重啟Vim,輸入並運行命令“:PluginInstall”完成安裝。這個過程需要從網絡上下載代碼。

插件安裝完成之後,做一些簡單的配置,增加如下配置到.vimrc文件中。

let g:ale_sign_column_always = 1
let g:ale_sign_error = '✗'
let g:ale_sign_warning = 'w'
let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK']
let g:ale_echo_msg_format = '[%linter%] %code: %%s'
let g:ale_lint_on_text_changed = 'normal'
let g:ale_lint_on_insert_leave = 1
let g:ale_c_gcc_options = '-Wall -O2 -std=c99'
let g:ale_cpp_gcc_options = '-Wall -O2 -std=c++14'
let g:ale_c_cppcheck_options = ''
let g:ale_cpp_cppcheck_options = ''

我們用ALE工具編寫一個簡單的C程序,如圖1.4所示。

Vim左邊會顯示錯誤或者警告的提示,其中“w”表示警告,“x”表示錯誤。圖2.4所示的第3行出現了一個警告,這是gcc編譯器發現變量i定義了但並沒有使用。

(7)自動補全插件YouCompleteMe

代碼補全功能在Vim發展歷史中是一個比較弱的功能,因此一直被使用Source Insight的人詬病。早些年出現的自動補全插件如AutoComplPop、Omnicppcomplete、Neocomplcache等在效率上低得驚人,特別是把整個Linux內核代碼添加到工程時,要使用這些代碼補全功能,每次都要等待1~2分鐘的時間,簡直讓人抓狂。


把Vim打造成一個強大的IDE編輯工具

圖1.4 ALE工具


YouCompleteMe插件是最近幾年才出現的新插件,它利用clang為C/C++代碼提供代碼提示和補全功能。藉助clang的強大功能,YouCompleteMe的補全效率和準確性極高,可以和Source Insight一比高下。因此,Linux開發人員在Vim上配備了YouCompleteMe插件之後完全可以拋棄Source Insight。

在安裝YouCompleteMe插件之前,需要保證Vim的版本必須高於7.4.1578,並且支持Python 2或者 Python 3。優麒麟Linux 16.04的版本中的Vim滿足這個要求,使用其他發行版的讀者可以用如下命令來檢查。

$ vim –version

安裝YouCompleteMe插件,可在.vimrc文件中添加:

Plugin 'Valloric/YouCompleteMe'

然後重啟Vim,輸入並運行命令“:PluginInstall”完成安裝。這個過程從網絡中下載代碼,需要等待一段時間。

插件安裝完成之後,需要重新編譯它,所以在編譯之前需要保證已經安裝如下軟件包。

$ sudo apt-get install build-essential cmake python-dev python3-dev

接下來進入YouCompleteMe插件代碼進行編譯。

$ cd ~/.vim/bundle/YouCompleteMe
$ ./install.py --clang-completer

--clang-completer表示對C/C++的支持。

編譯完成之後,還需要做一些配置工作,把~/.vim/bundle/YouCompleteMe/third_party/ ycmd/examples/.ycm_extra_conf.py這個文件複製到~/.vim目錄下面。

$ cp 
~/.vim/bundle/YouCompleteMe/third_party/ycmd/examples/.ycm_extra_ conf.py
~/.vim

在.vimrc配置文件中還需要添加如下配置。

let g:ycm_server_python_interpreter='/usr/bin/python'
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'

這樣就完成了YouCompleteMe插件的安裝和配置。

下面做一個簡單測試。首先啟動Vim,輸入“#include <stdio>”檢查是否會出現提示補全,如圖2.5所示。/<stdio>


把Vim打造成一個強大的IDE編輯工具

圖1.5 代碼補全測試


(8)自動索引

在舊版本的Vim中是不支持異步模式的,因此每次寫一部分代碼需要手動運行ctags命令來生成索引,這是Vim的一大痛點。這個問題在Vim 8之後得到了改善。下面推薦一個可以異步生成tags索引的插件,這個插件稱為vim-gutentags。

安裝vim-gutentags插件。

Plugin 'ludovicchabant/vim-gutentags'

重啟Vim,輸入命令“:PluginInstall”完成安裝,這個過程需要從網絡中下載代碼。

對插件進行一些簡單配置,將以下內容添加到.vimrc文件中。

" 搜索工程目錄的標誌,碰到這些文件/目錄名就停止向上一級目錄遞歸
let g:gutentags_project_root = ['.root', '.svn', '.git', '.hg', '.project']
" 配置 ctags 的參數
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']

當我們修改了一個文件時,vim-gutentags會在後臺默默幫助我們更新tags數據索引庫。

(9)vimrc的其他一些配置

vimrc還有一些其他常用的配置,如顯示行號等。

set nu! " 顯示行號
syntax enable
syntax on
colorscheme desert
:set autowrite " 自動保存

(10)使用Vim來閱讀Linux內核源代碼

我們已經把Vim打造成一個媲美Source Insight的IDE工具了。下面介紹如何閱讀Linux內核源代碼。

下載Linux內核官方源代碼或者runninglinuxkernel的源代碼。

git clone https://github.com/figozhang/runninglinuxkernel_4.0.git

Linux內核已經支持ctags和cscope來生成索引文件,而且會根據編譯的config文件選擇需要掃描的文件。我們使用make 命令來生成ctags和cscope,下面以ARM vexpress平臺為例進行介紹。

$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-linux-gnueabi-
$ make vexpress_defconfig
$ make tags cscope TAGS //生成tags,cscope, TAGS等索引文件

啟動Vim,通過“:e mm/memory.c”命令打開memory.c源文件,然後在do_anonymous_page()函數即在第2563行上輸入“vma->”,會發現Vim自動出現了struct vm_area_struct數據結構的成員供你選擇,而且速度快得驚人,如圖2.6所示。


把Vim打造成一個強大的IDE編輯工具

圖1.6 在Linux內核代碼中嘗試代碼補全


另外,我們在do_anonymous_page()函數的第2605行的page_add_new_anon_rmap()上按F7快捷鍵,會發現很快查找到了Linux內核中所有調用該函數的地方,如圖2.7所示。


把Vim打造成一個強大的IDE編輯工具

圖1.7 查找哪些函數調用了page_add_new_anon_rmap()

把Vim打造成一個強大的IDE編輯工具


EDN

喜歡的話,請轉發到朋友圈


分享到:


相關文章: