首頁 > 軟體

將Vim改造為強大的IDE—Vim整合Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete

2020-06-16 17:22:13

1、安裝Vim和Vim基本外掛
首先安裝好Vim和Vim的基本外掛。這些使用apt-get安裝即可:
lingd@Ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc
其中vim-scripts是vim的一些基本外掛,包括語法高亮的支援、縮排等等。
vim中文幫助文件tar包下載地址:
http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
解壓後其中有個doc資料夾, 將其中的內容全部複製到~/.vim/doc, 或者vim安裝目錄下的doc目錄中, 此時vim中的help資訊已經是中文的了.
網頁版中文幫助文件網址http://vimcdoc.sourceforge.net/doc/help.html
首頁就時vim幫助文件的目錄,閱讀起來更方便有效、更有針對性!
 
2、Vim組態檔
Vim強大的功能,其來源基本上就兩個地方:Vim外掛以及Vim組態檔。
Vim本身的系統組態檔夾是在/usr/share/vim/和/etc/vim/兩個資料夾下。一般情況下,我們不會去改變這兩個資料夾下的組態檔,而是在使用者資料夾/home/user(其中,user為使用者名稱,我的使用者名稱是lingd)下建立自己的組態檔。進入使用者資料夾(/home/user/)之後,用gedit新建一個名叫.vimrc的檔案:
lingd@ubuntu:~/arm$ cd ~
lingd@ubuntu:~$ gedit .vimrc
註:使用gedit主要是為了方便大段大段的文字貼上!
然後把下面的文字拷貝進這個檔案之後儲存:

" This line should not be removed as it ensures that various options are
" properly set to work with the Vim-related packages available in Debian.
debian.vim

" Uncomment the next line to make Vim more Vi-compatible
" NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
" options, so any other options should be set AFTER setting 'compatible'.
set nocompatible

" Vim5 and later versions support syntax highlighting. Uncommenting the
" following enables syntax highlighting by default.
if has("syntax")
syntax on " 語法高亮
endif
colorscheme ron " elflord ron peachpuff default 設定配色方案,vim自帶的配色方案儲存在/usr/share/vim/vim72/colors目錄下

" detect file type
filetype on
filetype plugin on

" If using a dark background within the editing area and syntax highlighting
" turn on this option as well
set background=dark

" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'"") > 1 && line("'"") <= line("$") | exe "normal! g'"" | endif
"have Vim load indentation rules and plugins according to the detected filetype
filetype plugin indent on
endif

" The following are commented out as they cause vim to behave a lot
" differently from regular Vi. They are highly recommended though.

"set ignorecase " 搜尋模式裡忽略大小寫
"set smartcase " 如果搜尋模式包含大寫字元,不使用 'ignorecase' 選項。只有在輸入搜尋模式並且開啟 'ignorecase' 選項時才會使用。
set autowrite " 自動把內容寫回檔案: 如果檔案被修改過,在每個 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令時進行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令轉到別的檔案時亦然。
set autoindent " 設定自動對齊(縮排):即每行的縮排值與上一行相等;使用 noautoindent 取消設定
"set smartindent " 智慧對齊方式
set tabstop=4 " 設定製錶符(tab鍵)的寬度
set softtabstop=4 " 設定軟製表符的寬度
set shiftwidth=4 " (自動) 縮排使用的4個空格
set cindent " 使用 C/C++ 語言的自動縮排方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s "設定C/C++語言的具體縮排方式
"set backspace=2 " 設定退格鍵可用
set showmatch " 設定匹配模式,顯示匹配的括號
set linebreak " 整詞換行
set whichwrap=b,s,<,>,[,] " 游標從行首和行末時可以跳到另一行去
"set hidden " Hide buffers when they are abandoned
set mouse=a " Enable mouse usage (all modes) "使用滑鼠
set number " Enable line number "顯示行號
"set previewwindow " 標識預覽視窗
set history=50 " set command history to 50 "歷史記錄50條


"--狀態行設定--
set laststatus=2 " 總顯示最後一個視窗的狀態行;設為1則視窗數多於一個的時候顯示最後一個視窗的狀態行;0不顯示最後一個視窗的狀態行
set ruler " 標尺,用於顯示游標位置的行號和列號,逗號分隔。每個視窗都有自己的標尺。如果視窗有狀態行,標尺在那裡顯示。否則,它顯示在螢幕的最後一行上。

