vim寫c/c++的經驗總結
阿新 • • 發佈:2019-01-03
個人使用者在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>