命令執行格式
(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 列出緩沖區文件