- 論壇徽章:
- 0
|
VIM編程(1)
進行基本設置
1)先創(chuàng)立三個個人基本配置路徑
~/.vim/plugin~/.vim/doc~/.vim/syntax$ mkdir ./.vim/{plugin,doc,syntax} –p
$touch ~/.vimrc
2) 中文幫助手冊的安裝
http://vimcdoc.sf.net (English)http://vcd.gro.clinux.org (中文)下載的文件包應該是類似這樣的: vimcdoc-1.5.0.tar.gz
$tar xvf vimcdoc-1.6.0.tar.tar
$ cd vimcdoc-1.6.0/
$ ./vimcdoc.sh –i
$ echo "set helplang=cn" >> ./.vimrc
3)修改~/.vimrc
"基本配置
set wildmenu
"增強模式中的命令行自動完成操作
set foldmethod=manual
"設定折疊方式為手動
set helplang=cn
"設置幫助的語言為中文
set cin
"實現(xiàn)C程序的縮進
set sw=4
"設計(自動) 縮進使用4個空格
set sta
"插入時使用'shiftwidth'
set backspace=2
"指明在插入模式下可以使用刪除光標前面的字符
syntax enable
"設置高亮關(guān)鍵字顯示
set nocompatible
"去掉討厭的有關(guān)vi一致性模式,避免以前版本的一些bug和局限
set number
""顯示行號
filetype on
"檢測文件的類型
map :q
set history=1000
""記錄歷史的行數(shù)
set background=dark
"背景使用黑色
syntax on
""語法高亮度顯示
set autoindent
set smartindent
"上面兩行在進行編寫代碼時,在格式對起上很有用;
""第一行,vim使用自動對起,也就是把當前行的對起格式應用到下一行;
"第二行,依據(jù)上面的對起格式,智能的選擇對起方式,對于類似C語言編寫上很有用
""第一行設置tab鍵為4個空格,第二行設置當行之間交錯時使用4個空格
set tabstop=4
set shiftwidth=4
set showmatch
"設置匹配模式,類似當輸入一個左括號時會匹配相應的那個右括號
set ruler
""在編輯過程中,在右下角顯示光標位置的狀態(tài)行
set incsearch
"查詢時非常方便,如要查找book單詞,當輸入到/b時,會自動找到第一
""個b開頭的單詞,當輸入到/bo時,會自動找到第一個bo開頭的單詞,依
"次類推,進行查找時,使用此設置會快速找到答案,當你找要匹配的單詞
""時,別忘記回車。
"設置全選快捷鍵
map ggVG
"設置tab的快捷鍵
map :tabnew .
map :tabnext
"F11為新建一個標簽,Shirt+F11為跳轉(zhuǎn)標簽
"F12是注釋掉改行,S-F12是去掉改行的注釋
map :A
map I//
map! I//i
map 02x
map! 02x
"設置格式化源代碼快捷鍵
map :call FormartSrc()
"設置編譯快捷鍵
map :make
map :make clean
map :cw
map :ccl
map :cn
map :cp
map :call CompileRun()
map :call Debug()
"F5為make,Crtl+F5為make clean
"F6為quickfix,查看詳細信息, Ctrl+F6關(guān)閉詳細信息
"F7為下一個結(jié)果,Ctrl+F7為上一個結(jié)果
"F8為編譯和運行單個C程序、Shift+F8為調(diào)試
map o
"設置建立新行但是不插入
""""""""""""""""""""""""""""""
" Tag list (ctags)
""""""""""""""""""""""""""""""
set tags=./tags
let g:winManagerWindowLayout='FileExplorerTagList'
map :WMToggle:q
map :WMToggle
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if has("cscope")
set csprg=/usr/local/bin/cscope
"設置cscope程序的位置
set csto=1
"選項決定是先查找tag文件還是先查找cscope數(shù)據(jù)庫。設置為0則先查找cscope數(shù)據(jù)庫,設置為1先查找tag文件。我通常設置為1,因為在tag文
"件中查找到的結(jié)果,會把最佳匹配列在第一位。
set cst
"如果你想VIM同時搜索tag文件以及cscope數(shù)據(jù)庫,設置cscopetag選項
set nocsverb
set cscopequickfix=s-,c-,d-,i-,t-,e-
"這個是設定是否使用 quickfix 窗口來顯示 cscope 結(jié)果。
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
"設置快捷鍵:
nmap s :cs find s =expand("")
nmap g :cs find g =expand("")
nmap c :cs find c =expand("")
nmap t :cs find t =expand("")
nmap e :cs find e =expand("")
nmap f :cs find f =expand("")
nmap i :cs find i ^=expand("")$
nmap d :cs find d =expand("")
filetype plugin indent on
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}i
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
autocmd BufNewFile * normal G
"新建文件后,自動定位到文件末尾
autocmd BufNewFile *.cpp,*.sh,*.java exec ":call SetTitle()"
"新建.cpp,.java,.sh,
"定義函數(shù)SetTitle,自動插入文件頭
func SetTitle()
"如果文件類型為.sh文件
if &filetype == 'sh'
call setline(1, "\#########################################################################")
call append(line("."), "\# Author: Futuredaemon")
call append(line(".")+1, "\# Created Time: ".strftime("%c"))
call append(line(".")+2, "\# File Name: ".expand("%"))
call append(line(".")+3, "\# Description: ")
call append(line(".")+4, "\#########################################################################")
call append(line(".")+5, "\#!/bin/bash")
call append(line(".")+6, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " Author: Futuredaemon")
call append(line(".")+1, " Created Time: ".strftime("%c"))
call append(line(".")+2, " File Name: ".expand("%"))
call append(line(".")+3, " Description: ")
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
endfunc
"定義CompileRun函數(shù),用來調(diào)用進行編譯和運行
func CompileRun()
exec "w"
"C程序
if &filetype == 'c'
exec "!gcc % -g -o % cscope.files
$cscope –bq
這個命令會生成三個文件:cscope.out, cscope.in.out, cscope.po.out。其中cscope.out是基本
符號索引,后兩個文件是使用"-q"選項生成的,可以加快cscope的索引速度。在缺省情況下
cscope在生成數(shù)據(jù)庫后就會進入它自己的查詢界面,我們一般不用這個界面,所以使用
“-b”選項。
9)c/h文件間相互切換 -- 插件: A
下載:http://www.vim.org/scripts/script.php?script_id=31
將a.vim 放到 ~/.vim/plugin 文件夾中
10)自動補全
~/.vimrc文件中增加下面兩句:
請確定你的Ctags 5.6已經(jīng)安裝好, 并且生成的tags文件已經(jīng)可以用了,用vim打開一個
程主源文件后任意變量、宏、函數(shù)、API等都可以自動補全(用Tab鍵)
11)astyle代碼格式整理軟件
$sudo apt-get install astyle
VIM編程(2)
1.移動光標
在當前行里面有效的移動光標,注意這些字母都可以配合刪除、移動等操作。
fx:移動光標到當前行的下一個 x 處。很明顯,x 可以是任意一個字母,而且你可以使用 ; 來重復你的上一個 f 命令。
tx:和上面的命令類似,但是是移動到 x 的左邊一個位置。(這真的很有用)
Fx:和 fx 類似,不過是往回找。
w:光標往前移動一個詞。
b:光標往后移動一個詞。
0:移動光標到當前行首。
^:移動光標到當前行的第一個字母位置。
$:移動光標到行尾。
):移動光標到下一個句子。
( :移動光標到上一個句子。
在整個文件里面有效移動光標
:向下移動一屏。
:向上移動一屏。
G:到文件尾
numG:移動光標到指定的行(num)。(比如 10G 就是到第 10 行)
gg:到文件首
H:移動光標到屏幕上面
M:移動光標到屏幕中間
L:移動光標到屏幕下面
*:讀取光標處的字符串,并且移動光標到它再次出現(xiàn)的地方。
#:和上面的類似,但是是往反方向?qū)ふ摇?br />
j 向下
k 向上 k
l 向右 h l
h 向左 j
2.查找
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向重復上一次搜索命令
N:在反方向上重復上一次搜索命令
:s/源串/目標串/g 替換當前行中所有符合條件的字符串
:行號1,行號2s/源串/目標串/g 在指定行中進行替換
:%s/源串/目標串/g 全文替換
ma:在當前光標的位置標記一個書簽,名字為 a。書簽名只能是小寫字母。你看不見書簽的存在,但它確實已經(jīng)在那里了。
`a:到書簽 a 處。注意這個不是單引號,它一般位于大部分鍵盤的 1 的左邊。
`.:到你上次編輯文件的地方。這個命令很有用,而且你不用自己去標記它。
:marks 查看標記列表
vim中常用的找出行數(shù)的命令:
Ctrl+g 在最后一行中顯示光標所在位置的行數(shù)及文章的總行數(shù)
nG 將光標移至n行
r 修改光標所在字符
R 修改光標所在位置的字符,可以一直替換字符,知道按下ESC鍵
u 表示復原功能
U 取消對行所作的所有改變
重復執(zhí)行上一命令
Z+Z 連續(xù)按下兩次Z,文件將保存并退出vim
重做
3.復制粘貼剪切
有效的移動大段的文本
v:按字符選擇。
V:按行選擇。這在你想拷貝或者移動很多行的文本的時候特別有用。
:按塊選擇。
在選擇模式的時候使用上面所述的方向鍵和命令(motion)。比如,vwww,會高亮光標前面的三個詞。Vjj 將會高亮當前行以及下面兩行。
一旦你高亮了選區(qū),你或許想進行一些操作:
d:剪貼選擇的內(nèi)容到剪貼板。
y:拷貝選擇的內(nèi)容到剪貼板。
c:剪貼選擇的內(nèi)容到剪貼板并且進入插入模式。
如果你很清楚的知道你想拷貝或者剪切什么,那你根本就不需要進入可視選擇模式。這樣也會節(jié)省時間:
d{motion}:剪切 motion 命令跨過的字符到剪貼板。比如,dw 會剪切一個詞而 dfS 會將從當前光標到下一個 S 之間的字符剪切至剪貼板。
y{motion}:和上面類似,不過是拷貝。
c{motion}:和 d{motion} 類似,不過最后進入插入模式。
dd:剪切當前行。
yy:拷貝當前行。
cc:剪切當前行并且進入插入模式。
D:剪切從光標位置到行尾到剪貼板。
C:和 D 類似,最后進入插入模式。
x:剪切當前字符到剪貼板。
:和x類似,不過最后進入插入模式。
y+w 復制光標所在的位置到整個單詞所在的位置
使用多重剪貼板
很
多編輯器都只提供了一個剪貼板。VIM 有很多。剪貼板在 VIM
里面被稱為寄存器(Registers)。你可以列出當前定義的所有寄存器名和它們的內(nèi)容,命令為":reg"。最好使用小寫字母來作為寄存器的名稱,因
為大寫的有些被 VIM 占用了。使用寄存器的命令為雙引號 "。
比如:我們要拷貝當前行到寄存器 k。你應該按 "kyy。(你也可以使用 V"ky。為什么這樣也可以呢?)現(xiàn)在當前行應該已經(jīng)存在了寄存器 k 里面直到你又拷貝了一些東西進入寄存器 k,F(xiàn)在你可以使用命令 "kp 來粘貼寄存器 k 里面的內(nèi)容到你想要的位置。
"ayy 將當前行復制到寄存器 a 中
"ap 將寄存器 a 中的內(nèi)容粘貼到光標之后
l :registers 查看所有寄存器的內(nèi)容
l 通常情況下,寄存器 + ( " + Shift+= )對應X下的剪貼板。您在其它程序中復制的內(nèi)容,可以使用 "+p 粘貼到Vim中;您在Vim中,可以使用 "+y 將內(nèi)容復制到剪貼板,再粘貼到其它程序中
l 沒有指定寄存器時,Vim使用“無名寄存器”存儲內(nèi)容
4.刪除
vim中常用的刪除文本命令:
d+d 連按兩次d,可將光標所在的行刪除,若連續(xù)刪除,可以按住d不放
d+w 刪除光標所在的單詞,若是光標在兩字之間,則刪光標后的一個詞
D 將光標所在行后面所有的單詞刪除
x 將光標所在位置后一個字符刪除
X 將光標所在位置前一個字符刪除
5.插入
vim中命令行模式切換到輸入模式,進行插入:
* i:在當前字符的左邊插入
* I:在當前行首插入
* a:在當前字符的右邊插入
* A:在當前行尾插入
* o:在當前行下面插入一個新行
* O:在當前行上面插入一個新行
*
c{motion}:刪除 motion
命令跨過的字符,并且進入插入模式。比如:c$,這將會刪除從光標位置到行尾的字符并且進入插入模式。ct!,這會刪除從光標位置到下一個嘆號(但不包
括),然后進入插入模式。被刪除的字符被存在了剪貼板里面,并且可以再粘貼出來。
例如:cw:刪除光標所在處的詞并插入。(c —— change)
* d{motion}:和上面差不多,但是不進入插入模式。
6.文件操作
vim最后行模式主要的操作命令:
e 創(chuàng)建新的文件
n 加載新的文件
w 寫文件,它是保存到臨時文件中,直接退出,并沒有保存到文件中的
w! 如果想寫只讀文件,使用它強制寫入文件
q! 不問你是否保存文件,強制退出
set 可以設置vim的某些特性。取消設置,使用 set none
7.宏
您可以將一系列的操作錄制為一個宏,然后執(zhí)行它
q 開始錄制宏。宏名稱為一個字符
q 錄制中按下“q”鍵,結(jié)束錄制
@ 執(zhí)行宏
可以使用 :registers(寄存器列表) 命令查看已記錄的宏
VIM編程(3)
準備標簽
$ctags -R
生成一個cscope的數(shù)據(jù)庫, 在項目的根目錄運行下面的命令:
$ find . –type f > cscope.files
$cscope –bq
Winmanager文件操作技巧:
Winmannager:
打開關(guān)閉
顯示幫助
如果光標下是目錄, 則進入該目錄; 如果光標下文件, 則打開該文件
- 返回上級目錄
c 切換vim 當前工作目錄正在瀏覽的目錄
d 創(chuàng)建目錄
D 刪除目錄或文件
i 切換顯示方式
R 文件或目錄重命名
s 選擇排序方式
x 定制瀏覽方式, 使用你指定的程序打開該文件
Cscope幫助閱讀代碼
進入vim后第一件事是要把剛才生成的cscope文件導入到vim中來, 用下面的命令:
:cs add /XXX/cscope.out /XXX
以調(diào)用“F1+字母”命令進行查找了。VIM支持8種cscope的查詢功能,如下:
s: 查找C語言符號,即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方
g: 查找函數(shù)、宏、枚舉等定義的位置,類似ctags所提供的功能
d: 查找本函數(shù)調(diào)用的函數(shù)
c: 查找調(diào)用本函數(shù)的函數(shù)
t: 查找指定的字符串
e: 查找egrep模式,相當于egrep功能,但查找速度快多了
f: 查找并打開文件,類似vim的find功能
i: 查找包含本文件的文件
如果自動跳轉(zhuǎn)的位置你不滿意, 想看其他的結(jié)果, 可以用F6打開QuickFix窗口:
Shift+F6關(guān)閉QuickFix窗口,Crtl+o返回上一級。
Taglist的基本操作
按下F3就會打開taglist窗口了,在其中可以使用下面的快捷鍵:
跳到光標下tag所定義的位置,用鼠標雙擊此tag功能也一樣
o 在一個新打開的窗口中顯示光標下tag
顯示光標下tag的原型定義
u 更新taglist窗口中的tag
s 更改排序方式,在按名字排序和按出現(xiàn)順序排序間切換
x taglist窗口放大和縮小,方便查看較長的tag
+ 打開一個折疊,同zo
- 將tag折疊起來,同zc
* 打開所有的折疊,同zR
= 將所有tag折疊起來,同zM
[[ 跳到前一個文件
]] 跳到后一個文件
q 關(guān)閉taglist窗口
顯示幫助
編程常用技巧:
Tab 自動補全
Ctrl+A 全選
Shift+o 建立新行但是不插入
% 跳轉(zhuǎn)到配對的括號去
[[ 跳轉(zhuǎn)到代碼塊的開頭去(但要求代碼塊中'{'必須單獨占一行)
>> 縮進所有選擇的代碼
光標會自動跳到XXXX()函數(shù)的定義處。
, 跳回到函數(shù)被調(diào)用的地方了, 變量, 結(jié)構(gòu), 宏, 等等, 都可以的。
Shift+qq 快速不保存退出vi(所有的標簽都會關(guān)閉)
F10 快速打開同文件夾下的源文件,查找文件名可以用/
編譯:
F5 Make
Shift+F5 Make clean
F6 列出所有編譯信息
Shift+F6 關(guān)閉調(diào)試信息
F7 切換到下一個結(jié)果
Shift+F7 切換到上一個結(jié)果
F8 編譯并運行單個文件
Shift+F8 調(diào)試源代碼
\rc 保存并且編譯
\rl 鏈接
\rr 運行
\ra 輸入運行時的參數(shù)
\rm make
\rg 輸入make時的參數(shù)
\rp 代碼檢查 splint
\ri 輸入代碼檢查splint的參數(shù)
\rd或者Ctrl+F5 源代碼
\rs 查看這個Csupport的設置
自動補全:
Ctrl+X Ctrl+L
整行補全
Ctrl+X Ctrl+N
根據(jù)當前文件里關(guān)鍵字補全
Ctrl+X Ctrl+K
根據(jù)字典補全
Ctrl+X Ctrl+T
根據(jù)同義詞字典補全
Ctrl+X Ctrl+I
根據(jù)頭文件內(nèi)關(guān)鍵字補全
Ctrl+X Ctrl+]
根據(jù)標簽補全
Ctrl+X Ctrl+F
補全文件名
Ctrl+X Ctrl+D
補全宏定義
Ctrl+X Ctrl+V
補全vim命令
Ctrl+X Ctrl+U
用戶自定義補全方式
Ctrl+X Ctrl+S
拼寫建議
Csupport(c.vim)的常用結(jié)構(gòu)補全操作:
-- 常用結(jié)構(gòu) ---------------------------------------------------------
\sd do { } while
\sf for
\sfo for { }
\sif if { }
\sife if { } else { }
\swh while { } (n,v,i)
\ss switch (n,v,i)
\sc case (n,i)
\s{ { } (n,v,i)
-- 預處理命令 -------------------------------------------------------
\p (n,i)
\p" #include "" (n,i)
\pd #define (n,i)
\pu #undef (n,i)
\pie #if #else #endif (n,v,i)
\pid #ifdef #else #endif (n,v,i)
\pin #ifndef #else #endif (n,v,i)
\pind #ifndef #def #endif (n,v,i)
\pi0 #if 0 #endif (n,v,i)
\pr0 remove #if 0 #endif (n,i)
\pe #error (n,i)
\pl #line (n,i)
\pp #pragma (n,i)
-- 常用短語 -------------------------------------------------------------
\im main() (n,v,i)
\i0 for( x=0; x
\in for( x=n-1; x>=0; x-=1 ) (n,v,i)
\ie enum + typedef (n,i)
\is struct + typedef (n,i)
\iu union + typedef (n,i)
\ip printf() (n,i)
\isc scanf() (n,i)
\ica p=calloc() (n,i)
\ima p=malloc() (n,i)
\isi sizeof() (n,v,i)
\ias assert() (n,v)
-- C++ ----------------------------------------------------------------
\+c class (n,i)
\+cn class (using new) (n,i)
\+ci class implementation (n,i)
\+cni class (using new) implementation (n,i)
\+mi method implementation (n,i)
\+ai accessor implementation (n,i)
\+tc template class (n,i)
\+tcn template class (using new) (n,i)
\+tci template class implementation (n,i)
\+tcni template class (using new) impl. (n,i)
\+tmi template method implementation (n,i)
\+tai template accessor implementation (n,i)
\+tf template function (n,i)
\+ec error class (n,i)
\+tr try ... catch (n,v,i)
\+ca catch (n,v,i)
\+c. catch(...) (n,v,i)
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/19742/showart_1724351.html |
|