Vim基礎
- 一、移動光標
- 1.1、基礎移動
- 1.2、屏幕滾動
- 二、編輯操作
- 2.1、插入模式
- 2.2、刪除與修改
- 2.3、復制粘貼
- 三、搜索與替換
- 3.1、搜索
- 3.2、替換
- 4、分屏與窗口管理
- 4.1、分屏操作
- 4.2、窗口調整
- 五、宏與批量操作
- 六、效率技巧
- 七、操作符
- 7.1、內置操作符
- 7.2、操作符 + 文本對象(高效組合)
- 7.3、操作符進階技巧
- 7.4、自定義操作符
- 八、文本對象
- 8.1、內置文本對象
- 8.2、操作符+文本對象
- 8.3、自定義文本對象
- 8.4、插件增強文本對象
- 8.5、使用技巧
- 九、動作
- 9.1、基礎動作
- 9.2、高級動作技巧
- 9.3、動作+操作符
- 9.4、自定義動作
- 9.5、使用示例
- 十、Ex命令
- 10.1、文件操作
- 10.2、行號與范圍
- 10.3、文本替換(`:s`)
- 10.4、多文件與緩沖區
- 10.5、窗口與標簽頁
- 10.6、環境控制
- 10.7、高級技巧
- 10.8、實際應用
一、移動光標
1.1、基礎移動
快捷鍵 | 作用 |
---|---|
h j k l | 左/下/上/右移動 |
w | 跳到下一個單詞開頭 |
b | 跳到上一個單詞開頭 |
e | 跳到當前單詞末尾 |
0 | 跳到行首 |
^ | 跳到行首第一個非空白字符 |
$ | 跳到行尾 |
gg | 跳到文件第一行 |
G | 跳到文件最后一行 |
:n | 跳到第 n 行(如 :10 跳第 10 行) |
1.2、屏幕滾動
快捷鍵 | 作用 |
---|---|
Ctrl+u | 向上滾動半屏 |
Ctrl+d | 向下滾動半屏 |
Ctrl+b | 向上滾動整屏 |
Ctrl+f | 向下滾動整屏 |
zz | 當前行居中顯示 |
zt | 當前行置頂 |
zb | 當前行置底 |
二、編輯操作
2.1、插入模式
快捷鍵 | 作用 |
---|---|
i | 在光標前插入 |
a | 在光標后插入 |
I | 在行首插入 |
A | 在行尾插入 |
o | 在下方插入新行 |
O | 在上方插入新行 |
2.2、刪除與修改
快捷鍵 | 作用 |
---|---|
x | 刪除當前字符 |
dw | 刪除當前單詞 |
dd | 刪除當前行 |
D | 刪除到行尾 |
cw | 修改當前單詞(刪除并進入插入模式) |
cc | 修改整行 |
r | 替換單個字符 |
R | 進入替換模式(連續替換) |
2.3、復制粘貼
快捷鍵 | 作用 |
---|---|
yy | 復制當前行 |
yw | 復制當前單詞 |
p | 粘貼到光標后 |
P | 粘貼到光標前 |
"ayy | 復制當前行到寄存器 a |
"ap | 粘貼寄存器 a 的內容 |
三、搜索與替換
3.1、搜索
快捷鍵 | 作用 |
---|---|
/keyword | 向前搜索 keyword |
?keyword | 向后搜索 keyword |
n | 跳轉到下一個匹配項 |
N | 跳轉到上一個匹配項 |
* | 搜索當前光標下的單詞 |
3.2、替換
命令 | 作用 |
---|---|
:s/old/new | 替換當前行第一個 old |
:s/old/new/g | 替換當前行所有 old |
:%s/old/new/g | 替換全文所有 old |
:%s/old/new/gc | 替換全文并每次確認 |
4、分屏與窗口管理
4.1、分屏操作
快捷鍵 | 作用 |
---|---|
:sp | 水平分屏 |
:vsp | 垂直分屏 |
Ctrl+w h/j/k/l | 跳轉到左/下/上/右窗口 |
Ctrl+w w | 循環切換窗口 |
Ctrl+w c | 關閉當前窗口 |
Ctrl+w o | 關閉其他窗口 |
4.2、窗口調整
快捷鍵 | 作用 |
---|---|
Ctrl+w + | 增加窗口高度 |
Ctrl+w - | 減少窗口高度 |
Ctrl+w > | 增加窗口寬度 |
Ctrl+w < | 減少窗口寬度 |
Ctrl+w = | 所有窗口等寬等高 |
五、宏與批量操作
快捷鍵 | 作用 |
---|---|
qa | 開始錄制宏到寄存器 a |
q | 停止錄制 |
@a | 執行寄存器 a 的宏 |
@@ | 重復執行上一次宏 |
:normal @a | 對選中行執行宏 a |
- 按 qa 開始錄制 → 執行操作(如 dd 刪除行)→ 按 q 結束錄制
- 執行 @a 重復刪除操作
六、效率技巧
組合操作:
dap
:刪除整個段落cis
:修改當前句子
文本對象:
viw
:選中當前單詞vip
:選中當前段落
重復操作:
10j
:向下移動 10 行5dd
:刪除 5 行
七、操作符
Vim 的操作符遵循 ??"操作符 + 動作 = 操作"?? 的模式:
[次數] 操作符 [范圍/文本對象]
例如:d2w 表示 “刪除 2 個單詞”。
7.1、內置操作符
操作符 | 作用 | 示例 | 說明 |
---|---|---|---|
d | 刪除 (Delete) | dw 刪除單詞 | 內容會存入寄存器,可粘貼 |
y | 復制 (Yank) | y$ 復制到行尾 | 配合 p /P 粘貼 |
c | 修改 (Change) | ciw 修改當前單詞 | 刪除后自動進入插入模式 |
~ | 大小寫切換 | ~ 切換當前字符 | 支持視覺模式選區 |
g~ | 反轉選區大小寫 | g~iw 反轉單詞 | |
gu | 轉為小寫 | guw 單詞轉小寫 | |
gU | 轉為大寫 | gUw 單詞轉大寫 | |
> | 增加縮進 | >j 下一行縮進 | 通常結合 >> 縮進整行 |
< | 減少縮進 | <k 上一行縮進 | 通常結合 << 取消縮進整行 |
= | 自動縮進 | =ap 段落自動縮進 | 需設置 filetype indent on |
! | 通過外部命令過濾 | !}sort 段落排序 | 調用 sort 命令處理選區 |
gq | 文本重排 (Format) | gqap 重排段落 | 依賴 textwidth 設置 |
z | 折疊操作 | zfap 創建段落折疊 | 需啟用折疊功能 |
7.2、操作符 + 文本對象(高效組合)
基礎文本對象:
文本對象 | 作用 | 示例 | 說明 |
---|---|---|---|
iw | 當前單詞 (inner word) | diw 刪除單詞 | 不包括空格 |
aw | 當前單詞 + 空格 | daw 刪除單詞 | 包括相鄰空格 |
i" | 引號內內容 | ci" 修改引號內容 | 光標需在引號間 |
a" | 引號及內容 | da" 刪除引號及內容 | |
i( / i) | 括號內內容 | di( 刪除括號內容 | 適用于 [] , {} , <> 等 |
a( / a) | 括號及內容 | da( 刪除括號及內容 |
高級文本對象:
文本對象 | 作用 | 示例 | 說明 |
---|---|---|---|
ip | 段落 (inner paragraph) | dip 刪除段落 | 需設置 :set paragraph= |
ap | 段落 + 空行 | yap 復制段落 | |
is | 句子 (inner sentence) | cis 修改句子 | 以 .!? 結尾為句子 |
as | 句子 + 空格 | das 刪除句子 |
7.3、操作符進階技巧
跨行操作:
d/pattern<CR> " 刪除直到匹配 pattern 的位置
y?error<CR> " 復制到上一個 "error" 出現處
寄存器指定:
"aD " 刪除到行尾并存入寄存器 a
"+yiw " 復制當前單詞到系統剪貼板
重復操作符:
.. " 重復上一次修改(包括操作符動作)
& " 重復最近的 `:s` 替換操作
視覺模式配合:
用 v/V/Ctrl+v 選擇區域
按操作符(如 d/y/>)執行
7.4、自定義操作符
通過 map-operator 創建自定義操作符(需 Vim 7.4+):
高亮選區:
" 定義操作符(輸入 \h 高亮選區)
vnoremap <silent> <leader>h :<C-U>call HighlightSelection()<CR>
function! HighlightSelection()execute "'<,'>s/\\%V\$.*\$\\%V/\\1/"echom "選區已高亮"
endfunction
base64編碼:
" 輸入 \b 對選區進行 Base64 編碼
vnoremap <silent> <leader>b :<C-U>call Base64Encode()<CR>
function! Base64Encode()execute "'<,'>!base64"
endfunction
八、文本對象
文本對象是 ?結構化文本片段?(如單詞、句子、括號內容等),通過 操作符 + 文本對象
或 可視化模式 + 文本對象
實現高效操作。
?語法?:
i
+ 對象 → 操作 ?內部?(不包含邊界符號,如引號/括號)a
+ 對象 → 操作 ?整體?(包含邊界符號)
8.1、內置文本對象
基礎對象:
文本對象 | 作用范圍 | 示例 | 說明 |
---|---|---|---|
iw /aw | 單詞 (word) | diw 刪除單詞 | aw 包含相鄰空格 |
iW /aW | 大單詞 (WORD) | ciW 修改連續非空白字符 | 以空格為分隔 |
is /as | 句子 (sentence) | yas 復制句子 | 以.!? 結尾為界 |
ip /ap | 段落 (paragraph) | dap 刪除段落 | 以空行為分隔 |
i" /a" | 雙引號內容 | ci" 修改引號內文本 | 適用于 ' ` `等同類符號 |
i( /a( | 括號內容 (圓括號) | di( 刪除括號內內容 | 同樣適用于 [] {} <> |
標簽對象(HTML/XML):
文本對象 | 作用范圍 | 示例 | 說明 |
---|---|---|---|
it /at | 標簽內部/整個標簽 | cit 修改標簽內容 | 需光標在標簽內 |
i> /a> | 尖括號內容 | yi> 復制標簽屬性 | 適用于 <div class="..."> |
其它對象:
文本對象 | 作用范圍 | 示例 | 說明 |
---|---|---|---|
i{ /a{ | 花括號塊 (代碼塊) | va { 選中整個代碼塊 | 適用于 if /for 等代碼塊 |
i/a 縮進塊 (indent) | >i 增加縮進塊 | 需開啟 :set indentkeys | |
i /a | 函數參數 (argument) | cia 修改函數參數 | 需插件如 vim-textobj-parameter |
8.2、操作符+文本對象
高效編輯:
ci" " 修改雙引號內的內容(自動進入插入模式)
da{ " 刪除花括號及內部代碼塊(包括換行)
yip " 復制當前段落
>ap " 增加段落縮進
復雜嵌套場景:
<!-- 修改嵌套標簽內容 -->
<div><span>|光標在這里|</span>
</div>
cit
→ 修改<span>
內容dat
→ 刪除整個<span>
標簽2cit
→ 修改外層<div>
內容(需插件支持層級跳轉)
8.3、自定義文本對象
基礎自定義(.vimrc):
" 定義 XML 屬性文本對象(選中 class="...")
xnoremap <silent> ix :<C-U>call SelectXMLAttr()<CR>
function! SelectXMLAttr()execute "normal! /\\s\\w\\+=\\s*[\"']\\<CR>v/\\s\\w\\+=\\s*[\"']\\>\\zs<CR>"
endfunction
使用:vix 選中當前 XML 屬性值。
通過插件擴展:
vim-textobj-user:創建自定義文本對象的框架
示例:定義 if 條件語句為文本對象:
call textobj#user#plugin('condition', {
\ 'if': {
\ 'select-a': 'aif',
\ 'select-i': 'iif',
\ 'pattern': '\<if\>.\{-}\<endif\>',
\ },
\ })
使用:diif 刪除 if 條件塊內容。
8.4、插件增強文本對象
vim-surround:
操作 | 效果 |
---|---|
ds" | 刪除周圍雙引號 |
cs"' | 將雙引號改為單引號 |
ysiw] | 給單詞添加 [] 包圍 |
vim-indent-object:
文本對象 | 作用 |
---|---|
ii /ai | 操作相同縮進層級的內容 |
dii " 刪除當前縮進塊(保留父級)
vim-textobj-line:
文本對象 | 作用 |
---|---|
il /al | 操作整行(非空白部分/全行) |
yal " 復制整行(包括換行符)
8.5、使用技巧
快速修復JSON鍵名:
{ "old_name": "value" }
光標定位到鍵名 → ci"new_name → 快速修改鍵名
代碼塊操作:
def foo():|光標在這里|return True
di → 刪除函數體(需 indent 文本對象支持)
選取擴展:
在可視化模式中:
按 i 或 a 后輸入文本對象(如 i")可動態調整選區范圍
九、動作
動作是 ?移動光標或選擇文本? 的命令,可與 ?操作符?(如 d/y/c)或 ?可視化模式? 組合使用。
- ?語法?:[次數] + 動作
- 例如:d2w → 刪除 2 個單詞,v3j → 向下選擇 3 行。
9.1、基礎動作
字符級移動:
動作 | 作用 | 示例 |
---|---|---|
h | 左移 | dl 刪除右側字符 |
l | 右移 | ch 修改左側字符 |
k | 上移 | 5k 上移 5 行 |
j | 下移 | vj 選擇當前和下一行 |
單詞級移動:
動作 | 作用 | 示例 |
---|---|---|
w | 跳到下一個單詞開頭 | dw 刪除到下一單詞 |
b | 跳到上一個單詞開頭 | cb 修改上一單詞 |
e | 跳到當前單詞末尾 | ge 跳到前一單詞末尾 |
行級移動:
動作 | 作用 | 示例 |
---|---|---|
0 | 跳到行首 | d0 刪除到行首 |
^ | 跳到行首非空白字符 | y^ 復制到行首 |
$ | 跳到行尾 | c$ 修改到行尾 |
+ | 跳到下一行首 | v+ 選擇兩行 |
- | 跳到上一行首 | d- 刪除上一行 |
屏幕滾動:
動作 | 作用 |
---|---|
H | 跳到屏幕頂部(High) |
M | 跳到屏幕中間(Middle) |
L | 跳到屏幕底部(Low) |
Ctrl+u | 上翻半屏 |
Ctrl+d | 下翻半屏 |
9.2、高級動作技巧
搜索跳轉:
動作 | 作用 | 示例 |
---|---|---|
f{char} | 跳到當前行下一個 {char} | df. 刪除到句點 |
F{char} | 跳到當前行上一個 {char} | yF, 復制到逗號 |
t{char} | 跳到 {char} 前一個字符 | ct" 修改到引號前 |
/{pattern} | 全局搜索 | d/end<CR> 刪除到 “end” |
標記跳轉:
動作 | 作用 |
---|---|
m{a-z} | 設置標記(如 ma) |
`a | 精確跳轉到標記 a |
'{a-z} | 跳到標記行的行首 |
代碼塊跳轉:
動作 | 作用 | 示例 |
---|---|---|
% | 匹配括號跳轉 | d% 刪除括號間內容 |
[[ | 跳到上一個函數開頭 | y[[ 復制函數 |
]] | 跳到下一個函數開頭 | v]] 選擇函數 |
9.3、動作+操作符
經典組合:
d2w " 刪除 2 個單詞
ci( " 修改括號內內容
yG " 復制到文件末尾
>} " 增加縮進到段落末尾
跨行操作:
d/function<CR> " 刪除直到 "function" 出現處
y?end<CR> " 復制到上一個 "end" 位置
精準選區:
v3e " 選擇當前單詞和后 2 個單詞(共 3 個)
vat " 選擇整個 XML/HTML 標簽
9.4、自定義動作
映射組合動作(.vimrc):
" 快速跳轉到行尾并插入分號
nnoremap <leader>; A;<Esc>
通過插件擴展:
vim-easymotion?:快速跳轉到任意位置
<leader><leader>w " 高亮顯示所有單詞首字母,按字母跳轉
?vim-sneak?:增強 f/t 動作
sxy " 跳轉到下一個 "xy" 出現處
9.5、使用示例
快速修復代碼:
def calculate(a, b):result = a * b # |光標在此|return result
- ciwsum → 修改 result 為 sum
- f(di( → 刪除函數參數
批量縮進:
>j " 下一行增加縮進
3>> " 當前行和下兩行縮進
跨文件標記:
- 在關鍵位置設置標記:mA
- 在其他文件跳回:`A
十、Ex命令
ex 命令是 Vim 的底層命令模式,以 : 開頭,繼承自古老的 ed 編輯器。所有可視化操作最終都會轉換為 ex 命令(可通過 :help ex-cmd-index
查看完整列表)。
10.1、文件操作
命令 | 作用 | 示例 |
---|---|---|
:e[dit] | 重新加載當前文件 | :e! 強制丟棄修改重新加載 |
:w[rite] | 保存文件 | :w /tmp/backup 另存為備份 |
:sav[eas] | 另存為新文件 | :sav newfile.txt |
:q[uit] | 退出 | :q! 強制退出不保存 |
:wq / :x | 保存并退出 | |
:r[ead] | 插入文件內容 | :r /etc/passwd |
:r! | 插入命令輸出 | :r! date 插入當前日期 |
10.2、行號與范圍
語法 | 作用 | 示例 |
---|---|---|
:n | 跳轉到第 n 行 | :10 跳轉到第 10 行 |
:.,$ | 當前行到文件末尾 | :.,$d 刪除此后所有行 |
:'<,'> | 可視化模式選中的范圍 | :'<,'>s/foo/bar/g 替換選區 |
:% | 整個文件(相當于 1,$) | :%s/old/new/g 全局替換 |
:+/pattern/-n | 基于搜索的偏移范圍 | :/foo/+1,/bar/-2d |
10.3、文本替換(:s
)
命令 | 作用 | 示例 |
---|---|---|
:s/old/new/ | 替換當前行第一個匹配 | :s/foo/bar/ |
:s/old/new/g | 替換當前行所有匹配 | :s/\s\+$//g 刪除行尾空格 |
:n,ms/old/new/g | 替換 n 到 m 行所有匹配 | :10,20s/error/warning/g |
:%s/old/new/gc | 全局替換并每次確認 | |
高級技巧 | ||
\v | 啟用 “very magic” 模式(減少轉義) | :s/\v\d{4}/\=submatch(0)+1/ |
\c | 忽略大小寫 | :s/foo\c/bar/ |
10.4、多文件與緩沖區
命令 | 作用 | 示例 |
---|---|---|
:bn[ext] | 切換到下一個緩沖區 | `:bn! 強制切換(忽略修改) |
:bp[revious] | 切換到上一個緩沖區 | |
:ls | 列出所有緩沖區 | |
:badd | 添加文件到緩沖區 | :badd ~/.zshrc |
:bd[elete] | 刪除緩沖區 | :bd! 強制刪除 |
:argadd | 添加到參數列表 | :argadd *.py |
:argdo | 對參數列表所有文件執行命令 | :argdo %s/foo/bar/g |
10.5、窗口與標簽頁
命令 | 作用 | 示例 |
---|---|---|
:sp[lit] | 水平分割窗口 | :sp ~/.vimrc |
:vs[plit] | 垂直分割窗口 | :vs /tmp/log |
:tabnew | 新建標簽頁 | :tabnew |
:tabn[ext] | 下一個標簽頁 | :tabn 3 跳轉到第 3 個標簽 |
:tabm[ove] | 移動標簽頁位置 | :tabm 0 移動到首位 |
:windo | 對所有窗口執行命令 | :windo set nu! 切換行號顯示 |
10.6、環境控制
命令 | 作用 | 示例 |
---|---|---|
:set | 查看/設置選項 | :set wrap? 查看換行狀態 |
:set nu | 顯示行號 | :set nonu 隱藏行號 |
:set paste | 進入粘貼模式(防格式混亂) | |
:syntax on | 啟用語法高亮 | |
:vert h | 垂直分割幫助窗口 | :vert h pattern |
10.7、高級技巧
命令組合:
" 刪除所有包含 "TODO" 的行
:g/TODO/d" 復制所有匹配行到文件末尾
:g/pattern/t$" 對指定文件類型執行操作
:autocmd FileType python nnoremap <buffer> <leader>c I#<Esc>
表達式替換:
" 將數字遞增 1
:%s/\d\+/\=submatch(0)+1/g" 格式化日期(需系統支持)
:%s/\v(\d{4})-(\d{2})-(\d{2})/\3.\2.\1/g
宏錄制與ex命令:
" 錄制宏到寄存器 q(操作第1-5行)
:1,5norm @q" 對所有緩沖區執行宏
:bufdo normal @q
外部命令集成:
" 用 sort 對選區排序
:'<,'>!sort" 用 Python 處理文本
:%!python -c "import sys; print(sys.stdin.read().upper())"
10.8、實際應用
批量重命名變量:
" 1. 將局部變量 `tmp` 改為 `context`
:argdo %s/\<tmp\>/context/g | update" 2. 僅修改函數內的變量(需熟悉函數邊界標記)
:/function start/,/function end/s/\<tmp\>/context/g
快速處理日志文件:
" 1. 提取所有 ERROR 行并保存
:g/ERROR/. w >> errors.log" 2. 刪除時間戳列(假設第1-20字符)
:%s/^.\{20\}//
項目全局操作:
" 1. 在所有 Python 文件中替換字符串
:args ?**?/*.py
:argdo %s/old_api/new_api/g | update" 2. 統計所有文件的 "TODO" 出現次數
:grep TODO ?**?/*
:copen