"--命令列設定--
set showcmd " 命令列顯示輸入的命令
set showmode " 命令列顯示vim當前模式

"--find setting--
set incsearch " 輸入字串就顯示匹配點
set hlsearch

註:組態檔中,以單個雙引號開頭的文字為註釋。
儲存檔案之後,啟動Vim。此時,Vim已經是這種效果了(語法高亮挺漂亮的–這個是由vim-scripts中的外掛支援的):

3、ctags安裝與設定
ctags可以建立原始碼樹的標籤索引(標籤就是一個識別符號被定義的地方,如函數定義),使程式設計師在程式設計時能迅速定位函數、變數、宏定義等位置去檢視原形
以下是在ubuntu下ctags的下載安裝和設定過程:
下載並安裝ctags,終端輸入命令
lingd@ubuntu:~/arm$ sudo apt-get install ctags
建立原始碼索引,比如我經常需要查閱Linux的核心程式碼,而這些程式碼放在/home/lingd/arm/linux-2.6.24.7目錄下
那麼在終端進入到該目錄後,輸入命令ctags -R *,你會發現多了一個tags檔案,這個就是索引檔案
lingd@ubuntu:~/arm$ cd linux-2.6.24.7
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch    crypto        include  kernel      mm              samples  usr
block    Documentation  init    lib          net            scripts
COPYING  drivers        ipc      MAINTAINERS  README          security
CREDITS  fs            Kbuild  Makefile    REPORTING-BUGS  sound
lingd@ubuntu:~/arm/linux-2.6.24.7$ ctags -R *
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch    crypto        include  kernel      mm              samples  tags
block    Documentation  init    lib          net            scripts  usr
COPYING  drivers        ipc      MAINTAINERS  README          security
CREDITS  fs            Kbuild  Makefile    REPORTING-BUGS  sound
向vim註冊索引檔案tags的路徑,
lingd@ubuntu:~/arm/linux-2.6.24.7$ vi ~/.vimrc
在開啟檔案的最後新增如下內容(當然,具體路徑根據你自己的情況)

"--ctags setting--
" 按下F5重新生成tag檔案,並更新taglist
map <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags "add current directory's generated tags file
set tags+=~/arm/linux-2.6.24.7/tags "add new tags file(剛剛生成tags的路徑,在ctags -R 生成tags檔案後,不要將tags移動到別的目錄,否則ctrl+]時,會提示找不到原始碼檔案)

set tags+=./tags表示在當前工作目錄下搜尋tags檔案
set tags+=~/arm/linux-2.6.24.7/tags表示在搜尋tags檔案的時候,也要搜尋~/arm/linux-2.6.24.7/資料夾下的tags檔案。
然後儲存並退出vi。這樣,你就可以用vim在任意地方檢視有關Linux的函數原形
------------------------------------
tag命令用法:
Ctrl+]  跳到當前游標下單詞的標籤
Ctrl+O  返回上一個標籤
Ctrl+T  返回上一個標籤
:tag TagName 跳到TagName標籤
以上命令是在當前視窗顯示標籤,當前視窗的檔案替代為包標籤的檔案,當前視窗游標跳到標籤位置。如果不希望在當前視窗顯示標籤,可以使用以下命令:
:stag TagName 新視窗顯示TagName標籤,游標跳到標籤處
Ctrl+W + ]  新視窗顯示當前游標下單詞的標籤,游標跳到標籤處
當一個標籤有多個匹配項時(函數 (或類中的方法) 被多次定義),":tags" 命令會跳轉到第一處。如果在當前檔案中存在匹配,那它將會被首先使用。
可以用這些命令在各匹配的標籤間移動:
:tfirst    到第一個匹配
:[count]tprevious 向前 [count] 個匹配
:[count]tnext  向後 [count] 個匹配
:tlast    到最後一個匹配
或者使用以下命令選擇要跳轉到哪一個
:tselect TagName
輸入以上命令後,vim會為你展示一個選擇列表。然後你可以輸入要跳轉到的匹配代號 (在第一列)。其它列的資訊可以讓你知道標籤在何處被定義過。
以下命令將在預覽視窗顯示標籤
:ptag TagName 預覽視窗顯示TagName標籤,游標跳到標籤處
Ctrl+W + }  預覽視窗顯示當前游標下單詞的標籤,游標跳到標籤處
:pclose  關閉預覽視窗
:pedit file.h 在預覽視窗中編輯檔案file.h(在編輯標頭檔案時很有用)
:psearch atoi 查詢當前檔案和任何包含檔案中的單詞並在預覽視窗中顯示匹配,在使用沒有標籤檔案的庫函數時十分有用。
 
