Vim 大法

命令執行格式
(command) (number) (text object)
(number) (command) (text object) 
基礎操作
ZZ 或 :wq                 保存并退出
:e!                       恢復到上一次存儲的文件內容
:w pathname/filename      寫入到其他文件中
:rf pathname/filename     刪除其他文件
:!ls pathname             查看其他目錄使用情況
:sh -> ctrl-d 或 exit     創建對應的 shell 執行其任務后再返回
ctrl-z -> fg              暫停 vi 后執行對應的任務后再返回
按字符光標移動
h/l                       左/右 移動一個字符
4l                        向右 4 個字符
按行光標移動
0                         移動到行首
$                         移動到行尾
^                         移到當前行第一個非空格處
10|                       移到當前行第 10 列

j/k                       上一行/下一行
2j                        向上移動 2 行

G                         移動到文件的結尾
1G                        移動到文件的第一行
ctrk-g                    屏幕底部顯示信息, 包含行號, 文件總行數, 當前位置占全文的百分比
按照文本塊移動
w                        移動一個單詞, 包含符號與標點
W                        移動一個單詞, 不包含符號與標點
2w                       移動兩個單詞

b                        倒退一個單詞, 包含符號與標點
B                        倒退一個單詞, 不好干符號與標點

e                        移到單詞的尾部
E                        移到單詞的尾部, 忽略標點符號

(                        移到當前句子的開頭, 標點符號后有兩個空格或者一行的最后一個非空格字符時候為一個句子
)                        移到下一個句子的開頭
3)                       向上移動 3 個句子

{                        移到當前這一段的開頭, 段落指的是空白行下的文本
}                        移到下一段的開頭

[[                       移到當前這一節的開頭
]]                       移到下一節的開頭
簡單的文件編輯
i                        insert, 插入
a                        add, 添加
c                        change, 更改
d                        delete, 刪除后放到緩沖區
p                        paste, 粘貼, d -> p 可以移動行
y                        復制

cw                       表示更改整個單詞

x                        刪除一個字符
r                        重寫改寫一個字符
添加文本
a                        光標之后添加
A                        行結尾添加

i                        光標之前添加
I                        行開頭添加

o                        光標位置下一行打開新行添加
O                        光標位置上一行打開新行添加
修改文本, 需告知有多少文本要修改, 可結合光標移動命令使用
cw                       光標到單詞結尾要修改, 因此可以用英語單詞的部分修改, 只要光標停留在需要修改的開始位置即可
c2b                      光標往前 2 個字符
c$ 或 C                  光標到本行結尾
c0                       光標到此行開頭
cc                       修改整行文本
替換文本
r                        替換一個字符
2r                       同時替換兩個字符
R                        替換整行, 逐漸覆蓋

s                        替換一個字符, 先刪除字符, 并進入插入模式, 因此可以用于將一個字符替換為多個的情況
S                        替換整行, 先刪除整行, 并進入插入模式
修改大小寫
~                        修改一個字符為大寫或者小寫
3~                       修改三個字符為大寫或者小寫
刪除文本, 需要告知有多少文本需要刪除, 可結合光標移動命令使用
dw                      刪除光標到單詞尾部的字符, 包含單詞尾部的空白
de                      刪除光標到單詞本身尾部的字符, 不包含尾部后邊的空白
dE                      刪除光標到單詞尾部, 包含標點符號

db                      向前刪除一個字符
d0                      刪除光標到行開頭的字符
d$ 或 D                 刪除光標到結尾的字符

dd                      刪除一整行字符
2dd                     刪除兩行字符

