天天看點

Ubuntu Vim配置

Vim

" Source a global configuration file if available
if filereadable("/etc/vim/vimrc.local")
  source /etc/vim/vimrc.local
endif
"============== vim 配置 ==================================
let $
set fileencodings=utf-8,chinese,latin-1
set termencoding=utf-8
set encoding=utf-8
set showcmd		    		" Show (partial) command in status line.
set showmatch		    		" Show matching brackets.
set smartcase		    		" Do smart case matching
set autowrite		    		" Automatically save before commands like :next and :make
set mouse=a		    		" Enable mouse usage
"set nocompatible           		" 關閉 vi 相容模式
syntax on                   		" 自動文法高亮
"set number                 		" 顯示行号
set cursorline              		" 突出顯示目前行
set ruler                   		" 打開狀态欄标尺
set shiftwidth=4            		" 設定 << 和 >> 指令移動時的寬度為 4
set softtabstop=4           		" 使得按倒退鍵時可以一次删掉 4 個空格
set tabstop=4               		" 設定 tab 長度為 4
set nobackup                		" 覆寫檔案時不備份
set autochdir               		" 自動切換目前目錄為目前檔案所在的目錄
set backupcopy=yes          		" 設定備份時的行為為覆寫
set ignorecase smartcase    		" 搜尋時忽略大小寫,但在有一個或以上大寫字母時仍保持對大小寫敏感
set nowrapscan              		" 禁止在搜尋到檔案兩端時重新搜尋
set incsearch               		" 輸入搜尋内容時就顯示搜尋結果
set hlsearch                		" 搜尋時高亮顯示被找到的文本
set noerrorbells            		" 關閉錯誤資訊響鈴
set novisualbell            		" 關閉使用可視響鈴代替呼叫
set t_vb=                   		" 置空錯誤鈴聲的終端代碼
set showmatch               		" 插入括号時,短暫地跳轉到比對的對應括号
set matchtime=2             		" 短暫跳轉到比對括号的時間
set magic                   		" 設定魔術
set hidden                  		" 允許在有未儲存的修改時切換緩沖區,此時的修改由 vim 負責儲存
set history=50 
filetype plugin indent on   		" 開啟插件
filetype on 	            		" 打開檔案類型檢測
set hls 		    		" 查找文本高亮
set autoindent 		    		" 自動縮進
set expandtab 		    		" 空格替換TAB
set smarttab		    		" 智能TAB
set guioptions-=T           		" 隐藏工具欄
set guioptions-=m           		" 隐藏菜單欄
set smartindent             		" 開啟新行時使用智能自動縮進
set backspace=indent,eol,start 		" 不設定在插入狀态無法用倒退鍵和 Delete 鍵删除回車符
set cmdheight=1             		" 設定指令行的行數為 1
set laststatus=2            		" 顯示狀态欄 預設值為 1, 無法顯示狀态欄
set cindent                 		" 設定使用 C/C++ 語言的自動縮進方式 
"set foldenable             		" 開始折疊
"set foldmethod=syntax      		" 設定文法折疊
set foldcolumn=0           		" 設定折疊區域的寬度
"set paste		    		" 粘貼插入
set path=.,/usr/include
"set showmode 		    		" 指令行顯示vim目前模式
set tags+=./tags 	    		" add current directory's generated tags file
set confirm 		    		" 在處理未儲存或隻讀檔案的時候,彈出确認
set clipboard+=unnamed	    		" 與windows共享剪貼闆
set selection=exclusive
set selectmode=mouse,key

" 映射F2顯示行号,參考"vim 按鍵映射"
map <F2> <Esc>:set nu<CR>
           

ctags的搭建與使用

1.下載下傳源碼包:http://nchc.dl.sourceforge.net/project/ctags/ctags/5.8/ctags-5.8.tar.gz

2.解壓 tar zxvfctags-5.8.tar.gz

3.配置 ./configure

4.make

5.make install

6.進入kernel目錄,執行ctags -R *,“-R”表示遞歸建立,也就包括源代碼根目錄(目前目錄)下的所有子目錄。“*”表示所有檔案。這條指令會在目前目錄下産生一個“tags”檔案。

7.使用vim打開一個檔案,在vim中輸入set tags=xxx/kernel/tags

8.ctags

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 查找目前檔案和任何包含檔案中的單詞并在預覽視窗中顯示比對,在使用沒有标簽檔案的庫函數時十分有用。
           