最簡單的使用方法舉例
用vi在任意目錄寫一個Test.c檔案,內容如下:

int main(void)
{
printf("Hello World!n");
return 0;
}

寫好後末行模式輸入w儲存好(不要退出vi),按Esc回到指令模式,把游標停留在printf上
然後按 Ctrl+W + ],vi會自動跳到Linux系統函數printf()處,這時我們能檢視printf()的原形
檢視完了,按Ctrl+o(回到上一個標籤) 就回到原來的地方

4、管理vim外掛——vim-addons
通過vim-addons,我們可以管理vim外掛。我們在sudo apt-get install vim vim-scripts vim-doc時,一般會自動安裝上vim-addons。??未安裝可通過sudo apt-get install vim-addon-manager手動安裝。安裝完成後,就可以用vim-addons管理vim外掛了。
# 系統中已有的vim-scripts中包含的外掛及其狀態:
lingd@ubuntu:~$ vim-addons status
# Name                    User Status  System Status
align                      removed      removed   
alternate                  removed      removed   
bufexplorer                removed      removed   
calendar                    removed      removed   
closetag                    removed      removed   
colors sampler pack        removed      removed   
cvsmenu                    removed      removed   
debPlugin                  removed      removed   
detectindent                removed      removed   
doxygen-toolkit            removed      removed   
editexisting                removed      removed   
enhanced-commentify        removed      removed   
gnupg                      removed      removed   
info                        removed      removed   
justify                    removed      removed   
lbdbq                      removed      removed   
markdown-syntax            removed      removed   
matchit                    removed      removed   
minibufexplorer            installed    removed   
nerd-commenter              removed      removed   
omnicppcomplete            installed    removed   
po                          removed      removed   
project                    installed    removed   
Python-indent              removed      removed   
secure-modelines            removed      removed   
snippetsEmu                removed      removed   
sokoban                    removed      removed   
supertab                    removed      removed   
surround                    removed      removed   
taglist                    installed    removed   
tetris                      removed      removed   
utl                        removed      removed   
vcscommand                  removed      removed   
vimplate                    removed      removed   
whatdomain                  removed      removed   
winmanager                  removed      removed   
xmledit                    removed      removed 
上面我們介紹了如何獨立於系統組態檔之外,建立自己的Vim組態檔。當我們自己下載安裝Vim外掛的時候,也可以另外建立目錄,放置我們自己的外掛。這個目錄一般為/home/user/.vim,另外還需要建立一個外掛子目錄,一個外掛文件子目錄,以上的可以進入/home/user目錄下通過下面的命令執行:
lingd@ubuntu:~$ mkdir .vim
lingd@ubuntu:~$ cd .vim
lingd@ubuntu:~/.vim$ mkdir plugin
lingd@ubuntu:~/.vim$ mkdir doc
# vim官方外掛的安裝,xxxx是要安裝的外掛名,以status中顯示的名稱為準。安裝外掛xxxx時使用以下命令(前提是在目錄/home/user/.vim/下建立好了plugin和doc兩個資料夾)
vim-addons install xxxx
 關於vim-addons命令的詳細用法,可以通過“man vim-addons”檢視其幫助文件

5、vim自動補全——OmniCppComplete
vim的自動補全功能可通過其外掛OmniCppComplete實現。
安裝OmniCppComplete
lingd@ubuntu:~$ vim-addons install omnicppcomplete
設定OmniCppComplete
在vim組態檔/home/user/.vimrc中加入如下的設定:

"-- omnicppcomplete setting --
" 按下F3自動補全程式碼,注意該對映語句後不能有其他字元,包括tab;否則按下F3會自動補全一些亂碼
imap <F3> <C-X><C-O>
" 按下F2根據標頭檔案內關鍵字補全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 關掉智慧補全時的預覽視窗
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1

