http://www.imtxc.com/blog/2012/04/25/vim-tips-and-experience/
首先明確一些環境和一些術語說明:
我所使用的是Debian Linux上的vim7.3版本;
下面的配置中,<C
表示Ctrl
鍵,比如<C-v>
表示按住Ctrl
後按v
鍵;
下面的配置中,<M
表示Alt
鍵,比如<M-t>
表示按住Alt
後按t
鍵;
我在說明中提到的“前”,一般的意思是“右或者下”,“後”的意思一般是“左或者上”;
我提到的“字”一般表示一個英文字母或者一個漢字;
我提到的“詞”表示一個英文單詞,對於中文的話,被英文/標點符號等隔開的就算一個詞而不是邏輯上的一個詞語。
一、基本操作篇
這部分的內容,不需要使用額外的外掛和設定檔,事實上我覺得這也是使用Vim首先必須熟悉掌握的一些操作。
1.切換模式
1 |
Esc C-[ C-c i I o O a A v V <C-v>
|
這些是切換模式的鍵,可以從在Linux的各種模式之間切換。
Esc C-c C-[
是從其他模式回到普通模式的操作,個人傾向Esc
,因為左手小拇指力量太小,總覺得不舒服,因人而異了
i/a
:在當前提示符前/後插入
I/A
:在vim中,大寫的命令其實可以分為對相應的小寫字母代表的命令的作用進行反向或者對整行作用,這裡的I/A命令,就是作用與整行,也就是在行首/末插入
o/O
:在當前行下/上行插入
v/V/<C-v>
是進入可視模式的命令,大寫V代表行選擇,代表塊選擇
2.重複命令
這兩個是非常重要的命令.
.
是重複執行上一次的動作,[N]
代表一個數字,跟移動、編輯、選擇命令一起使用,可以更加快速的進行以上操作。
3.移動命令
1 |
h j k l 0 ^ $ e E b B w W f F t ; , gg G H L M ENTER [[ ]] % :[N]
|
這些是Vim中的移動命令,就是在Normal模式下定位游標位置。
j/ENTER
:移動到下一行,需要移動到下N行的話,參考下面的[N]
這一段。
k
:上一行
h/l
:左/右移一個字元
ps: 這裡其實ENTER
命令基本不用,上下左右移動就用hjkl
即可,很多人剛開始用
vim就是被這幾個“彆扭”的鍵操作給嚇住,覺得很不適應,經常使用習慣之後,你就會覺得這樣的設計是多麼的優秀了,為了協助新手拋棄方向鍵(就是畫箭頭
的那四個鍵),我在下面的設定檔中進行了一點簡單的配置禁用了方向鍵,這樣可以加快新手熟悉Vim基本的鍵盤操作,但是這裡先不提設定檔,在下面介紹
到的時候,我會進行說明。
0 ^
, 這兩個命令都是把游標移動到行首,有一點區別,^
是移動到本行的第一個可見字元,而0
是移到整行的行首。
$
:定位到行末
e/b
往前/後移一個詞,e
命令移到到下個單詞後會定位到單詞的最後一個字元。
w
同樣往前移到一個單詞,移到到下個單詞的第一個字元
f/F
是快速的移動,f我這裡理解成find的意思,比如在this is a text line.
這樣的一行文本中,假設現在游標所處的位置是a,那麼我fn
,就會定位到line這個單詞的n字元處,同理,F
就是逆向尋找的意思了。
t
命令和f
差不多,不過上還是上個例子,如果用tn
的話,就會定位到line這個單詞的i字母處,也就是需要尋找的前一個字元處。
;
使用在上面的f/t
命令後,如果需要尋找下一個字元,就使用;
。
gg/G
:跳到檔案開始/末尾。
H/M/L
:跳到當前螢幕的頂部/中間/底部。
[[/]]
:移動到上/下一個段落,在C程式中,一般是上/下一個函數。
%
:用來跳到匹配的括弧/引號等,甚至可以在對應的條件編譯#if,#endif之間跳轉。
:[N]
:跳到指定行號N的行。比如:67
就會跳到第67行。
移動命令中當然還要提到跳轉命令m '
,其實也是移動命令
這兩個命令是配合使用的,跳轉命令,也可以叫做marks命令,就是在檔案的某些位置做上標記然後方便以後回到這個位置繼續編輯, 比如在檔案的某個位置使用ma
, 然後在檔案的另一個位置'a
之後就跳當剛才使用ma
記錄的位置。
然而,最常使用的跳轉命令是:
‘[
跳到上一次被改變的文本的第一個字元
'.
跳到上一次文本被修改的地方
''
跳回上一次跳轉的地方
'^
跳到插入模式最後一次結束的地方
這裡提到的移動命令,很多可以和前面提到的重複命令[N]
一起使用,比如5j
表示向下移動5行,5w
表示向前移動5個單詞等等。
4.編輯命令
1 |
x X d y p P "ayy "ap r R c o D C s S Y u C-r . << >>
|
x/X
是刪除當前游標下/游標前的一個字元。
d/c/y
是刪除/修改/複製命令,之所以把這三個命令放在一組介紹是以為這三個命令都可以和前面介紹的移動跳轉等命令一起使用,比如dd/yy
表示刪除/複製一行,dw/cw/yw
是刪除/修改/複製一個單詞,d$/c$/y$
表示刪除/修改/複製到行末,d^/y^
表示刪除/複製到行首,當然,這些命令還可以和重複命令組合,比如5dd
表示刪除5行,d/c/yfx
就是刪除/修改/複製到字元x,以此類推,還可以這樣使用的命令還有下面提到的v
命令。
靈活的組合前面介紹的這幾個命令,在寫代碼的過程中使用起來非常方便,比如:
df), yf), cf), vf)
從當前字元開始刪除(複製,改變,選中),直到遇到=之後
di), yi), ci), vi)
刪除(複製,修改,選擇)括弧內的內容
dt”, yt”, ct”, vt”
從當前字元開始刪除(複製,改變,選中),直到遇到”之前
diw, yiw, ciw, viw
刪除(複製,改變,選中)游標所在單詞
da”, ya”, ca”, va”
刪除(複製,改變,選中)””號內所有文本,包括引號本身
事實上刪除命令,在vim中就是剪下命令的意思。
p/P
命令,這兩個命令是粘貼的意思,分別表示在當前字元的前/後粘帖前面使用y/d複製或者剪下的內容。
當然,我們在使用的過程中,會遇到這樣的問題,分別在兩個地方刪除內容,然後需要分別粘貼,這樣的情況就需要用到"ayy "ap
這樣的命令了,"ayy
是把當前行複製到名字為a的寄存器中,"ap
就是在這裡粘帖a寄存器中的內容。
5.尋找/替換
從這裡開始,就要介紹一種Vim中的另一種模式:命令模式,在Normal模式下輸入:
就可以進入命令模式,Esc
返回普通模式。
/
向前尋找
?
向後尋找
n
重做最後一次/或?
N
反方向重做最後一次/或?
\c
尋找時忽略大小寫
\C
尋找時大小寫相關
*
向前尋找當前游標下的單詞
#
反方向尋找當前游標下的單詞
這裡,尋找和替換都可以配合Regex來使用。
6.記錄
我理解的記錄,也就是宏的意思。 q命令在使用過程中需要使用兩次: 第一次表示開 始記錄,第一次按下q之後還需要輸入一個字元表示要把記錄的宏存到哪個位置,第二次表示記錄的結束。 q需要@配合使用。 @是讀取指定寄存器中的操作記錄,並將這些操作順序 地重新執行一遍, 這裡舉一個例子說明,輸入1到100的數:
12345678 |
i1<ESC>qayyp<C-a>q100@a
|
7.多標籤
在編輯多個檔案的時候,使用多標籤可以方便的在不同檔案之間切換。
8.多視窗
如果螢幕夠大的話,使用多個視窗來編輯檔案要比多標籤更舒服,比如我可以在寫.c檔案的時候在旁邊用個視窗顯示對應的.h檔案的內容。
:sp {file}
橫向切割視窗,並在新視窗開啟file
:vsp {file}
豎向切割視窗,並在新視窗開啟file
C-w w
命令在不同視窗之間切換,在後面的設定檔中,我會提到通過定義設定檔來更加方便的在多個視窗之間進行切換。
二、設定檔篇
這部分,是通過設定檔,對vim進行定製使得更加符合自己的編輯習慣,我的完整設定檔在這裡,這裡對其中的部分進行說明。
關於備份檔案的配置
1234 |
set backup " Enable backupset backupdir=~/.vim/backup " Set backup directoryset directory=~/.vim/swap,/tmp " Set swap file directoryautocmd BufWritePre * let &backupext = strftime(".%m-%d-%H-%M") " Keep more backups for one file
|
搜尋模式裡面的一些配置
12345 |
set magic " Enable magic matchingset showmatch " Show matching bracetsset hlsearch " Highlight search thingsset smartcase " Ignore case when searchingset ignorecase
|
有用的鍵盤綁定
關於多標籤和多視窗編輯的鍵綁定
12345678910 |
nnoremap tp :tabprevious<CR>nnoremap tn :tabnext<CR>nnoremap to :tabnew<CR>nnoremap tc :tabclose<CR>nnoremap gf <C-W>gfnmap <silent> <C-k> <C-W><C-k>nmap <silent> <C-j> <C-W><C-j>nmap <silent> <C-h> <C-W><C-h>nmap <silent> <C-l> <C-W><C-l>
|
F[N]鍵的綁定:
1234567891011 |
nnoremap <silent> <F2> :TlistToggle<CR>:TlistUpdate<CR>nnoremap <F3> :Rgrep<CR>nmap <F4> :noh<cr><ESC>inoremap <F5> <C-R>=strftime("%Y-%m-%d %T %Z")<CR>nnoremap <F5> :w<CR>:make!<CR>nnoremap <F6> :w<CR>:make! %< CC=gcc CFLAGS="-Wall -g -O2"<CR>:!./%<<CR>inoremap <F6> <ESC>:w<CR>:make! %< CC=gcc CFLAGS="-Wall -g -O2"<CR>:!./%<<CR>nnoremap <silent> <F7> :botright copen<CR>nnoremap <silent> <F8> :cclose<CR>nnoremap <silent> <F9> :NERDTreeToggle<CR>nnoremap <silent> <F10> :set number!<CR>
|
禁用了方向鍵:
12345678 |
map <UP> <NOP>map <DOWN> <NOP>map <LEFT> <NOP>map <RIGHT> <NOP>inoremap <UP> <NOP>inoremap <DOWN> <NOP>inoremap <LEFT> <NOP>inoremap <RIGHt> <NOP>
|
autocmd
autocmd,就是vim根據判斷檔案格式自動執行的一些命令,具體關於autocmd的配置,可以參考我的完整設定檔,在設定檔中,對所有的配置都進行了注釋,有了前面這些命令和配置介紹的基礎,應該可以看明白並且根據自己的需要進行修改。
三、外掛程式介紹篇
使用vim,就免不了用到一些外掛來增強功能,我使用vim主要是在Linux下編輯C、Makefile、Markdown等檔案,因此我用到的外掛程式列表是這些 這裡對其中的部分外掛程式進行介紹
1.Vundle
首先必須介紹的是Vundle外掛程式,沒有用這個外掛程式之前,管理vim的外掛程式是一件很頭疼的事情,特別是安裝了某個外掛程式但是試用後覺得不好用然後要刪 除那個外掛程式的時候,總是很麻煩,經過搜尋,終於讓我找到了Vundle(Google又立功了), 當然使用vundle外掛程式你的系統中必須有git環境,關於git我打算改天寫篇專門的筆記來記錄學習Git進資料列版本設定時總結的一些知識,事實上關於 Git,網路上已經有很多很好的資料介紹了。
安裝&配置:
1 |
git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
|
然後在vimrc中添加如下內容:
12345 |
set rtp+=~/.vim/bundle/vundle/call vundle#rc()Bundle 'gmarik/vundle'Bundle 'vim-plugin-foo'Bundle 'vim-plugin-bar'
|
使用:
先在vimrc
中添加需要安裝的外掛程式比如:Bundle 'a.vim'
, 然後:BundleInstall
就可以安裝外掛程式。
在vimrc
中移除添加的外掛程式,然後:BundleClean
就可以刪除對應的外掛程式,下面介紹到的外掛程式都使用這種方式安裝。
2.SnipMate&SuperTab-continued
這組外掛程式用來自動補全一些內容,在寫代碼的時候非常方便使用。
使用:輸入某些文本(在snipmate外掛程式中進行定義)內容後,按tab
就可以補全,比如在C語言代碼檔案中可以補全的有main, if, inc, Inc, for等等。
3.DoxygenToolkit&The-NERD-Commenter
這一組外掛程式來給代碼檔案添加註釋。
配置:
12345678910 |
let g:DoxygenToolkit_authorName="Vortex - txc DOT yang AT gmail DOT com"let g:DoxygenToolkit_briefTag_funcName="yes"let s:licenseTag = "Copyleft(C)\<enter>"let s:licenseTag = s:licenseTag . "For free\<enter>"let g:DoxygenToolkit_licenseTag = s:licenseTaglet g:doxygen_enhanced_color=1map <leader>da :DoxAuthor<CR>map <leader>df :Dox<CR>map <leader>db :DoxLic<CR>map <leader>dc a /* */<LEFT><LEFT><LEFT>
|
使用:
在函數名稱上面,df
為改函數添加函數頭注釋
,da
可以添加檔案頭,其中的資訊在上面的設定檔中修改
,cc
注釋當前行
,cs
更性感的方式注釋代碼地區
,cu
取消注釋
,cA
在不同的注釋風格之間切換
4.repeat.vim&surround.vim
這一組外掛程式用來重複一些操作,是.
命令的加強版,具體的使用可以查看各自外掛程式的文檔,都有很詳細的例子。
5.vim-powerline
非常漂亮的狀態列定製外掛程式,安裝即可.
6.transpose-words
可以實作類別似Emacs中M-t
那樣交換單詞的外掛程式。
使用方法:比如在類似a = b
這樣的文本的任意位置按M-t
就可以修改為b = a
.
上面這些配置和外掛程式,是我在使用Vim過程中總結的一點知識,記錄在這裡方便遺忘的時候查閱也供同樣跟我一樣剛開始學習Vim的朋友們參考。
參考文章:
vim入門進階與折騰