VIM - 宏 - 简单使用
-
概述
- 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
- 这是什么玩意
-
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出