導航
- 簡介
- Vim 的來歷
- Vim 語言
- Vim 的三種模式
- Normal(普通模式)
- Insert(插入模式)
- Visual(可視模式)
- 三種模式轉換
- 普通模式實用技巧
- 說明
- 復制當前行并粘貼
- 使用上一個命令
- 撤銷上一個操作
- 最常用的跳轉命令
- 查找對應的字符
- 向下查找多字符
- 向上查找多字符
- 常用刪除命令
- 設置標記
- 插入模式實戰技巧
- 插入模式多種刪除命令
- 替換模式
- 可視模式實戰技巧
- 在長短不一的高亮塊后添加文本
- 剪切一整個代碼塊
- 命令行模式實戰技巧
- 打開文件
- 復制和移動內容
- 復制當前文件
- 全局替換內容
- 手動替換想要替換的內容
- 總結
- 普通模式的常用命令
- 光標移動命令
- 刪除命令
- 復制與粘貼命令
- 替換命令
- 查找與替換命令
- 其他常用命令
- 插入模式常用命令
- 進入插入模式的常用方式
- 插入模式下的常用操作
- 退出插入模式
- 其他插入模式命令
- 可視模式常用命令
- 進入可視模式
- 選擇范圍
- 剪切和復制
- 粘貼
- 替換和刪除
- 其他操作
- 退出可視模式
- 命令行模式常用命令
- 文件操作
- 搜索與替換
- 撤銷與重做
- 查找與跳轉
- 窗口管理
- 緩沖區與標簽
- 宏與寄存器
- 交互式命令與歷史
- 系統命令
- 退出 Vim
- 參考鏈接
簡介
Vim 的來歷
Vim 是一個高度可定制的文本編輯器,其名字來源于 Vi IMproved,即 Vi(改進版)
Bram Moolenaar(布拉姆·穆倫納爾)于 1991 年開發,目的是為了增強和擴展 Vi 編輯器
Vim 語言
動詞
動詞代表了我們打算對文本進行什么樣的操作。例如:
d
表示刪除(delete)r
表示替換(replace)c
表示修改(change)y
表示復制(yank)v
表示選取(visual select)
名詞
名詞代表了我們即將處理的文本。Vim 中有一個專門的術語叫做文本對象,下面是一些文本對象的示例:
w
表示一個單詞(word)s
表示一個句子(sentence)p
表示一個段落(paragraph)
介詞
介詞界定了待編輯文本的范圍或者位置。例如:
i
表示“在…之內”(inside)a
表示“環繞…”(around)t
表示“到…位置前”(to)f
表示“到…位置上”(forward)
舉例
# 刪除一個段落: delete inside paragraph
dip# 選取一個句子: visual select inside sentence
vis# 修改一個單詞: change inside word
ciw# 修改一個單詞: change around word
caw# 刪除文本直到字符“x”(不包括字符“x”): delete to x
dtx# 刪除文本直到字符“x”(包括字符“x”): delete forward x
dfx
Vim 的三種模式
Normal(普通模式)
vim 的核心模式,vim 的大部分操作也都是在這個模式下使用的, 主要用于導航、編輯、復制粘貼、查找替換等操作
Insert(插入模式)
主要用于輸入和編輯文本
Visual(可視模式)
選中一段文本并對其執行相關操作
三種模式轉換
注意:你只能從普通模式到插入模式,或者從普通模式到可視模式,而無法從插入模式直接轉到可視模式,反過來也是這樣(所以你明白為什么普通模式是核心模式了嘛)
從常規模式到插入模式
按鍵 | 作用 |
---|---|
i | 在 光標前 進入插入模式 |
a | 在 光標后 進入插入模式 |
I | 在 當前行首(非空字符前) 進入插入模式 |
A | 在 當前行尾 進入插入模式 |
o | 在 當前行下方 插入新行,并進入插入模式 |
O | 在 當前行上方 插入新行,并進入插入模式 |
從插入模式到常規模式
Esc
:很難按到,建議不要使用
Ctrl + [
:建議使用
Ctrl + c
從常規模式到可視模式
v
: 進入字符可視模式,逐字符選擇
V
:進入行可視模式,整行選擇
Ctrl + v
: 進入塊可視模式,矩形區域選擇
從可視模式到常規模式
Esc
普通模式實用技巧
說明
vim 中,完成一個操作可能有許多不同的方式,建議記住一個最簡單的,不然腦子真的記不住 😅
復制當前行并粘貼
yy -- 復制光標所在行
p -- 粘貼到光標后面
使用上一個命令
vim 中可以使用 .
符號,重復執行上一個命令
例如:我們使用了 p
命令粘貼,此時我們一直 .
就可以一直粘貼
撤銷上一個操作
當我們發現粘貼多了,想取消上一次操作怎么辦
按 u
最常用的跳轉命令
w
:跳到下一個單詞的開頭e
:跳到當前或下一個單詞的結尾b
:跳到當前或上一個單詞的開頭0
:跳到當前行的開頭$
:跳到當前行的末尾gg
:跳到文檔的開頭G
:跳到文檔的結尾
查找對應的字符
hello world!
- 我們想查找
o
字符 - 光標移動到這一行上
- 輸入
f{char}
即fo
- 此時光標就在第一個
o
上了 - 按
;
查找下一個o
- 按
,
返回上一個o
向下查找多字符
/{chars}
n
下一個N
上一個
向上查找多字符
?{chars}
n
上一個N
下一個
常用刪除命令
x
:刪除當前光標所在的字符dd
:刪除當前行
別再記別的了 😂
設置標記
mA
當前光標位置設置一個標記,名字叫A
'A
跳到A
標記處:marks
查看所有標記:delmarks!
刪除所有標記
可用于快速跳轉
插入模式實戰技巧
插入模式多種刪除命令
delete
向后刪除
Ctrl + h
/ Back
向前刪除
Ctrl + w
刪除前一個單詞
Ctrl + u
刪到行首
不建議再記別的,先使用著
替換模式
R
進入
可視模式實戰技巧
在長短不一的高亮塊后添加文本
舉例:想讓下面的 javascript 代碼后面都加上 ;
let foo = 1;
let bar = 2;
let foobar = foo + bar;
Ctrl + v
進入可視模式jj
向下選中$
向尾部選中A
尾部插入- 輸入
;
剪切一整個代碼塊
舉例:想將下面的代碼塊剪切下來
@router.post("/login/access-token")
def login_access_token(session: SessionDep, form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
) -> Token:"""OAuth2 兼容的令牌登錄,獲取訪問令牌以供后續請求使用"""user = user_crud.authenticate(session=session, user_account=form_data.username, password=form_data.password)if not user:raise HTTPException(status_code=400, detail="Incorrect email or password")elif not user.is_active:raise HTTPException(status_code=400, detail="Inactive user")access_token_expires = timedelta(minutes=60 * 60 * 24)return Token(access_token=create_access_token(user.id, expires_delta=access_token_expires))
- 將光標放在代碼塊的起始位置
- 按
V
進入行可視模式 - 使用
j
或k
擴展選擇,直到選擇完整個代碼塊 - 按
d
剪切所選的代碼塊
命令行模式實戰技巧
打開文件
:e {filename}
打開文件
復制和移動內容
:6t.
將第六行復制到當前行下面:2m.
將第二行移動到當前行下面
復制當前文件
:w newfile
全局替換內容
:%s/content_old/content_new/g
將 content_old 替換為 content_new
手動替換想要替換的內容
假設你想批量替換 content
為 copy
你可以使用 :%s/content/copy/g
命令,但是這樣會全部處理 content
內容,我們像自定義要不要替換當前 content
使用 *
符號
- 光標移動到文本
content
上 - 輸入
*
,此時會選中所有content
- 輸入
cw
命令,會刪除content
并進入輸入模式 - 輸入
copy
退出 - 按
n
進入下一個content
- 按
.
重復操作
總結
通過實戰和理解上面的命令,你應該能夠解決在 Vim 中遇到的大部分常見場景。我使用 VSCode 和 Vim 插件,解決了一些 Vim 中較為復雜的命令,比如代碼格式化和保存等問題。
雖然我才剛從 JetBrains 全家桶遷移到 VSCode + Vim 編寫代碼的第三天,但我已經能夠想象使用 Vim 快捷操作行云流水寫代碼的場景了 😅 (一種遠古程序員的魅力 👻)
熟能生巧,堅持下去吧~
如果你想進一步了解 Vim,以下是一些有用的資料
- Vim 中文文檔
- 也可以參考下面的常用 Vim 命令總結
普通模式的常用命令
建議不要看 😅 用到再查,注重實戰!
光標移動命令
h
:光標向左移動一個字符j
:光標向下移動一行k
:光標向上移動一行l
:光標向右移動一個字符w
:跳到下一個單詞的開頭e
:跳到當前或下一個單詞的結尾b
:跳到當前或上一個單詞的開頭0
:跳到當前行的開頭$
:跳到當前行的末尾gg
:跳到文檔的開頭G
:跳到文檔的結尾H
:將屏幕頂部行與光標對齊M
:將屏幕中間行與光標對齊L
:將屏幕底部行與光標對齊Ctrl-f
:向下滾動一頁Ctrl-b
:向上滾動一頁Ctrl-d
:向下滾動半頁Ctrl-u
:向上滾動半頁
刪除命令
x
:刪除當前光標所在的字符dd
:刪除當前行d$
:刪除從當前光標到行尾的內容d0
:刪除從當前光標到行首的內容dw
:刪除當前光標所在的單詞dG
:刪除從當前光標到文檔結尾的內容dgg
:刪除從當前光標到文檔開頭的內容
復制與粘貼命令
y
:復制選中的文本(需要先進入可視模式)yy
:復制當前行yw
:復制當前單詞y$
:復制從光標到行尾的內容p
:將復制的內容粘貼到光標后P
:將復制的內容粘貼到光標前
替換命令
r<char>
:將當前字符替換為指定字符R
:進入替換模式,連續替換字符直到按Esc
u
:撤銷上一個操作Ctrl-r
:重做撤銷的操作.
:重復上一個命令(如重復刪除、復制等)
查找與替換命令
/pattern
:查找指定的pattern
(模式)?pattern
:向上查找指定的pattern
n
:跳轉到下一個匹配的查找結果N
:跳轉到上一個匹配的查找結果:%s/old/new/g
:替換文檔中的所有old
為new
:s/old/new/g
:替換當前行中的所有old
為new
其他常用命令
:
:進入命令行模式,可以執行如保存、退出等命令q
:退出 Vim:w
:保存文件:q
:退出文件:wq
:保存并退出文件:x
:保存并退出文件(與:wq
類似):e filename
:打開另一個文件:sp
:水平分屏:vsp
:垂直分屏:tabnew
:打開新標簽頁
插入模式常用命令
進入插入模式的常用方式
i
:在 光標前 進入插入模式a
:在 光標后 進入插入模式I
:在 當前行首 進入插入模式(非空字符前)A
:在 當前行尾 進入插入模式o
:在 當前行下方 插入新行并進入插入模式O
:在 當前行上方 插入新行并進入插入模式
插入模式下的常用操作
刪除字符:
Backspace
:刪除光標前的字符Ctrl-w
:刪除光標前的一個單詞
撤銷和重做:
Ctrl-z
:撤銷上一步操作Ctrl-r
:重做撤銷的操作
跳轉到行首和行尾:
Ctrl-a
:將光標移到當前行的 開頭Ctrl-e
:將光標移到當前行的 末尾
光標控制:
Ctrl-f
:向前移動一屏(相當于滾動一頁)Ctrl-b
:向后移動一屏Ctrl-d
:向下滾動半頁Ctrl-u
:向上滾動半頁
退出插入模式
Esc
:退出插入模式,返回 普通模式
其他插入模式命令
Ctrl-h
:刪除光標前的字符(類似 Backspace)Ctrl-t
:在當前光標位置插入一個制表符(Tab)Ctrl-k
:刪除光標后到下一個空白字符的內容(刪除單詞)
可視模式常用命令
進入可視模式
v
:進入 字符可視模式,可以選擇一個字符并通過移動光標來擴展選擇區域V
:進入 行可視模式,可以選擇整個行并通過上下移動光標來擴展選擇區域Ctrl-v
:進入 塊可視模式,可以選擇一個矩形區域的文本塊,用于按列選擇文本
選擇范圍
j
/k
:在可視模式下,按j
向下選擇一行,按k
向上選擇一行h
/l
:在可視模式下,按h
向左選擇,按l
向右選擇w
:按單詞選擇,跳到下一個單詞并選中b
:按單詞邊界選擇,跳到上一個單詞并選中0
:將光標移動到行首,并開始選擇$
:將光標移動到行尾,并開始選擇
剪切和復制
d
:剪切選中的內容并將其存入寄存器(類似刪除)y
:復制選中的內容并將其存入寄存器(類似復制)
粘貼
p
:將剪切或復制的內容粘貼到光標 后面P
:將剪切或復制的內容粘貼到光標 前面
替換和刪除
r
:替換當前選擇的字符。例如,按r
后跟一個字符,會將選中的字符替換為該字符D
:刪除當前選中的文本直到行尾(相當于d$
)C
:刪除當前選中的文本并進入插入模式(相當于d
然后進入插入模式)
其他操作
>
:將選中的文本縮進一個層級<
:將選中的文本取消縮進一個層級=
:自動調整選中文本的縮進
退出可視模式
Esc
:退出可視模式,返回到普通模式
命令行模式常用命令
文件操作
:w
:保存當前文件:w filename
:將當前文件保存為指定的文件名:e filename
:打開指定的文件:q
:退出 Vim(如果沒有未保存的更改):q!
:強制退出 Vim,不保存更改:wq
或ZZ
:保存并退出文件:x
:保存并退出文件(與:wq
類似,但只有在有修改時才會保存):e!
:重新加載當前文件,丟棄所有未保存的更改:sp
或:split
:水平分割當前窗口并打開一個新文件:vsp
或:vsplit
:垂直分割當前窗口并打開一個新文件:close
:關閉當前窗口:only
:關閉所有其他窗口,保留當前窗口
搜索與替換
:/pattern
:在文件中向下搜索pattern
:?pattern
:在文件中向上搜索pattern
n
:跳到下一個匹配項N
:跳到上一個匹配項:%s/old/new/g
:在整個文件中替換old
為new
,并替換所有匹配項:s/old/new/g
:在當前行替換old
為new
,替換所有匹配項:%s/old/new/gc
:在整個文件中替換old
為new
,并在每個替換項時詢問確認:s/old/new/c
:在當前行替換old
為new
,并詢問是否替換
撤銷與重做
:undo
:撤銷上一步操作:redo
:重做上一步撤銷的操作:earlier
:回到更早的編輯狀態,可以指定時間(例如::earlier 10m
返回 10 分鐘前的狀態):later
:恢復到更晚的編輯狀態
查找與跳轉
:find filename
:查找并打開指定文件:locate pattern
:查找文件系統中的文件(需要配置支持locate
的環境)。:tags
:查看標簽文件:tag tagname
:跳轉到指定標簽的位置(通常與代碼導航相關):grep pattern
:在多個文件中搜索pattern
(依賴于系統中的grep
命令)
窗口管理
:windo command
:在所有窗口中執行命令(例如,:windo %s/foo/bar/g
替換所有窗口中的foo
為bar
):resize
:調整當前窗口的大小:vertical resize
:調整垂直分割窗口的大小
緩沖區與標簽
:ls
或:buffers
:列出當前打開的所有緩沖區:b buffer_number
:切換到指定的緩沖區:bnext
或:bn
:切換到下一個緩沖區:bprev
或:bp
:切換到上一個緩沖區:bdelete
或:bd
:刪除當前緩沖區
宏與寄存器
q{register}
:開始錄制宏,{register}
是你選擇的寄存器(例如:qa
錄制到寄存器a
)q
:停止錄制宏@{register}
:執行宏,例如@a
執行寄存器a
中的宏@@
:重復上一次執行的宏
交互式命令與歷史
:
:按:
進入命令行模式:history
:查看命令歷史q:
:打開命令歷史窗口,你可以選擇并運行歷史命令Ctrl-f
和Ctrl-b
:在命令歷史中向前和向后瀏覽
系統命令
:!command
:執行外部系統命令(例如,:!ls
列出當前目錄文件):sh
:進入 shell 環境,在 Vim 中執行 shell 命令:w !sudo tee %
:使用sudo
保存文件(常用于權限不足時保存文件)
退出 Vim
:qa
或:quitall
:退出所有打開的文件:qa!
:強制退出所有文件,不保存任何更改
參考鏈接
- 一起來說 Vim 語