x                       x-ing out 打印機消除的意思, 刪除一個字符
2x                      刪除兩個字符
X                       刪除光標之前的一個字符
2X                      刪除光標之前的兩個字符
誤刪恢復
u                       撤銷上一個命令
3p                      將第三個緩沖區放到下一行, 默認保留九個緩沖區
ctrl-r                  重做一次撤銷操作
移動文本, 采用先刪除后放置的方法
p                       將緩沖區文本放到光標之后, 單行則放到同一行, 多行緩沖區則另起一行
P                       將緩沖區文本放到光標之前
xp                      對調兩個字符
復制文本, 需要告知有多少文本需要復制, 可結合光標移動命令使用
yw                      復制光標到單詞尾部的字符
y0                      復制光標到行開頭的字符
y$                      復制光標到行結尾的字符
yy 或 Y                  復制整行內容
重復命令, 每個命令均會被存儲到一個臨時的緩沖區, 直到發出下一個命令為主
.                       重復上一次的命令
合并行
J                        合并兩行, 將當前行與下一行合并
3J                       合并三行
編輯命令
文本對象 更改 刪除 復制
單個字符 r x yl
五個字符 5s 5x y5l
一個單詞 cw dw yw
兩個單詞, 不包含標點符號 c2W d2W y2W
后退三個單詞 c2b d2b y2b
一整行 cc dd yy
到一行的結尾 c$ 或 C d$ 或 D y$
到一行的開頭 c0 d0 y0
光標移動命令
移動
命令
←↓↑→
hjkl
下一行第一個字符
+
上一行第一個字符
-
單詞結尾
e 或 E
往前一個單詞
w 或 W
往后一個單詞
b 或 B
到一行的結尾
$
到一行的開頭
0
往緩沖區放置文本
p 或 P
保存編輯結果并離開
ZZ
不保存編輯結果并離開
:q!
光標所在位置插入文本
i
一行開頭插入文本
I
光標所在位置附加文本
a
一行最后附加文本
A
光標下一行打開新行
o
光標上一行打開新行
O
刪除一行并替換文本
S
新文本覆蓋現有文本
R
合并當前行與下一行
J
重復上一個動作
.
撤銷上一個動作
u

滾動屏幕
z-enter               移動當前行到屏幕頂端并滾動屏幕
z.                    移動當前行到屏幕中心并滾動屏幕
z-                    移動當前

ctrl-f                forward, 向上滾動一屏
ctrl-b                backward, 向下滾動一屏

ctrl-u                up, 向上滾動半屏
ctrl-d                down, 向下滾動半屏

100z                  將第一百行滾動到屏幕頂端
光標在屏幕中移動
H                    high, 移到屏幕頂端的行
M                    middle, 移到屏幕中間的行
L                    low, 移到屏幕底部的行
10H                  移到屏幕頂端往下的第十行
10L                  移到屏幕底部往上的第十行
根據搜索模式來移動
/                    向下匹配搜索
?                    向上匹配搜索
n                    往同一個方向重復搜索
N                    往相反方向重復搜索
在當前行搜索
fx                   光標移到本行出現下一個 x 字符的地方
2fx                  搜索本行第二次出現 x 字符的地方
Fx                   光標移到本行出現上一個 x 字符的地方

tx                   光標移到本行出現下一個 x 字符的地方的前一個字符
Tx                   光標移到本行出現上一個 x 字符的地方的后一個字符

;                    重復上一個搜索命令, 方向相同
,                    重復下一個搜索命令, 方向相反

''                   回到上一個包含記號的行開頭
``                   回到上一個記號或上下文
百花齊放的打開文件
vi  +n  file        在第 n 行打開文件
vi  + file          在最后一行打開文件
vi  +/pattern file  在第一個出現 pattern 的地方打開文件
vi  -R  file        只讀模式顯示文件
vi  -r  file        恢復編輯緩沖區
緩沖區使用
# vi 會將最后 9 次的刪除操作保存在編號的緩沖區中, 1-9 的緩沖區, 1 表示最后一次的刪除
# vi 會將復制的文本放在按字母標識的緩沖區中, a-z 的緩沖區

"1p                恢復最后一次的刪除內容, 光標之后插入
"1pu.              逐一將緩沖區內容放置到當前光標之后, u會刪除文本, .則重復放置, 不斷輪換知道找到所需的文本

