vi 是 POSIX 標準編輯器,系統救援模式唯一可用編輯器;Vim (Vi IMproved) 是現代發行版默認替代品,擁有語法高亮、多級撤銷、插件系統等增強功能。掌握 vi 操作等於掌握了所有類 Unix 系統的基礎編輯能力。
+----------------+ i,a,o +----------------+
| 命令模式 | ------------> | 輸入模式 |
| (默認/ESC) | <------------ | (--INSERT--) |
+----------------+ ESC +----------------+
| ^
| : (冒號)
v |
+----------------+
| 末行模式 |
| (命令行模式) |
+----------------+
| 從/到 | 命令模式 | 輸入模式 | 末行模式 |
|---|---|---|---|
| 命令模式 | — | i a o I A O c s R | : / ? |
| 輸入模式 | Esc Ctrl+[ | — | — |
| 末行模式 | Esc Enter (執行後) | — | — |
vi # 新建無名緩衝區
vi file.txt # 編輯現有/新建文件
vi +10 file.txt # 打開定位第 10 行
vi +/pattern file.txt # 打開定位首次匹配行
vi -r file.txt # 恢復崩潰時的 .swp 緩衝區
# 退出命令(末行模式)
:q # 未修改時退出
:q! # 強制放棄修改退出
:wq # 保存並退出
:wq! # 強制保存(需文件寫權限)
:x # 等同 :wq(僅修改時寫入)
:wa # 保存所有打開文件
:qa # 關閉所有窗口
h j k l # 左下上右(鍵盤主鍵區,無需移動手)
w b e # 下一單詞首/上一單詞首/當前單詞尾
W B E # 以空格分隔的「大單詞」
0 ^ $ # 行首/第一個非空白字符/行尾
g_ # 行尾非空白字符
{ } # 上一段/下一段(空行分隔)
( ) # 上一句/下一句
gg G # 文件首行/末行
:n # 跳轉第 n 行
nG # 跳轉第 n 行
Ctrl+f/b # 向下/向上翻頁
Ctrl+d/u # 向下/向上翻半頁
H M L # 屏幕首行/中行/尾行
zt zz zb # 當前行置頂/置中/置底
ma # 設置標記 a (a-z 局部, A-Z 全局)
'a # 跳轉到標記 a 行首
`a # 跳轉到標記 a 精確位置
'' `` # 跳轉回上次位置
# 刪除 (d)
dw # 刪除到單詞尾
d$ / D # 刪除到行尾
dd # 刪除整行
3dd # 刪除 3 行
dap # 刪除一段(段落)
# 修改 (c = 刪除 + 進入輸入模式)
cw # 修改單詞
cc # 修改整行
C # 修改到行尾
# 替換/取代
rX # 當前字符替換為 X
R # 進入替換模式(覆蓋模式)
s # 刪除字符並進入輸入模式 (cl)
S # 刪除行並進入輸入模式 (cc)
# 複製/粘貼 (y/p)
yy / Y # 複制整行
yw # 複制單詞
y$ # 複制到行尾
p # 光標後粘貼
P # 光標前粘貼
"ayy # 複制到寄存器 a
"ap # 從寄存器 a 粘貼
# 撤銷/重做
u # 撤銷
Ctrl+r # 重做
U # 撤銷該行所有修改
/pattern # 向下搜索
?pattern # 向上搜索
n # 下一個匹配
N # 上一個匹配
* # 搜索光標下單詞向下
# # 搜索光標下單詞向上
g* g# # 部分匹配單詞
:s/old/new/ # 當前行首次替換
:s/old/new/g # 當前行全局替換
:.,$s/old/new/g # 當前行到文件尾
:%s/old/new/g # 全文替換
:%s/old/new/gc # 全文替換並逐個確認
:5,10s/old/new/g # 第 5-10 行替換
:g/pattern/s/old/new/g # 匹配 pattern 的行執行替換
# 替換分隔符可自定義(避免正斜杠衝突)
:s#/usr/local#/opt#g
:s@https://@https://@g
:e file.txt # 編輯新文件
:bn :bp # 下一個/上一個緩衝區
:ls # 列出所有緩衝區
:split / :sp # 水平分屏
:vsplit / :vs # 垂直分屏
Ctrl+w w # 循環切換窗口
Ctrl+w h/j/k/l # 方向切換窗口
Ctrl+w = # 等寬高分屏
:tabnew file # 新標籤頁
gt / gT # 下一個/上一個標籤頁
" 基礎設置
set nocompatible
set encoding=utf-8
set fileencodings=utf-8,gbk,gb2312,gb18030
set number " 顯示行號
set relativenumber " 相對行號(配合移動命令)
set cursorline " 高亮當前行
set scrolloff=5 # 保持光標上下 5 行可見
set sidescrolloff=10
set wrap # 自動換行
set linebreak # 整詞換行
set showbreak=↪\
" 搜索設置
set ignorecase # 忽略大小寫
set smartcase # 含大寫則區分大小寫
set incsearch # 增量搜索
set hlsearch # 高亮匹配
" 縮進設置
set tabstop=4
set shiftwidth=4
set expandtab # Tab 轉空格
set smartindent
set autoindent
" 系統整合
set clipboard=unnamedplus # 使用系統剪貼板
set mouse=a # 啟用鼠標
set undofile # 持久化撤銷歷史
set undodir=~/.vim/undodir
" 實用映射
nnoremap w :w
nnoremap q :q
nnoremap h :nohlsearch " 清除搜索高亮
inoremap jk # 輸入模式快速退出
# 異常退出後會產生 .file.swp 交換文件
vi -r file.txt # 列出可恢復會話
vi -r # 列出所有會話
# 打開時提示選項:
[O]pen Read-Only - 只讀查看
[E]dit anyway - 放棄恢復
[R]ecover - 恢復未保存內容(推薦)
[D]elete it - 刪除交換文件
[Q]uit - 放棄打開
# 恢復後立即 :w 保存,然後手動刪除 .swp 文件