1. 程式人生 > >vim寫c/c++的經驗總結

vim寫c/c++的經驗總結

個人使用者在vim上的配置在~/.vimrc下,不用弄系統的vim配置檔案。

檢視程式碼的操作

Ctrl + ] 定位函式的定義
Ctrl + o 回跳游標定位處 Ctrl + t 類似於兩個'
Ctrl + i 前跳游標定位處 tag,這個只能配合Ctrl + o來前跳
gd 定位變數的定義
gf 進入標頭檔案
n 查詢下一個,等同 *
Shift+n 查詢上一個 ,等同#
w和b,比l和h用的多一點。
小寫的o比a,i用的多一點
u是回退
Ctrl + r是u的前跳,這個只能配合u進行前跳
%找匹配的括號
[[ 上一個程式碼塊,一般是方法
]] 下一個程式碼塊

ubuntu的快捷鍵
Shift+Ctrl+T 開啟終端新的標籤頁 
Ctrl+PgUp/PgDn 切換終端標籤頁 

taglist
如果需要檢視函式列表,需要啟動Taglist,在Vim的命令狀態輸入:TlistToggle, //Tlist
在Vim介面的左面就會出現函式列表。安CTRL+WW(2次W),可以切換到函式列表區, //Ctrl w w //Ctrl w q 關閉這個視窗 CTRL-w o關閉其他所有視窗
移動到函式名稱行後按ENTER即可檢視函式程式碼。                   //Enter

修改程式碼的操作
插入字元的方法,除了i和a,還有r,配合f用不錯。

全文查詢cout並替換為//cout,即註釋cout的指令。其中%s是全文的意思//需要用\來轉義,這裡只更換每一行第一個cout,如何要更換每一個cout,需要改為 %s/cout/\/\/cout/g
 %s/cout/\/\/cout

 ggvG$是全選,是個組合鍵,跳到首行,進入visual檢視,G是跳到尾行,$是進入行尾
v如何多行連續選取呢。5Gv80G 5到80行就都選了。

Shift + Insert 是可以在insert的模式下,進行黏貼。
我用vimrc的map定義了,p ,y ,a ,x等快捷鍵搞定這個,後面會附我的vimrc。
reg可以檢視vim的剪下板。

vim 添加註釋的方法
Ctrl + v 選擇列
大寫的I 輸入 //
連續按2次esc就可以了。

=,可以整理程式碼

關於ctags,cscope和vimgrep

ctags:
在工程的多個目錄下生產tags的方法:
ctags -R --c++-kinds=+px --fields=+iaS --extra=+q
在.vimrc中增加遞迴查詢ctags  
set tags=tags;

ctags生成系統庫索引的方法
ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S  -R -f ~/.vim/systags /usr/include /usr/local/include
在.vimrc中增加相應的配置:
set tags+=~/.vim/systags

cscope:
find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -name '*.cc' -o -name '*.java' -o -name  '*.cs' > cscope.files
cscope -Rbq
在vimrc中,增加引入cscope.out的操作,cs add cscope.out
"cscope find"的用法:
cs find c|d|e|f|g|i|s|t name
0 或 s     查詢本 C 符號(可以跳過註釋)
1 或 g     查詢本定義
2 或 d     查詢本函式呼叫的函式
3 或 c     查詢呼叫本函式的函式 C-c
4 或 t     查詢本字串 C-x
6 或 e     查詢本 egrep 模式
7 或 f     查詢本檔案
8 或 i     查詢包含本檔案的檔案 
可以在vimrc中,自定義快捷鍵,來輔助查詢。

vimgrep:
vimgrep的效果,比cscope要快一些,而且安裝沒有外掛。
用法:vim " main \{0,\}("gj **/*.c
vim是vimgrep縮寫,查詢 main \{0,\}(,目的是查詢所有的main函式,g是在一行中有多個匹配,返回多個行,j是不跳轉,這裡的引數沒有分隔符, %是當前檔案,*是當前目錄,**是當前目錄及子目錄,*.c是匹配c檔案。
 \{0,\}表示0個以上的空格
grep 關鍵字,然後cw,也可以用。
cw的關閉,用ccl。

附帶我的.vimrc的配置:
"colorscheme default 
colorscheme darkblue 
"colorscheme torte 
"colorscheme koehler
"colorscheme desert
set nocp
set nu
set ruler
syntax on
set autoindent
set smartindent
set tabstop=4
set softtabstop=4
set shiftwidth=4
set cindent
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set backspace=2
set showmatch
set tags+=~/.vim/systags
set tags=tags;
"高亮c程式碼的方法名
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2
syn match cFunctions "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1
hi cFunctions gui=NONE cterm=bold  ctermfg=blue
"設定taglist
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
filetype plugin indent on
call pathogen#infect()
filetype plugin indent on
"golang 設定
let g:go_version_warning = 0
"對映F9為ctags和cscope的啟動,效果一般,僅供學習
map <F9>  :call GenerateCtags()<CR>  
function! GenerateCtags()  
	let dir = getcwd()  
	if filereadable("tags")  
		let tagsdeleted=delete("./"."tags")  
		if(tagsdeleted!=0)  
			echohl WarningMsg | echo "Fail to do tags! I cannot delete the tags" | echohl None  
			return  
		endif  
	endif    
	if has("cscope")  
		silent! execute "cs kill -1"  
	endif    
	if filereadable("cscope.files")  
		let csfilesdeleted=delete("./"."cscope.files")  
		if(csfilesdeleted!=0)  
			echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.files" | echohl None  
			return  
		endif  
	endif    
	if filereadable("cscope.out")  
		let csoutdeleted=delete("./"."cscope.out")  
		if(csoutdeleted!=0)  
			echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.out" | echohl None  
			return  
		endif  
	endif    
	if(executable('ctags'))  
		silent! execute "!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ."  
	endif    
	if(executable('cscope') && has("cscope") )  
		silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -name '*.cc' -o -name '*.java' -o -name '*.cs' > cscope.files"  
		silent! execute "!cscope -Rbq"  
		execute "normal :"  
		if filereadable("cscope.out")  
			execute "cs add cscope.out"  
		endif                                                                                                                  
	endif    
endfunction 
"在選擇模式下系統級複製
vnoremap ,y "+y<ESC>
""在選擇模式下系統級剪下
vmap ,x x:let @[email protected]"<CR>
"系統級複製
noremap ,p "+p
"nmap ,V "+P
""全選
nmap ,a ggvG$
""切換到16進位制編輯方式
map ,b :%!xxd<CR>
"切換回正常編輯方式
map ,B :%!xxd -r<CR>
""cscope 快捷鍵
set cscopequickfix=s-,c-,d-,i-,t-,e-
cs add cscope.out ./
"nmap <C-a>  :cs add cscope.out ./<cr>
"nmap <C-.>  :cs find s <C-R>=expand("<cword>")<cr><cr>
"nmap <C-.>  :cs find g <C-R>=expand("<cword>")<cr><cr>
nmap <C-c>  :cs find c <C-R>=expand("<cword>")<cr><cr>
nmap <C-x>  :cs find t <C-R>=expand("<cword>")<cr><cr>
"nmap <C-.>  :cs find e <C-R>=expand("<cword>")<cr><cr>
"nmap <C-.>  :cs find f <C-R>=expand("<cfile>")<cr><cr>
"nmap <C-.>  :cs find i <C-R>=expand("<cfile>")<cr><cr>
"nmap <C-.>  :cs find d <C-R>=expand("<cword>")<cr><cr>