"dyy               將當前行復制到緩沖區 d 中, "加上緩沖區名字, 可以用于命名緩沖區
"dP                將緩沖區 d 中內容放置到光標之前
對某一處做標記
mx                將當前位置標記成 x

'x                單引號, 將光標移動到 x 標記所在的第一行
''                兩個單引號, 回到上一個標記或上下文所在行的開頭

`x                反引號, 將光標移到以 x 標記的字符位置
``                兩個反引號, 回到上一個標記或上下文的確切位置
vi 緩沖區與標記命令
命令 意義
+n file 在第 n 行打開 file
+ file 在最后一行打開 file
+ /pattern file 在第一個出現 pattern 的地方打開 file
-c command file 在打開文件后執行命令, 通常是行號或者搜索模式, eg: vi -c /gitlab practice.txt
-R 用只讀模式打開文件, 與 view 命令相同
-r 死機后恢復文件
1-9 最后 9 次刪除操作的內容, 最后一次-最先一次
a-z 可以使用的命名緩沖區, 大寫字母表示附加到緩沖區現有內容后
"b command 用緩沖區b 執行命令
mx 將當前位置標記為 x
'x 將光標移動到標記 x 所在行的第一個字符
~x 將光標移動到用 x 標記的字符
'' 回到上一個標記或上下文所在行的開頭
`` 回到上一個標記或上下文的確切位置
ex 命令
:1p                         打印第 1 行
:1                          打印第 1 行
:1,3                        打印 1-3 行

:1s/GitLab/gitlab           替換第一行的 GitLab 為 gitlab
:s/GitLab/gitlab            在當前行替換 GitLab 為 gitlab

:vi                         ex 模式下轉換為 vi 模式
Q                           vi 模式下轉換為 ex 模式

:1,3d                       delete 可簡寫為 d, 刪除第 1 行到第 3 行
:1m2                        move 可簡寫為 m, 將第 1 行移到第 2 行之后
:1co2                       copy 可簡寫為 co, 與 t 同意, 將第 1 行復制到第 2 行之后

:set nu                     number 可簡寫為 nu, 設置顯示行號
:set nonu                   no number 可簡寫為 nobu, 禁用顯示行號
:1,10#                      暫時顯示 1-10 行的行號

:=                          列出文件的總行數
:.=                         列出當前所在行的行號
:/pattern/=                 列出 patter 第一次出現的行號

:.                          表示當前這一行
:$                          表示文件最后一行
:%                          表示文件中每一行
:.,+20#                     顯示當前這一行以及向下 20 行直接的行號
ex 搜索模式
:/pattern/d                 刪除下一個包含 pattern 的行
:.,/pattern/d               刪除當前行以及第一個包含 pattern 的行

:100, +5 p                 表示打印 當前行+5 到 100 行之間的內容
:100;+5 p                  打印 100-105 行之間的內容, 使用分號時候第一行地址會被當做當前光標的位置
:/pattern;+10 p            顯示包含 pattern 行的后十行內容

:g/pattern                尋找文件中最后一次出現 pattern 的地方, g 表示全局, 可以讓搜索模式顯示并包含這個模式的所有行
:g/pattern/p              尋找并顯示所有包含 pattern 的行
:g!/pattern/nu            尋找并顯示不包含 pattern 的行, 并展示對應的行號
:1,10g/pattern            尋找 1-10 行中包含 pattern 的行

:1d | s/This/this         刪除第一行, 并在當前行(原來的第二行)中替換 This 為 this
ex 的保存于離開文件
:w                        將緩沖區內容寫入到文件中, 但不離開
:q                        離開編輯器
:wq                       寫入并離開,即使文件無任何修改也一樣會寫入
:x                        寫入文件同時離開, 僅當有修改時才會寫入
:!                        忽略警告, vi 會保護現有文件, 當需要將緩沖區內容寫入到文件中會有警告產生

:w newfile               將緩沖區內容寫入到新的文件, 原有的文件不會改變
:1,10w newfile           將緩沖區中 1-10 寫入到新的文件
:1,10w >> newfile        將緩沖區 1-10 行內容附加到新文件中

:r newfle                read 可簡寫為 r, 將新文件內容讀出并插入到光標所在位置的下一行
:2r newfile              將新文件內容插入到第 2 行之后
:0r newfile              將新文件內容插入到文件開頭
vi 多文件編輯
:n                      跳轉到下一個文件
:first                  跳轉到第一個文件
:last                   跳轉到最后一個文件

:e filename             啟動一個文件, 存在則打開, 不存在則新建, 可以 tab 補全
:e #                    回到上一個文件, 需要將緩沖區內容寫入到文件

:w %.new                寫入到當前文件, % 表示當前文件的文件名

ctrl-^                  效果同 :e # 切換到上一個文件

"f6yy -> :w -> :e new.txt -> "fp  ===>  復制光標以及后 6 行內容復制到緩沖區 f 中 -> 緩沖區寫入到文件 -> 切換到 new.txt 文件 -> 復制緩沖區 f 中內容到光標后
:1,6ya a  -> :pu a    ===>    拖拽 1-6 行到緩沖區 a  -> 將緩沖區 a 中內容放置到當前光標之后, ya 為拖動命令,pu 為放置命令
全局替換
:s/old/new                     substitute 可縮寫為 s, 將當前這一行第一個出現模式 old 的字符串替換為 new, /用來分割各個命令, 最后一個/可省略
:s/old/new/g                   將當前這一行中所有的 old 替換為 new, g表示該行中所有模式, :g 表示文件中每一行
:1,10s/old/new/g               將 1-10 行中所有的 old 替換為 new
:%s/old/new/g                  通 :1,$s/old/new/g , 將整個文件的 old 替換為 new    
:1,10s/old/new/gc              替換 1-10 行中所有的 old, 每一個都需要確認
:g/pattern/s/old/new/g         遇到包含 pattern 的行時候將 old 替換為 new
:g/pattern/s//new/g            遇到包含 pattern 的行將 pattern 替換為 new, 此時直接用 :%s/pattern/new/g 即可
搜索模式的元字符
.                    匹配任何單一字符, 包含空格, 除掉換行符
*                    匹配出位于此符號前的單一字符,該字符可以出現 0 到多個
^                    表示后邊的正則表達式必須位于行開頭
$                    表示正則表達式必須位于行結尾
\                    轉義字符, 例如 \. 表示匹配 . 而不是任意字符
[]                   匹配出方括號中任意一個字符, [^a-z] 則表示匹配不是小寫字母的字符, [] 中的 ^ 表示取反
\(\)                 將\(\)之間模式匹配到的內容保留到緩沖區, 一般可以保留一行中 9 個模式, 例如 \(That\) or \(this\) 則將 That 保留到緩沖區 1, this 到 2
\<\>                 匹配某些字符開頭的單詞, 例如 \<ac 只會匹配出以 ac開頭的單詞, 而 ac\> 只會匹配出以 ac 結尾的單詞
~                    匹配任何上一次搜索所使用的正則表達式, 只能用于正則搜索, 即 /

[:alnum:]            字母與數字字符
[:alpha:]            字母字符
[:blank:]            空格與指標符
[:cnctrl:]           控制字符
[:digit:]            數字字符
[:graph:]            可打印的與可見的(不包括空格)字符, 不包括空白
[:print:]            可打印的字符, 包括空白
[:punct:]            標點符號
[:space:]            空白字符
[:upper:]            大寫字符
[:xdigit:]           十六進制數字

\n                   利用\(\)存儲的第 n 個模式的文字做代換, n 表示數字 1-9, 之前存儲的模式是從左到右來計算
\                    將后面一個字符當做普通字符來看到
&                    用在替換字符串中時, 替換為搜索模式匹配出的完整模式, 例如 :%s/AAA/&, bbb 則替換字符串為 AAA, bbb
\u 或 \l             使替換字符串下一個字符變為大寫或小寫
\U 或 \L 或 \e 或\E   將后邊的字符串或直到出現 \e 或 \E 為止, 全部替換為大寫或者小寫
:set 命令
:set option            打開選項
:set nooption          關閉選項

:set ic                指定搜索模式忽略大小寫
:set noic              指定搜索模式區分大小寫

:set window=20         設置屏幕窗口顯示的行數
:set wrapmargin        設置右邊界距離, 用于自動換行

:set all               檢查 vi 正在使用的選項
:set option?           查詢指定選項的當前值

noignorecase           搜索時區分大小寫
wrapscan               回到文件開頭繼續搜索, 表示在文件中任何一處開始搜索, 都可以找到符合的文本
magic                  模式匹配時候辨識通配符
autoindent             設置自動縮排, ctrl-t 下一層縮進, ctrl-d 上一層縮進
shiftwith=4            設置默認向左或向右為 4 個空格
tabstop                設置 tab 占用 4 個空格
list                   顯示控制字符
showmatch              顯示對應匹配的括號, 插入模式會有效果
mourse=a               多窗口下, 鼠標跟隨
exrc 文件, 無需 : 即可, 因為讀入 exrc 文件的是 ex 讀入的
主目錄下的.exrc 文件中添加 set exrc 則 ex 可以讀取當前目錄下的.exrc 文件
:so .otherexrc        source 可縮寫為 so, 加載其他的 exrc 文件
執行 unix 命令
:!command             ! 會告訴 ex 創建一個shell, 且后續文本視為 uninx 命令
:!date                顯示系統時間
:sh                   創建一個 shell, 可以執行多個 uninx 命令, 結束時按 ctrl-d 回到 vi

:r !command           read 可簡寫為 r, 可與 uninx 命令結合, 把 uninx命令的結果讀入到文件中
:1r !date             將系統時間讀入到文件第一行

:1,10 !sort           將 1-10 行排序
!)command             將下一句內容傳遞給 command
單詞縮寫, 插入模式定義宏
ab mb Mobiuspace            設置 Mobiuspace 的縮寫為 mb, 在 vi 中輸入時會自動展開, 縮寫的單詞不能出現在所代表的詞組的詞尾
命令縮寫, 命令模式定義宏
:map x sequence             定義字符 x 映射到編輯命令 sequence
:unmap x                    取消定義給 x 的編輯命令 sequence
:map                        列出所有被映射的字符

:map v dwelp                dw 刪除一個單詞, e 移到下一個單詞結尾, l 向右移動一個空格, p 將刪除的單詞放置到新位置
:map! - dw                  命令模式下強制覆蓋 - 為 dw 命令
使用 tag, uninx 有 ctags 命令可以與 vi 的:tag命令一起使用
:ctags *.c                 創建描述所有 c源代碼文件的 tags 文件
:tag name                  在 tags 文件中尋找 name 的定義
vim 啟動
vim -d file1 file2        diff 縮寫為 d, 以 diff 模式啟動編輯文件
vim -o file1 file2        所有文件均各自打開窗口
vim 多窗口編輯
:split                    水平分割當前窗口
ctrl-w -> s               水平分割當前窗口
:new                      水平分割當前窗口, 會自動適配一些配置

:vsplit                   垂直分割當前窗口

:[n]split [++opt] [cmd] [file]        n 為 vim 指定新窗口顯示的行數

ctrl-w -> ctrl-j          移動到下一個窗口
ctrl-w -> ctrl-k          移動到上一個窗口
ctrl-w -> ctrl-h          移動到當前窗口左側
ctrl-w -> ctrl-l          移動到當前窗口右側

ctrl-w -> ctrl-p          移動到最后一次訪問的窗口
ctrl-w -> ctrl-t          移動到最左上角的窗口
ctrl-w -> ctrl-b          移動到最右下角的窗口

ctrl-w -> +               當前窗口增加一行
:resize +2                當前窗口增加兩行
vim 緩沖區命令
:ls                     列出緩沖區文件
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374