Vim 大法

命令執行格式
(command) (number) (text object)
(number) (command) (text object) 
複製代碼
基礎操做
ZZ 或 :wq                 保存並退出
:e!                       恢復到上一次存儲的文件內容
:w pathname/filename      寫入到其餘文件中
:rf pathname/filename     刪除其餘文件
:!ls pathname             查看其餘目錄使用狀況
:sh -> ctrl-dexit     建立對應的 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                     列出緩衝區文件
複製代碼
相關文章
相關標籤/搜索