cscope的搭建與使用

1.安裝Cscope

sudo apt-get install cscope
           

2.配置Cscope

在vim配置檔案/home/user/.vimrc中加入如下的配置:

"-- Cscope setting --
if has("cscope")
set csprg=/usr/bin/cscope " 指定用來執行cscope的指令
set csto=0 " 設定cstag指令查找次序:0先找cscope資料庫再找标簽檔案;1先找标簽檔案再找cscope資料庫
set cst " 同時搜尋cscope資料庫和标簽檔案
set cscopequickfix=s-,c-,d-,i-,t-,e- " 使用QuickFix視窗來顯示cscope查找結果
set nocsverb
if filereadable("cscope.out") " 若目前目錄下存在cscope資料庫,添加該資料庫到vim
cs add cscope.out
elseif $CSCOPE_DB != "" " 否則隻要環境變量CSCOPE_DB不為空,則添加其指定的資料庫到vim
cs add $CSCOPE_DB
endif
set csverb
endif
map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
" 将:cs find c等Cscope查找指令映射為<C-_>c等快捷鍵(按法是先按Ctrl+Shift+-, 然後很快再按下c)
nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>
           

3.使用Cscope方法

<1>、為源碼建立一個cscope資料庫

cscope -Rbq

說明一下參數:

        R 表示把所有子目錄裡的檔案也建立索引

  b 表示cscope不啟動自帶的使用者界面,而僅僅建立符号資料庫

     q 生成cscope.in.out和cscope.po.out檔案,加快cscope的索引速度

  k 在生成索引檔案時,不搜尋/usr/include目錄

之後會在目前目錄生成幾個檔案,  cscope.in.out和cscope.po.out檔案,cscope.out

<2>、用vim打開某個源碼檔案,末行模式下,輸入“:cs add cscope.out"(該指令已被我們映射為快捷鍵F4),添加cscope資料庫到vim。因為我們已将vim配置為啟動時,自動添加目前目錄下的cscope資料庫,是以你再添加該cscope資料庫時,vim會提示“重複cscope資料庫 未被加入“

<3>、完成前兩步後,現在就可以用“cs find c”等Cscope查找指令查找關鍵字了。我們已在.vimrc中将“cs find c”等Cscope查找指令映射為<C-_>c等快捷鍵(按法是先按Ctrl+Shift+-, 然後很快按下c)

cscope的主要功能是通過子指令"find"來實作的

"cscope find"的用法:

cs find c|d|e|f|g|i|s|t name

s 查找本 C 符号(可以跳過注釋)

g 查找本定義

d 查找本函數調用的函數

c 查找調用本函數的函數

t 查找本字元串

e 查找本 egrep 模式

f 查找本檔案

i 查找包含本檔案的檔案

Ctrl+]将跳到光标所在變量或函數的定義處 Ctrl+T傳回

管理vim插件

通過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中包含的插件及其狀态:

vim-addons status
           

vim官方插件的安裝,xxxx是要安裝的插件名,以status中顯示的名稱為準。安裝插件xxxx時使用以下指令(前提是在目錄/home/user/.vim/下建立好了plugin和doc兩個檔案夾)

vim-addons install xxx
           

OmniCppComplete自動補全插件

OmniCppComplete是基于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      : 為标簽增加類修飾符。注意,如果沒有此選項,将不能對類成員補全

1.安裝OmniCppComplete

vim-addons install omnicppcomplete
           

2.配置OmniCppComplete 在vim配置檔案/home/user/.vimrc中加入如下的配置:

set completeopt=menu,menuone 		" 關掉智能補全時的預覽視窗
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1 
let OmniCpp_ShowPrototypeInAbbr = 1 	" 顯示函數參數清單 
let OmniCpp_MayCompleteDot = 1   	" 輸入 .  後自動補全
let OmniCpp_MayCompleteArrow = 1 	" 輸入 -> 後自動補全 
let OmniCpp_MayCompleteScope = 1 	" 輸入 :: 後自動補全 
"let OmniCpp_DefaultNamespaces=["std"]
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif 
set completeopt=menuone,menu,longest
imap <F6> <C-X><C-O>
" 按下F7根據頭檔案内關鍵字補全
imap <F7> <C-X><C-I>
           

3.使用OmniCppComplete方法

按下Ctrl+X Ctrl+O,此時vi會彈出一個視窗

當自動補全下拉視窗彈出後,一些可用的快捷鍵:
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
           