(前幾行就是提供了C++中的./->/::等操作符的提示和自動完成)。
OmniCppComplete是基於ctags資料庫即tags檔案實現的(基於ctags生成的索引資訊來實現自動補全的),所以在ctags -R生成tags時還需要一些額外的選項,這樣生成的tags檔案才能與OmniCppComplete配合運作。使用下列命令生成tags檔案,就可以與OmniCppComplete配合運作:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
--c++-kinds=+p  : 為C++檔案增加函數原型的標籤
--fields=+iaS  : 在標籤檔案中加入繼承資訊(i)、類成員的存取控制資訊(a)、以及函數的指紋(S)
--extra=+q      : 為標籤增加類修飾符。注意,如果沒有此選項,將不能對類成員補全
# vim自動補全功能的測試
# 為了測試自動補全功能,我們先下載C++一份C++標準庫的原始碼。
lingd@ubuntu:~$ sudo apt-get install build-essential
# 然後在/usr/include/c++下就可以找到標準庫的標頭檔案了。
lingd@ubuntu:~$ cd /usr/include/c++
lingd@ubuntu:/usr/include/c++$ ls
4.4  4.4.3
# 在此資料夾下生成能與OmniCppComplete配合運作的tags檔案
lingd@ubuntu:/usr/include/c++$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
lingd@ubuntu:/usr/include/c++$ ls
4.4  4.4.3  tags
# 在vim的組態檔中如下內容,然後在程式設計的時候就可以使用自動補全功能了。
lingd@ubuntu:/usr/include/c++$ vi ~/.vimrc

set tags+=/usr/include/c++/tags

# 用vi開啟前面的Test.c檔案,在printf("Hello World!n")下一行中,輸入pri,然後按下Ctrl+X Ctrl+O,此時vi會彈出一個視窗,所有以pri開頭的tag都會出現在這個視窗中,printf就出現在第6行中
lingd@ubuntu:~$ cd ~
lingd@ubuntu:~$ vim Test.c

注意:在自動補全的點,Vim必須知道可能補全的定義。比如說,在namespace std名稱空間下的變數和函數,必須要用using namespace std;暴露出來,否則是不能補全的。在.cpp檔案中還可以,在.h檔案中這樣就不是好的做法了。暫時不知道這個問題是由於我自己設定錯誤還是程式沒有實現。
當自動補全下拉視窗彈出後,一些可用的快捷鍵:
Ctrl+P  向前切換成員
Ctrl+N  向後切換成員
Ctrl+E  表示退出下拉視窗, 並退回到原來錄入的文字
Ctrl+Y  表示退出下拉視窗, 並接受當前選項
其他補全方式:
Ctrl+X Ctrl+L 整行補全
Ctrl+X Ctrl+N  根據當前檔案裡關鍵字補全
Ctrl+X Ctrl+K  根據字典補全
Ctrl+X Ctrl+T  根據同義詞字典補全
Ctrl+X Ctrl+I  根據標頭檔案內關鍵字補全
Ctrl+X Ctrl+]  根據標籤補全
Ctrl+X Ctrl+F  補全檔名
Ctrl+X Ctrl+D  補全宏定義
Ctrl+X Ctrl+V  補全vim命令
Ctrl+X Ctrl+U  使用者自定義補全方式
Ctrl+X Ctrl+S  拼寫建議
幫助文件
:help omnicppcomplete
 
6、提示函數原型echofunc
echofunc可以在命令列中提示當前輸入函數的原型。
echofunc下載地址:http://www.vim.org/scripts/script.php?script_id=1735
下載完成後,把echofunc.vim檔案放到 ~/.vim/plugin資料夾中
當你在vim插入(insert)模式下緊接著函數名後輸入一個"("的時候, 這個函數的宣告就會自動顯示在命令列中。如果這個函數有多個宣告, 則可以通過按鍵"Alt+-"和"Alt+="向前和向後翻頁, 這個兩個鍵可以通過設定g:EchoFuncKeyNext和g:EchoFuncKeyPrev引數來修改。這個外掛需要tags檔案的支援, 並且在建立tags檔案的時候要加選項"--fields=+lS"(OmniCppComplete建立的tag檔案也能用), 整個建立tags檔案的命令如下:
$ ctags -R --fields=+lS
其他外掛說明詳見echofunc.vim

如果你在編譯vim時加上了"+balloon_eval"特性,那麼當你把滑鼠放在函數名上的時候會有一個tip視窗彈出, 該視窗中也會有函數的宣告

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-02/140282p2.htm 


IT145.com E-mail:sddin#qq.com