By francis_hao Sep 22,2016
vim的功能自然不止如此,這里只是把日常使用頻率較高的記錄下來,若想了解vim的全部功能可查閱其幫助手冊:help,或者查詢指定命令的用法:help xx
選項
選項 |
說明 |
+[num] |
對第一個文件,在打開后,光標將會定位在第num行,如果num沒有指定,光標將會定位在最后一行 |
+/<pat> |
對第一個文件,光標將會定位在第一次出現pat的地方,查看":help search-pattern" 了解可用的搜索模式 |
-o[N] |
以橫向方式同時打開N個窗口,如果沒有指定N,就為每個文件打開一個窗口 |
-O[N] |
以縱向方式同時打開N個窗口,如果沒有指定N,就為每個文件打開一個窗口 |
基本用法
進入插入模式命令
i |
在光標前開始插入文本 |
a |
在光標后開始插入文本 |
o |
在當前行之下新開一行 |
O |
在當前行之上新開一行 |
光標移動命令
gg, :0 |
光標轉到首行行首 |
G, :$ |
光標轉到末行行首 |
0 |
光標移到本行行首 |
$ |
光標移到本行行尾 |
n+ |
光標下移n行 |
n- |
光標上移n行 |
nG, :n |
光標移至n行行首 |
Ctrl+u |
上翻半屏(up) |
Ctrl+d |
下翻半屏(down) |
Ctrl+b |
上翻一屏(backwards) |
Ctrl+f |
下翻一屏(forward) |
() |
句子移動 |
{} |
段落移動 |
H |
光標定位到屏幕頂部 |
M |
光標定位到屏幕中間 |
L |
光標定位到屏幕底部 |
w |
光標向前移動一個單詞(word) |
b |
光標向后移動一個單詞(back) |
e |
光標移動到當前單詞的結尾(end) |
zt |
將當前行變為屏幕第一行(top) |
zz |
將當前行變為屏幕中間行 |
zb |
將當前行變為屏幕尾行 |
Ctrl+e |
屏幕上移一行但光標位置不變 |
Ctrl+y |
屏幕下移一行但光標不變 |
刪除復制和替換
dd |
刪除整行 |
d0 |
從當前位置刪至行首 |
d$, D |
從當前位置刪至行尾 |
ndd |
刪除n行 |
dl |
刪除光標位置一個字符 |
dw |
刪除當前位置至單詞結尾 |
cc |
刪除當前行並進入插入模式,cl,cw類似d |
yy |
復制當前行,yl,yw類似d |
p |
粘貼 |
r |
修改光標所在位置字符 |
s |
刪除光標所在位置字符並進入插入模式 |
u |
撤銷上一次的操作 |
Ctrl+r |
恢復上一次的操作 |
查找和替換
/pattern |
從光標處開始向文件尾搜索pattern,在pattern后加\c可以不區分大小寫 |
?patern |
從光標處開始向文件首搜索pattern |
n |
在同一方向重復上一次搜索命令 |
N |
在反方向重復上一次搜索命令 |
: nohlsearch (noh) |
取消搜索結果的高亮顯示 |
:s/p1/p2/g |
將當前行中所有p1用p2替代 |
:n1,n2s/p1/p2/g |
將第n1至n2行中所有p1均用p2替代 :1,$從第一行到末行=% |
* |
向文件尾搜索匹配光標所在字 |
# |
向文件首匹配光標所在字 |
寄存器說明
vim里有許多寄存器,暫時只記錄平時有用過的。
"" |
默認寄存器,文本來源命令d/c/s/x/y |
"0 |
復制緩存,來源為yy命令 |
"1-"9 |
刪除緩存,來源為dd命令 |
"a-"z |
自定義的寄存器,不會被系統自動沖刷,總是存儲最后一次使用的值。 "A-"Z : 向"a-"z寄存器中追加新內容而不是覆蓋,雖然"A-"Z本身不是寄存器,但是卻可以引用。 |
"ayy |
復制當前行並將其存放在"a寄存器中 |
"_ |
黑洞寄存器,只進不出 |
:reg |
查看寄存器里的值(全名為:registers) |
eg:
下圖左側是vi中的文字,1yy表示第一次執行yy命令,以下以此類推,右側為執行后的寄存器中的值
擴展部分
雜項
v |
可視行 |
Ctrl+v |
可視列 |
Ctrl+g |
查看當前文件信息(文件名和行數) |
:!command |
暫時退出vi,執行command命令並輸出結果 |
!!command |
執行command命令並將執行結果輸出到當前行(覆蓋方式) |
!}command |
執行command命令並將執行結果輸出到當前行和之后的行中(覆蓋方式) |
:r hello |
將hello文件讀入當前文件中 |
:n1,n2 w>>fox |
將n1至n2追加到fox文件中 |
:Ex |
(:Explore)開啟目錄瀏覽,可以瀏覽當前目錄下的所有文件,可以選擇 |
:Sex |
(:Sexplore)水平分割當前窗口,並在一個窗口中開啟目錄瀏覽器 |
:shell |
不關閉vi切換到shell命令行,退回到vi使用:exit |
. |
重復上一個操作 |
多文件編輯
$vi f1 f2 f3 |
同時打開f1 f2 f3 |
:n |
切換到下一個文件(:next) |
:bn |
切換到下一個文件(:bnext) |
:prev |
切換到上一個文件(:previous) |
:bp |
切換到上一個文件(:bprevious) |
:n# |
切換最近兩個文件 |
:e# |
|
Ctrl+6 |
|
:buffers |
顯示緩沖區的文件列表 |
:ls |
|
:b buffnum |
切換到buffnum的文件,buffnum是緩沖文件列表的值 |
:bd buffnum |
關閉buffnum的文件(:bdelete ) |
:rewind |
切換到第一個文件 |
:e f4 |
在緩沖區添加新的文件,和之前打開的文件屬於並列關系 |
:e! |
重新載入當前文件,用在撤銷當前所有做過的修改 |
:mksession! [name.vim] |
保存多文件會話狀態 |
$vim –S name.vim |
vim重載之前的多文件會話狀態 |
:source name.vim |
手動重載之前會話 |
多標簽
$vim –p f1 f2 f3 |
以多標簽的方式打開多個文件 |
gt |
向右切換標簽 |
gT |
向左切換標簽 |
:tabnew filename |
添加一個新標簽 |
:tabc |
關閉當前的tab |
:tabo |
關閉其他的tab只留當前一個 |
:tabs |
查看所有打開的tab |
:tabp |
前一個 |
:tabn |
后一個 |
set
vimrc |
系統 vimrc 文件: "/etc/vimrc"(優先級低) 用戶 vimrc 文件: "$HOME/.vimrc" 第二用戶 vimrc 文件: "~/.vim/vimrc" 用戶 exrc 文件: "$HOME/.exrc"
vim的配置文件,一些配置信息可寫入此文件中,但也可以在打開的文件中使用:set以實現一次性的功能 |
:version |
查看vim版本信息 |
" |
.vimrc文件中的注釋行 |
:set paste |
設置為粘貼模式,所見即所得,不會因為注釋亂了格式 |
:set |
顯示常用的設置值 |
:set list |
顯示不可見字符 |
vi編碼
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
程序員專用
雜項
K |
跳轉到光標所在函數或命令的man手冊 |
J |
將當前行的下一行合並到當前行 |
% |
跳轉到匹配"{"對應的"}"的位置 |
gd |
跳到局部的變量定義處,不能跨文件 |
gf |
打開光標所在位置的文件名,一般是頭文件 ctrl+w f分屏打開文件 |
> |
縮進,<:反縮進 |
Ctrl+o |
跳轉到上一視圖,可用於搜索后、使用gg|G跳轉或tag跳轉的返回 |
''(兩個單引號) |
在上一視圖和本視圖之間切換 |
ma |
設置標簽a,之后可以通過`a跳轉到設置的標簽a處,類似的標簽:a-z |
~ |
可轉換光標所在位置的字母大小寫 |
gg=G |
整個文件重置縮進 |
2G=15G |
第二行至第15行重置縮進 |
:set ft=c |
設置文件類型是c (filetype) |
:filetype |
顯示當前文件類型相關的設置 |
文件比較
$vimdiff f1 f2 |
直觀的比較f1和f2的不同(vimdiff是shell下一個鏈接命令,指向vim) |
:vertical diffsplit xxx |
垂直方式比較當前文件和xxx文件 |
zo |
打開光標下面的一個折疊(open) |
zO |
打開光標下面的所有折疊 |
zc |
關閉光標下面的一個折疊(close) |
zC |
關閉光標下面的所有折疊 |
:set noscrollbind |
取消文件比較中的同步滾屏功能 |
]c |
跳到下一個修改點 |
[c |
跳到上一個修改點 |
:diffupdate |
在比較過程中,修改過一個文件后更新比較狀態 |
dp |
把光標所在窗口的差異改到另一個窗口(:diffput) |
do |
把光標所在窗口的差異改為另一個窗口的(:diffget) o=obtain |
:diffoff! |
強制關閉比較模式 |
窗口分割
:split xxx |
打開xxx並與當前文件水平排列 |
:vsplit xxx |
打開xxx並與當前文件垂直排列, |
:15split xxx |
以占據15行的窗口打開文件xxx |
:new [xxx] |
新建(打開)一個與當前文件水平排列的文件 |
:vnew [xxx] |
新建(打開)一個與當前文件垂直排列的文件 |
ctrl+w w |
在打開的文件中跳轉 |
Ctrl+w [hjkl] |
跳轉到[左下上右]的窗口 |
Ctrl+w [tb] |
跳轉到最上/最下的窗口 |
Ctrl+w [HJKL] |
把當前窗口移動到最[左下上右]邊 |
Ctrl+w + |
擴大窗口(默認一行),5ctrl+w +(擴大5行) |
Ctrl+w = |
平分窗口 |
Ctrl+w _ |
擴大窗口到最大,帶參數{height}ctrl+w _ |
:res(ize) num |
窗口大小調整為num行 |
:res(ize) +num |
窗口大小增加num行 |
:vertical res(ize) num |
窗口大小調整為num列 |
:close |
關閉當前的(不能是最后一個)的窗口 |
Ctrl+w c |
|
:only |
關閉除當前窗口外的所有窗口 |
:qall |
關閉所有打開的窗口 |
:wall |
保存所有的打開的窗口文件 |
:wqall |
保存並退出 |
$vim –o f1 f2 f3 |
以水平排列方式打開三個文件 |
$vim –O f1 f2 f3 |
以垂直排列方式打開三個文件 |
:all |
將已經打開的多個文件分配水平的窗口 |
:vertical all |
將已經打開的多個文件分配垂直的窗口 |
Ctrl+w o |
只顯示當前窗口, |
ctags
$ctags --list-languages |
顯示ctags支持的語言 |
$ctags --list-maps |
默認支持的文件擴展名 |
$ctags -R |
給當前文件夾下的所有文件建立tags |
~set tags=/tags |
在.vimrc文件中設置tags的路徑,如果有多個tags可以用","分割,或者set tags+=/tags進行添加。 |
:tag main |
可以從打開的文件中跳到main函數處,即使打開的文件中沒有main函數(在別的文件中也可以跳過去) |
Ctrl+] |
以光標所在位置的單詞為tag跳轉 |
Ctrl+t |
跳回到之前的位置,可以在前面加上跳轉的深度,3ctrl+t:跳回之前三層之上的位置 |
:tags |
列出已經跳轉到過哪些tag了 |
:tag /^block<tab> |
查找以block開頭的可能的tag |
Ctrl+w+] |
分割當前窗口並跳轉到光標所在位置的tag處 |
:stag xxx |
|
$vim –t tag |
找到tag(函數,結構體等)所在文件並打開 |
:tn |
多個匹配tags時跳轉下一個(:tnext) |
:tp |
多個匹配tags時跳轉上一個(:tprevious) |
本文由 劉英皓 創作,采用 知識共享 署名-非商業性使用-相同方式共享 3.0 中國大陸 許可協議進行許可。歡迎轉載,請注明出處:
轉載自:http://www.cnblogs.com/yinghao1991/p/6517071.html
參考
【1】VIM使用系列:寄存器與復制粘貼緩沖區:https://my.oschina.net/shelllife/blog/144357
【2】VIM字符編碼設置:http://www.cnblogs.com/freewater/archive/2011/08/26/2154602.html
【3】linux下vim中文亂碼的解決方法:http://www.cnblogs.com/joeyupdo/archive/2013/03/03/2941737.html
【4】VIM技巧之分隔窗口:http://blog.chinaunix.net/uid-24673811-id-1994607.html
【5】vim中多標簽和多窗口的使用:https://my.oschina.net/kutengshe/blog/464602
【6】開啟文件類型檢測:http://easwy.com/blog/archives/advanced-vim-skills-filetype-on/
【7】man vim