标簽浏覽器Taglistc插件

Taglist用于列出了目前檔案中的所有标簽(宏, 全局變量, 函數名等) 1.安裝Taglist

vim-addons install taglist
           

2.配置Taglist 在vim配置檔案/home/user/.vimrc中加入如下的配置:

" 按下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>

map <F3> : Tlist<CR>  			" 按下F3就可以呼出了
"let Tlist_Auto_Open = 1  		" 在啟動VIM後,自動打開taglist視窗
let Tlist_Show_One_File=0 		" 讓taglist可以同時展示多個檔案的函數清單,設定為1時不同時顯示>多個檔案的tag,隻顯示目前檔案的
let Tlist_File_Fold_Auto_Close=1 	" 同時顯示多個檔案中的tag時,taglist隻顯示目前檔案tag,>其他檔案的函數清單折疊隐藏
let Tlist_Exit_OnlyWindow=1 		" 當taglist是最後一個分割視窗時,自動退出vim
"let Tlist_Use_SingleClick= 1    	" 預設情況下,在輕按兩下一個tag時,才會跳到該tag定義的位置
"let Tlist_Process_File_Always=0  	" 是否一直處理tags.1:處理;0:不處理
let Tlist_Sort_Type = "name"		" 按照名稱排序
let Tlist_Use_Right_Window=0 		" 1為讓視窗顯示在右邊,0為顯示在左邊
let Tlist_Compart_Format = 1		" 壓縮方式
let Tlist_Enable_Fold_Column = 0	" 不要顯示折疊樹
           

3.使用Taglist方法 進入vim後,使用方法如下:

TlistOpen(直接Tlist也可)打開并将輸入焦點至于标簽清單視窗
TlistClose關閉标簽清單視窗
TlistToggle切換标簽清單視窗狀态(打開←→關閉)标簽清單視窗是否獲得焦點取決于其他配置
ctl-w+w  taglist本質上是一個vim分隔視窗,是以可以使用ctl-w系列快捷鍵對視窗進行切換操作
           

在taglist視窗中,還可以使用下面的快捷鍵:

o:建立一個視窗,跳到标記定義處
p:預覽标記定義(仍然在taglist視窗)
空格:顯示光标下tag的原型定義
u:更新标記清單(比如源檔案新增了一個函數,并在儲存後,可在taglist視窗按u)
s:選擇排序字段(暫時我也不知道什麼意思)
d:删除光标所在的taglist檔案(如用vi打開了兩個檔案f1.c,f2.c可以删除f1.c的标記)
x:n放大/縮小taglist視窗
+ 打開一個折疊,同zo
- 将tag折疊起來,同zc
* 打開所有的折疊,同zR
= 将所有tag折疊起來,同zM
[[:将光标移到前一個檔案的起點
]]:将光标移到後一個檔案的起點
q:退出taglist視窗
           

檔案浏覽器和緩沖區管理器WinManager

我們用WinManager來管理檔案浏覽器netrw和标簽浏覽器Taglist。netrw是标準的vim插件, 已經随vim一起安裝進系統裡了, 不需要我們自行下載下傳安裝。

1.安裝WinManager

vim-addons install winmanager
           

2.配置WinManager 在vim配置檔案/home/user/.vimrc中加入如下的配置:

"-- WinManager setting --
let g:winManagerWindowLayout='FileExplorer|TagList' " 設定我們要管理的插件
"let g:persistentBehaviour=0 " 如果所有編輯檔案都關閉了,退出vim
nmap wm :WMToggle<cr>
           

3.使用WinManager方法

:WMToggle 打開/關閉WinManage,不過我們在配置檔案.vimrc中做了快捷鍵映射,是以直接按wm就可以打開/關閉WinManage
檔案浏覽器指令(在檔案浏覽器視窗中使用)
<enter>或輕按兩下  如果光标下是目錄, 則進入該目錄; 如果光标下檔案, 則打開該檔案
<tab>   如果光标下是目錄, 則進入該目錄; 如果光标下檔案, 則在新視窗打開該檔案
<F5> 重新整理清單
-  傳回上一層目錄
c  使浏覽目錄成為vim目前工作目錄
d  建立目錄
D  删除目前光标下的目錄或檔案
i  切換顯示方式
R  檔案或目錄重命名
s  選擇排序方式
r  反向排序清單
x  定制浏覽方式, 使用你指定的程式打開該檔案