-
概述
- VIM 宏的基本操作
-
背景
- 之前退出, 查歷史記錄的時候, 偶然按錯
- 某些動作, 不是單純依靠 替換操作, 就做得出來的...
-
環境
- OS
- win10
- shell
- mintty-2.9.4
- OS
1. 宏
-
概述
- 什么是宏
-
宏
-
百度百科
宏就是一些命令組織在一起,作為一個單獨命令完成一個特定任務 -
我的感覺
- 操作有序集合
- 一個宏通常含有多個 順序關聯的操作
- 小規模
- 操作的數量很小
- 使用場景通常受限
- office 宏
- wow 技能宏
- 操作有序集合
-
2. 一些操作
- 概述
- 簡單聊聊基本操作
1. 宏的查看
- 概述
- 查看當前宏的情況
1. 列表查看
-
操作
# 查看 :reg # 退出查看 鍵盤上任意鍵即可 -
reg
-
寄存器
- 可以理解位 vim 的剪貼板
- 但實際上, 它的功能還挺強大...
- 這個我后面再說吧
-
宏
-
名稱
- "a 開始, "z 結束都是宏
- 后文簡稱 宏a 到 宏z
- 這里不區分 大小寫
- 最多只能有 26 個宏
- 后文簡稱 宏a 到 宏z
- 其他的內容, 以后再講
- "a 開始, "z 結束都是宏
-
存在
- 已經錄制的宏, 是可以在列表里查看到的
- 沒有錄制的宏, 是不會顯示的
- 同一個用戶下, 不同的 vim 窗口, 宏是可以共享的
- 存在 ~/.viminfo 里
- 不建議直接修改這個文件
-
-
2. 單獨查看
-
命令
: reg a -
結果
- 如果存在, 則只顯示 宏a
- 如果不存在, 則宏內容顯示位空
2. 宏的錄制
-
概述
- 宏的錄制
- 當然最開始是沒有宏的
- 所以查看不到的話, 自己錄制一個就行了
- 宏的錄制
-
准備
-
文本
1 2 3 4 5 -
思路
- 給每一行的數值 +1
- 我想把這個宏, 錄制到 宏a 里
-
操作
- 定位到 第一行 行首
- 使用 ctrl + a, 給數值 +1
- 將光標移到第二行行首
-
其他
- vim 處於 標准模式
-
-
錄制步驟
-
定位到 第一行 行首
-
鍵盤依次輸入
# 成功后, 左下角會有狀態變化 # 顯示 記錄中/Recoding @a q a -
使用 ctrl + a, 給數值 +1
-
將光標移到第二行行首
-
鍵盤輸入
# 右下角提示消逝, 錄制結束 q
-
-
查看
-
命令
- 用 :reg 查看
-
結果
-
能找到如下記錄
"a ^Aj
-
-
-
疑問
-
問題1: 進入后, 按 q 退出, 那我要是需要按 q 了, 怎么辦呢?
- 解答
- 標准模式下, q 只有 開始/結束 錄制的功能
- 插入模式里, 輸入 q 不會導致 錄制退出
- 解答
-
問題2: 26 個宏如果用完了, 還想再加怎么辦
- 解答
- 26 個宏, 通常是夠用的
- 如果還需要加, 只有覆蓋之前用過的位置了
- 所以, 錄制之前一定要先確定好, 不要讓之前辛苦錄制的宏, 被莫名其妙的覆蓋了...
- 解答
-
問題3: 這個錄制能暫停嗎?
- 我不知道...
-
問題4: 錄制宏的時候, 可以使用別的宏嗎?
- 解答
- 我試了試, 目前來看 VIM 並沒有禁止這種 疑似套娃 的行為
- 或者說, 宏是可以相互調用的吧...
- 沒試過自制死循環...
- 甚至可以專門定義一個宏, 來按順序執行一個 或者 多個 其他宏
- 或者說, 宏是可以相互調用的吧...
- 我試了試, 目前來看 VIM 並沒有禁止這種 疑似套娃 的行為
- 解答
-
3. 宏的使用 - 簡單
-
概述
- 宏的簡單使用
-
目的
- 讓第二行的數字, 也加上個1
- 當然是用宏操作, 而不是再來一次
- 讓第二行的數字, 也加上個1
-
確認
- reg 里宏, 就是我們想要的內容
-
操作
-
定位到 第二行 行首
-
依次輸入
@ a
-
-
結果
- 第二行數字變成了 3
- 光標移動到了 第三行
-
疑問
- 問題1: 后面還有三個數, 我一個一下一下 @a 也不輕松啊
- 解答
- @@ 可以重復執行之前執行過的宏
- 可以有辦法一次多行執行多次
- 解答
- 問題1: 后面還有三個數, 我一個一下一下 @a 也不輕松啊
4. 宏的使用 - 進階
- 概述
- 宏的一些 進階用法
- 其實這些進階, 也沒進多少, 先湊合用吧
- 宏的一些 進階用法
1. 多次執行
-
概述
- 嘗試多次執行同一個宏
-
目的
- 將 3 到 5 行的數字都加一
-
操作
-
光標定位到 第三行
-
依次輸入內容
# 用 @@ 也是可以的 3 @ a
-
-
結果
- 宏執行了 3 次
- 后面的三行, 都加了1
-
問題
- 問題1: 這種手操, 感覺也是有局限性的
- 解答
- 我也是這么覺得
- 但是 VIM 肯定不會讓你失望的
- 解答
- 問題1: 這種手操, 感覺也是有局限性的
2. EX 命令行: normal
-
概述
- EX 命令行執行操作的示例
-
操作1: 指定單行
-
命令
# 假設我們想讓 當前行 執行這個宏 : normal @a # 假設我們想讓 第4行 執行這個宏 :4 normal @a # 結果我就略了 -
解釋
- normal
- 在 EX 命令行關鍵字
- normal 后面的內容, 會被翻譯為 標准模式 下的 指令
- normal
-
-
操作2: 多行執行
-
命令
# 我想讓 1 到 4 行執行這個宏 : 1,4 normal @a # 結果我就略了
-
-
操作3: 匹配執行
-
命令
# 假設想要匹配某個 4 執行宏 # ex 的全局匹配, 本來應該先講的, 以后補上 # 匹配到后, 光標會自動停在 4 的前面 # 感覺這個是一個很實用的操作了 : g/4/ normal @a
-
3. v 模式 與 EX 命令
-
概述
- v 模式下的 EX 命令
-
操作1: v 模式下執行
- 操作
-
進入 v 模式
-
選定多行
-
進入 EX 命令行
-
命令
# '<,'> 是 v 模式下自帶的, 沒有問題 '<,'> normal @a # 結果我就略了
-
- 操作
4. 問題
- 問題1: 宏可以編輯嗎
- 解答
- 可以的
- 解答
5. 宏的追加
-
概述
- 宏的追加
-
命令
# 對 宏a 追加 q + A # 沒錯, 是 大寫的A # 輸入追加操作 # q 退出 -
問題
- 問題1: 這種編輯, 感覺還是有局限性
- 解答
- 確實, 只能通過 標准模式 下的操作, 來執行
- 如果中間或者前面出現了問題, 又得重來
- 辦法還是有的
- 解答
- 問題1: 這種編輯, 感覺還是有局限性
6. 宏的導入導出
-
概述
- 宏的 導入 和 導出
-
准備
- 建議把光標移動到文件的最低端
- 新建一個空行
- 光標停留在空行, 並切回 標准模式
1. reg
-
概述
- 本質是 剪貼板 的操作
- 推薦這種
-
導出
# 導出 宏a "ap -
導入
# 光標放在行首 "ay$
2. EX 命令
-
概述
- 使用 ex 命令行
-
導出
# 導出 宏a # 注意留意光標位置, 會額外生成一個 空行 put a -
導入
# 有個坑, 就是 ctrl 直接復制過去, 會變成 ^, 無法生效 # 手動按會生效, 但是感覺這沒啥意義... let @a="<宏內容>" # 但是如果這條路走通了, 就可以利用 vimrc 了 # 路已經走通了, 下一篇文章就說
3. 后續
-
EX 命令里的 reg
- 這玩意我之前沒用過...
-
通過 vimrc 可以將我們常用的宏, 導入到 vim 中
- 一上來就能直接用了...
- 當然那個 Ctrl 的轉義, 我至今沒搞明白
- 想想就帶感, 但是我覺得自己還得努力找找...
- 一上來就能直接用了...
ps
-
ref
- 百度百科 - 宏
- VIM中的寄存器簡介
- reg 的簡介, 有空看看
- vim 錄制宏,自動循環執行組合操作
- vim 教程網
- 一個 vim 的教程網
- 我從知乎上找進去的
- 好像是個妹子獨立維護
- vimtutor
- 不愧是北航的學生, 學渣給跪了...
- 一個 vim 的教程網
- Vim寄存器與宏常用命令匯總
- 講得不錯
- 原文不在了, 只有貼轉載了...
-
后續
-
:reg
- 一個強大的剪貼板
-
:normal
- 這么看來的話, EX 命令行應該是可以做 vim 里幾乎所有的很多操作了
- 這么說的話, 腳本化這個東西, 應該會帶來很大的便利
- 這么看來的話, EX 命令行應該是可以做 vim 里幾乎所有的很多操作了
-
map/nmap
- 這是什么玩意
-
