這是我根據(jù)《Vim使用技巧 第二版》整理的,主要用于方便查找
x
刪除當(dāng)前字符
u
撤銷修改
.
重復(fù)動作
a
當(dāng)前位置插入
A
行末插入(=$a
)
R
由普通模式進(jìn)入替換模式
r
進(jìn)入替換模式替換一個字符
gR
進(jìn)入虛擬替換模式:按屏幕上實際顯示的寬度來替換字符,而不是按文件中所保存的字符進(jìn)行替換(它會把制表符當(dāng)成一組空格進(jìn)行處理)
gr
進(jìn)入虛擬替換模式替換一個字符
o
在下面插入一行并在下一行開頭進(jìn)入插入模式
O
在上面插入一行并在上一行開頭進(jìn)入插入模式
s
刪除當(dāng)前字符并進(jìn)入插入模式
[count]<Ctrl-a>
把當(dāng)前光標(biāo)之上或之后的第一個數(shù)字加上 [count](不輸入默認(rèn)為1)
在指令前加上[count]
可以指定指令重復(fù)的次數(shù)(但是能用重復(fù)就不要用次數(shù))
ga
以十進(jìn)制和十六進(jìn)制的形式 顯示出光標(biāo)所在字符的字符編碼
<Ctrl-w>
刪除前一個單詞
<Ctrl-u>
刪除至行首
<Ctrl-o>
進(jìn)入插入-普通模式:在此模式中,可以執(zhí)行一個普通模式命令,執(zhí)行完后,馬上又返回到插入模式
<C-r>{register}
粘貼
<C-r><C-p>{register}
按原義插入寄存器內(nèi)的文本,并修正任何不必要的縮進(jìn)
<C-r>={算式}
把計算的結(jié)果插入
<C-v>{123}
以十進(jìn)制字符編碼插入字符
<C-v>u{1234}
以十六進(jìn)制字符編碼插入字符
<C-v>{nondigit}
按原義插入非數(shù)字字符
<C-k>{char1}{char2}
插入以二合字母 {char1}{char2} 表示的字符
在可視模式中,要先選中選區(qū),然后再觸發(fā)修改命令。這種次序顛倒的方式對所有的操作符命令都適用
v
激活面向字符的可視模式
V
激活面向行的可視模式
<C-v>
激活面向列塊的可視模式
gv
重選上次的高亮選區(qū)
適用于遠(yuǎn)距離的操作
:[number]
跳轉(zhuǎn)到制定行
:{start},{end}
選擇一個范圍
@:
重復(fù)上一個Ex命令
@@
重復(fù)上一個 @:
的命令
<C-d>
顯示全部可以補全的命令
<C-r><C-w>
在命令中插入當(dāng)前光標(biāo)中的單詞
q/
打開查找命令歷史的命令行窗口
q:
進(jìn)入命令行窗口模式,在這個模式下上下選擇歷史命令的時候,按回車執(zhí)行;你甚至可以在這個模式里用正常的方式修改歷史命令
:!{cmd}
調(diào)用外部命令
:shell
啟動一個交互的shell會話
:read !{cmd}
在shell 中執(zhí)行 {cmd} ,并把其標(biāo)準(zhǔn)輸出插入光標(biāo)下方
:[range]write !{cmd}
在 shell 中執(zhí)行 {cmd} ,以 [range] 作為其標(biāo)準(zhǔn)輸入
:[range]!{filter}
使用外部程序 {filter} 過濾指定的 [range]
:source *.vim
執(zhí)行Ex腳本
:argdo {Ex命令}
對參數(shù)列表內(nèi)的所有緩沖區(qū)執(zhí)行一條Ex命令
.
代表當(dāng)前行的地址
%
代表當(dāng)前文件中的所有行
/{tag}/
{tag} 所在行
:{address}+n
偏移行
:[range]t{address}
復(fù)制 [range] 內(nèi)容到 {address}
:[range]m{address}
移動 [range] 內(nèi)容到 {address}
:[range]normal{操作}
對 [range] 行進(jìn)行普通模式的 {操作}
當(dāng)一個操作符命令被連續(xù)調(diào)用兩次時,它會作用于當(dāng)前行。如 dd
刪除當(dāng)前行
c
修改(比刪除多一個進(jìn)入插入模式)
g~
反轉(zhuǎn)大小寫
gu
轉(zhuǎn)換為小寫
gU
轉(zhuǎn)換為大寫
>
增加縮進(jìn)
<
減少縮進(jìn)
=
自動縮進(jìn)
!
使用外部程序過濾{motion}所跨越的行
gg
將光標(biāo)定位到文件的開頭
G
將光標(biāo)定位到文件的末尾
aw
表示整個單詞
ap
表示整個段落
cw
刪除從光標(biāo)位置到單詞結(jié)尾間的字符,并進(jìn)入插入模式
dw
刪除從光標(biāo)起始位置到單詞結(jié)尾的內(nèi)容
db
刪除從光標(biāo)起始位置到單詞開頭的內(nèi)容,但會原封未動地留下最后一個字符
daw
刪除整個單詞(delete a word,推薦使用)
往前刪除不會刪除光標(biāo)本身,往后刪除會,光標(biāo)看最左邊就好理解了
:ls
列出所有被載入內(nèi)存中的緩沖區(qū)的列表,% 符號指明哪個緩沖區(qū)在當(dāng)前窗口中可見,# 符號則代表輪換文
件。按 <C-^> 可以在當(dāng)前文件和輪換文件間快速切換
:pwd
打印工作目錄(print working directory)
命令 | 用途 |
---|---|
:bnext |
切換到列表中的下一個緩沖區(qū) |
:bprev |
切換到列表中的上一個緩沖區(qū) |
:bfirst |
跳到列表的開頭 |
:blast |
跳到列表的結(jié)尾 |
:bdelete N1 N2 N3 或 :N,M bdelete |
刪除緩沖區(qū) |
Glob模式 | 所匹配的文件 |
---|---|
:args *.* |
index.html app.js |
:args **/*.js |
app.js lib/framework.js app/controllers/Mailer.js ...etc |
:args **/*.* |
app.js index.html lib/framework.js lib/theme.css app/controllers/Mailer.js ...etc |
:args `cat .chapters`
Vim 會在 shell 中執(zhí)行反撇號(')括起來的命令,然后把 cat 命令的輸出作為 :args 命令的參數(shù)。雖然本例是用 cat 命令獲取 .chapters 文件的內(nèi)容,但實際上可以用這種方式執(zhí)行任意可用的shell命令。
the_vim_way.pml
normal_mode.pml
insert_mode.pml
visual_mode.pml
命令 | 用途 |
---|---|
<C-w>s |
水平切分當(dāng)前窗口,新窗口仍顯示當(dāng)前緩沖區(qū) |
<C-w>v |
垂直切分當(dāng)前窗口,新窗口仍顯示當(dāng)前緩沖區(qū) |
:sp[lit] {file} |
水平切分當(dāng)前窗口,并在新窗口中載入{file} |
:vsp[lit] {file} |
垂直切分當(dāng)前窗口,并在新窗口中載入{file} |
命令 | 用途 |
---|---|
<C-w>w |
在窗口間循環(huán)切換 |
<C-w>h |
切換到左邊的窗口 |
<C-w>j |
切換到下邊的窗口 |
<C-w>k |
切換到上邊的窗口 |
<C-w>l |
切換到右邊的窗口 |
實際上,<C-w><C-w>
完成的功能和 <C-w>w
相同,就是說可以一直按住 <Ctrl>
鍵,然后輸入 ww
(或 wj
,或上表的其他命令)來切換活動窗口。<C-w><C-w>
要比 <C-w>w
更容易按一些,盡管寫出來時它顯得更繁瑣。
(h, j, k, l 和上下左右方向鍵是等效的)
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:clo[se] |
<C-w>c |
關(guān)閉活動窗口 |
:on[ly] |
<C-w>o |
只保留活動窗口,關(guān)閉其他所有窗口 |
也可以拖拽鼠標(biāo)
命令 | 用途 |
---|---|
<C-w>= |
使所有窗口等寬、等高 |
<C-w>_ |
最大化活動窗口的高度 |
<C-w>| |
最大化活動窗口的寬度 |
[N]<C-w>_ |
把活動窗口的高度設(shè)為[N]行 |
[N]<C-w>| |
把活動窗口的高度設(shè)為[N]列 |
:lcd {path}
設(shè)置當(dāng)前窗口的本地工作目錄
:windo lcd {path}
為一個標(biāo)簽頁中的所有窗口設(shè)置本地工作目錄
命令 | 用途 |
---|---|
:tabe[dit] {filename} |
在新標(biāo)簽頁中打開 {filename} |
<C-w>T |
把當(dāng)前窗口移到一個新標(biāo)簽頁 |
:tabc[lose] |
關(guān)閉當(dāng)前標(biāo)簽頁及其中的所有窗口 |
:tabo[nly] |
只保留活動標(biāo)簽頁,關(guān)閉所有其他標(biāo)簽頁 |
Ex命令 | 普通模式命令 | 用途 |
---|---|---|
:tabn[ext] {N} |
{N}gt |
切換到編號為 {N} 的標(biāo)簽頁 |
:tabn[ext] |
gt |
切換到下一標(biāo)簽頁 |
:tabp[previous] |
gT |
切換到上一標(biāo)簽頁 |
:tabmove [N]
重新排列標(biāo)簽頁。當(dāng) [N] 為0時,當(dāng)前標(biāo)簽頁會被移到開頭;如果省略了 [N],當(dāng)前標(biāo)簽頁會被移到結(jié)尾。如果終端支持鼠標(biāo),或是正在使用 GVim,:那么也可以通過鼠標(biāo)拖曳來進(jìn)行重排操作。
:edit {file}
打開相對于工作目錄的文件路徑
:edit %:h<Tab>
% 符號代表活動緩沖區(qū)的完整文件路徑,按 <Tab>
鍵會將其展開,:h
修飾符會去除文件名,但保留路徑中的其他部分
:find {file}
在 path 里查找文件并打開
:set path+={path}
把 {path} 加入查找路徑中
:edit {file}
命令一般用于打開一個已存在的文件,然而如果指定了一個不存在的文件路徑,Vim 就會創(chuàng)建一個新的空白緩沖區(qū)。
:!mkdir -p %:h
-p
參數(shù)使 mkdir
創(chuàng)建任何不存在的中間目錄,%:h
為不包含文件名的路徑
:w !sudo tee % > /dev/null
命令 | 光標(biāo)動作 |
---|---|
j |
向下移動一個實際行 |
gj |
向下移動一個屏幕行 |
k |
向上移動一個實際行 |
gk |
向上移動一個屏幕行 |
0 |
移動到實際行的行首 |
g0 |
移動到屏幕行的行首 |
^ |
移動到實際行的第一個非空白字符 |
g^ |
移動到屏幕行的第一個非空白字符 |
$ |
移動到實際行的行尾 |
g$ |
移動到屏幕行的行尾 |
j, k, 0, $ 都用于實際行,加上 g 前綴用于屏幕行
命令 | 光標(biāo)動作 |
---|---|
w |
正向移動到下一單詞的開頭 |
b |
反向移動到當(dāng)前單詞/上一單詞的開頭 |
e |
正向移動到當(dāng)前單詞/下一單詞的結(jié)尾 |
ge |
反向移動到上一單詞的結(jié)尾 |
先學(xué)會用 w 和 b
W, B, E 和 gE 對應(yīng)”字串“的操作
下表為行內(nèi)操作
命令 | 用途 |
---|---|
f{char} |
正向移動到下一個 {char} 所在之處 |
F{char} |
反向移動到上一個 {char} 所在之處 |
t{char} |
正向移動到下一個 {char} 所在之處的前一個字符上 |
T{char} |
反向移動到上一個 {char} 所在之處的后一個字符上 |
; |
重復(fù)上次的字符查找命令 |
, |
反轉(zhuǎn)方向查找上次的字符查找命令 |
/{word}
或者 把光標(biāo)移到單詞上按*
查找單詞
n
向下重復(fù)上一次查找單詞操作
N
向上重復(fù)上一次查找單詞操作
選擇時光標(biāo)必須在分割符內(nèi)
一般以 i 開頭的文本對象會選擇分隔符內(nèi)部的文本,而以 a 開頭的文本對象會選擇包括分隔符在內(nèi)的整個文本。為了便于記憶,可以把 i 想成“inside”,而把 a 想成“around”或“all”。
文本對象 | 選擇區(qū)域 | 文本對象 | 選擇區(qū)域 |
---|---|---|---|
a) 或 ab |
一對圓括號 (parentheses) | i) 或 ib |
圓括號 (parentheses) 內(nèi)部 |
a} 或 aB |
一對花括號 {braces} | i} 或 iB |
花括號 {braces} 內(nèi)部 |
a] |
一對方括號 [brackets] | i] 方括號 |
[brackets] 內(nèi)部 |
a> |
一對尖括號 |
i> |
尖括號 |
a' |
一對單引號 'single quotes' | i' |
單引號 'single quotes' 內(nèi)部 |
a" |
一對雙引號 "double quotes" | i" |
雙引號 "double quotes" 內(nèi)部 |
a` | 一對反引號 backticks | i` |
反引號 backticks 內(nèi)部 | ||
at |
一對 XML 標(biāo)簽 |
it |
XML標(biāo)簽 |
文本對象 | 選擇范圍 |
---|---|
iw |
當(dāng)前單詞 |
aw |
當(dāng)前單詞及一個空格 |
iW |
當(dāng)前字串 |
aW |
當(dāng)前字串及一個空格 |
is |
當(dāng)前句子 |
as |
當(dāng)前句子及一個空格 |
ip |
當(dāng)前段落 |
ap |
當(dāng)前段落及一個空行 |
一般來說,d{motion} 命令和 aw、as 和 ap 配合起來使用比較好,而 c{motion} 命令和 iw 及類似的文本對象一起用效果會更好。
m{a-zA-Z}
用選定的字母標(biāo)記當(dāng)前光標(biāo)所在位置。小寫位置標(biāo)記只在每個緩沖區(qū)局部可見,大寫位置標(biāo)記則全局
可見。
`{mark}
把光標(biāo)移動到設(shè)置此位置標(biāo)記時光標(biāo)所在之處
'{mark}
跳到位置標(biāo)記所在行,并把光標(biāo)置于該行第一個非空白字符上
位置標(biāo)記 | 跳轉(zhuǎn)到 |
---|---|
`` |
當(dāng)前文件中上次跳轉(zhuǎn)動作之前的位置 |
`. |
上次修改的地方 |
`^ |
上次插入的地方 |
`[ |
上次修改或復(fù)制的起始位置 |
`] |
上次修改或復(fù)制的結(jié)束位置 |
`< |
上次高亮選區(qū)的起始位置 |
`> |
上次高亮選區(qū)的結(jié)束位置 |
%
在一組開、閉括號間跳轉(zhuǎn)
在 .vimrc
中加入以下內(nèi)容可以激活 matchit 插件,它可以使 % 在配對的關(guān)鍵字間跳轉(zhuǎn):
set nocompatible
filetype plugin on
runtime macros/matchit.vim
:jumps
查看跳轉(zhuǎn)列表
<C-o>
后退
<C-i>
前進(jìn)
:changes
查看改變列表
g;
反向
g,
正向
把光標(biāo)放到某個字符串上執(zhí)行 gf
命令,可以跳轉(zhuǎn)到該文件。
指定擴(kuò)展名:suffixesadd 選項允許指定一個或多個文件擴(kuò)展名,當(dāng) Vim 用gf 命令搜尋文件名時,會嘗試使用這些擴(kuò)展名,用下面的命令可以設(shè)置此選項:
:set suffixesadd+=.h
指定搜尋目錄:設(shè)置 path(同上 find 的使用)
{register}x
剪切字符
{register}d
剪切
{register}y
復(fù)制
{register}p
粘貼到光標(biāo)后
{register}P
粘貼到光標(biāo)前
{register}gp
粘貼到光標(biāo)后,光標(biāo)移動到被粘貼出來的文本結(jié)尾
{register}gP
粘貼到光標(biāo)前,光標(biāo)移動到被粘貼出來的文本結(jié)尾
:reg {register}
查看寄存器內(nèi)容
"0
復(fù)制專用寄存器
"a - "z
有名寄存器
_
黑洞寄存器
"+
系統(tǒng)剪貼板
"*
選擇專用寄存器
"=
表達(dá)式寄存器
寄存器 | 內(nèi)容 |
---|---|
"% |
當(dāng)前文件名 |
"# |
輪換文件名 |
". |
上次插入的文本 |
": |
上次執(zhí)行的Ex命令 |
"/ |
上次查找的模式 |
交換單詞:在可視模式下使用 p 命令時,Vim將用指定的寄存器內(nèi)容來替換高亮選區(qū)中的文本,高亮選區(qū)中的內(nèi)容與寄存器的文本被調(diào)包了。
在錄制宏的過程中,禁止使用鼠標(biāo)
q{register}
開始錄制(如果 register 是大寫,新內(nèi)容會被追加到對應(yīng)小寫寄存器的后面)
q
停止錄制
@{register}
執(zhí)行宏
@@
重復(fù)最近調(diào)用過的宏
:normal @{register}
在高亮選區(qū)中的每一行上執(zhí)行這個宏
\c
查找模式忽略大小寫
\C
查找模式強制大小寫
\v
表示特殊含義
\V
使得其后的模式中只有反斜杠有特殊的意義
模式 | 說明 |
---|---|
#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\) |
使用 magic 搜索模式時,必須轉(zhuǎn)義 (、)、以及 { 字符,賦予它們特殊的含義 |
\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3}) |
使用 \v 模式開關(guān)后,(、)、以及 { 字符會表現(xiàn)出特殊含義 |
\v#(\x{6}|\x{3}) |
使用 \x 字符類代替 [0-9A-Fa-f],可以進(jìn)一步精簡表達(dá)式 |
任何圓括號內(nèi)部的匹配文本都會自動保存到一個臨時的倉庫,可以用 \1 引用這段被捕獲的文本。如果模式中包含不止一組圓括號,則可以用 \1、\2,直到 \9,引用被每對 () 捕獲的子匹配。另外,不論模式中是否使用了圓括號,元字符 \0 永遠(yuǎn)會引用整個匹配。在括號前加上 % 可以不把內(nèi)容賦值到寄存器中。
<
與 >
兩符號將用于匹配單詞的邊界,它們本身不匹配任何字符,僅表示單詞與圍繞此單詞的空白字符(或標(biāo)點符號)之間的邊界。
例: /\v<(\w+)\_s+\1>
專門用于匹配重復(fù)單詞
元字符 \zs 標(biāo)志著一個匹配的起始,元字符 \ze 則用來界定匹配的結(jié)束。
例:如果查找 /Practical Vim
,文檔中所有出現(xiàn) “Practical Vim” 的地方都會被高亮起來。一旦將查找模式改為 /Practical \zsVim
,則只有單詞 “Vim” 會被高亮,而單詞 “Practical” 會被排除于匹配之外,但它仍是模式的一部分。這樣一來,只有緊跟著單詞 “Practical” 的 “Vim” 才會被高亮,其他前面不是 “Practical” 的 “Vim” 則不會被匹配。這與通過 /Vim
命令進(jìn)行簡單查找的結(jié)果有很大不同。
命令 | 用途 |
---|---|
n |
跳至下一處匹配,保持查找方向與偏移不變 |
N |
跳至上一處匹配,保持查找方向與偏移不變 |
/<CR> |
正向跳轉(zhuǎn)至相同模式的下一處匹配 |
?<CR> |
反向跳轉(zhuǎn)至相同模式的上一處匹配 |
gn |
進(jìn)入面向字符的可視模式,并選中下一處匹配 |
gN |
進(jìn)入面向字符的可視模式,并選中上一處匹配 |
正向查找時要轉(zhuǎn)義 / 字符,反向查找時要轉(zhuǎn)義 ? 號,每次都要轉(zhuǎn)義符號 \
escape({string}, {chars})
{chars} 參數(shù)將指定哪些字符需要用反斜杠轉(zhuǎn)義
在最后添加 /e
可以讓光標(biāo)停留在查找匹配的結(jié)尾
/{something}
:%s///gn
或者
/{something}
:vimgrep //g %
前者告訴我們總數(shù),后者告訴我們每個所在的位置
:[range]s[ubstitute]/{pattern}/{string}/[flags]
輸入 <C-r>{register}
可以將寄存器的內(nèi)容插入命令行
標(biāo)志位 g 使得 subsititute 命令可在全局范圍內(nèi)執(zhí)行,即可以修改一行內(nèi)的所有匹配,而不僅僅是第一處匹配。
標(biāo)志位 c 讓我們有機會可以確認(rèn)或拒絕每一處修改。
標(biāo)志位 n 會抑制正常的替換行為,即讓 Vim 不執(zhí)行替換操作,而只是報告本次 substitute 命令匹配的個數(shù)。
標(biāo)志位 e 專門用于屏蔽錯誤提示。
標(biāo)志位 & 僅僅用于指示 Vim 重用上一次 substitute 命令所用過的標(biāo)志位。
符號 | 描述 |
---|---|
\r |
插入一個換行符 |
\t |
插入一個制表符 |
\\ |
插入一個反斜杠 |
\1 |
插入第1個子匹配 |
\2 |
插入第2個子匹配(以此類推,最多到 \9) |
\0 |
插入匹配模式的所有內(nèi)容 |
& |
插入匹配模式的所有內(nèi)容 |
~ |
使用上一次調(diào)用 :substitute 時的 {string} |
\={Vim script} |
執(zhí)行 {Vim Script} 表達(dá)式;并將返回的結(jié)果作為替換 {string} |
答案 | 用途 |
---|---|
y |
替換此處匹配 |
n |
忽略此處匹配 |
q |
退出替換過程 |
l |
“l(fā)ast” —— 替換此處匹配后退出 |
a |
“all” —— 替換此處與之后所有的匹配 |
<C-e> |
向上滾動屏幕 |
<C-y> |
向下滾動屏幕 |
:cfdo {cmd}
修改所有 quickfix 列表上的文件
:[range] global[!] /{pattern}/ [cmd]
在缺省情況下,global 命令的作用范圍是整個文件。
{pattern} 域與查找歷史相互關(guān)聯(lián)。
global! 將指示 Vim 在沒有匹配到指定模式的行上執(zhí)行 [cmd]