Henry Henry
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)

Henry

小学生中的前端大佬
  • JavaScript
  • TypeScript
  • Vue
  • ElementUI
  • React
  • HTML
  • CSS
  • 技术文档
  • GitHub 技巧
  • Nodejs
  • Chrome
  • VSCode
  • Other
  • Mac
  • Windows
  • Linux
  • Vim
  • VSCode
  • Chrome
  • iTerm
  • Mac
  • Obsidian
  • lazygit
  • Vim 技巧
  • 分类
  • 标签
  • 归档
  • 网站
  • 资源
  • Vue 资源
GitHub (opens new window)
  • 说明
  • Vim

  • VSCode

  • Chrome

  • iTerm

  • mac

  • Obsidian

  • lazygit

  • 学习双拼
  • Vim 技巧

    • Vim 技巧 - 说明
    • Vim 技巧 - 以退为进
    • Vim 技巧 - 点范式
    • Vim 技巧 - 把撤销单元切成块
    • Vim 技巧 - 构造可重复的修改
    • Vim 技巧 - 用次数做简单的算术运算
    • Vim 技巧 - 能够重复,就别用次数
    • Vim 技巧 - 在插入模式中可即时更正错误
    • Vim 技巧 - 结识插入 - 普通模式
    • Vim 技巧 - 不离开插入模式,粘贴寄存器中的文本
    • Vim 技巧 - 重复执行面向行的可视命令
    • Vim 技巧 - 只要可能,最好用操作符命令,而不是可视命令
    • Vim 技巧 - 结识 Vim 的命令行模式
    • Vim 技巧 - 在一行或多个连续行上执行命令
    • Vim 技巧 - 使用‘:t’和‘:m’命令复制和移动行
    • Vim 技巧 - 在指定范围上执行普通模式命令
    • Vim 技巧 - 重复上次的 Ex 命令
    • Vim 技巧 - 把当前单词插入到命令行
    • Vim 技巧 - 回溯历史命令
    • Vim 技巧 - 运行 Shell 命令
    • Vim 技巧 - 将工作区切分成窗
    • Vim 技巧 - 区分实际行与屏幕行
    • Vim 技巧 - 通过查找进行移动
    • Vim 技巧 - 遍历改变列表
    • Vim 技巧 - 用无名寄存器实现删除、复制与粘贴操作
    • Vim 技巧 - 深入理解 Vim 寄存器
    • Vim 技巧 - 用寄存器中的内容替换高亮选区的文本
    • Vim 技巧 - 把寄存器的内容粘贴出来
    • Vim 技巧 - 宏的读取与执行
    • Vim 技巧 - 规范光标位置、直达目标以及中止宏
      • 规范光标的位置
      • 用可重复的动作命令直达目标
      • 当动作命令失败时,宏将中止执行
    • Vim 技巧 - 加次数回放宏
    • Vim 技巧 - 在连续的文本行上重复修改
    • Vim 技巧 - 给宏追加命令
    • Vim 技巧 - 编辑宏的内容
    • Vim 技巧 - 调整查找模式的大小写敏感性
    • Vim 技巧 - 查找使用 v 或 V 模式
    • Vim 技巧 - 界定单词的边界
    • Vim 技巧 - 转义问题字符
    • Vim 技巧 - 结识查找命令
    • Vim 技巧 - 在执行查找前预览第一处匹配
    • Vim 技巧 - 将光标偏移到查找匹配的结尾
    • Vim 技巧 - 利用查找历史,迭代完成复杂的模式
    • Vim 技巧 - 结识 substitute 命令
    • Vim 技巧 - 在文件范围内查找并替换每一处匹配
    • Vim 技巧 - 手动控制每一次替换操作
    • Vim 技巧 - 重用上次的查找模式
    • Vim 技巧 - 用寄存器的内容替换
    • Vim 技巧 - 重复上一次 substitute 命令
    • Vim 技巧 - 使用子匹配重排 CSV 文件的字段
    • Vim 技巧 - 自动补全整行文本
    • Vim 技巧 - 以 g 开头的命令
    • Vim 技巧 - 以 z 开头的命令
    • Vim 技巧-ctrl 命令
    • Vim 技巧
    • 每日一 Vim 笔记
  • 键盘侠
  • Vim 技巧
Henry
2022-09-22
目录

Vim 技巧 - 规范光标位置、直达目标以及中止宏

执行宏的过程中,有时会产生意外的结果,但如果我们能遵从一些最佳的应用方式,就能取得更好的一致性。

当我们执行一个宏时,Vim 会机械地重复这个打包在一起的按键操作序列。如果我们不小心的话,在回放宏时的结果会偏离我们的预期。但我们也可以录制更灵活的宏,针对每一种情况,它都能应对自如。

黄金法则:在录制一个宏时,要确保每条命令都可被重复执行。

# 规范光标的位置

一旦你开始录制宏,首先要问自己几个问题,我在哪里?我从哪里来?我要去哪里?在你做任何事之前,要确保你的光标位置已经就位,只有这样,下一条命令才会做你想做的事情,去你想去的地方。

这也许意味着应该把光标移到下一处查找匹配项(n),或者当前行的行首(0),又或是当前文件的首行(gg)。如果每次总是从确定的位置开始执行的话,那么命中正确的目标会变得更容易。

# 用可重复的动作命令直达目标

Vim 有一组丰富的动作命令集,通过它们,可以直达文本文件的各个角落。因此,我们要善用这些命令。

千万别光为了让光标到达目标而一味地敲 l 键。请记住,Vim 会机械地执行你的按键操作。例如,当你录制宏时,将光标向右移动了 10 个字符的位置,这一次目的是达到了,但回放宏时怎么办?因为在另一段上下文中,“将光标向右移动 10 个字符的位置”也许已经移过了,或是还没到。

面向单词的动作命令,如 w、b、e 和 ge,与面向字符的动作命令 h 和 l 相比,更具灵活性。如果我们录制“动作命令 0,后跟 e”,当每次执行该宏时,我们都能预料得到一致的结果,光标会移到当前行第一个词的最后一个字符上。只要该行包含至少一个词,无论该词包含多少个字符,都能够到达目标。

我推荐你用查找命令定位,或者用文本对象。总之,请用好 Vim 提供的所有动作命令,尽量使你的宏兼具灵活性与可重复性。还有一点别忘了,在录制宏的过程中,禁止使用鼠标。

# 当动作命令失败时,宏将中止执行

Vim 的动作命令可能会执行失败。举例来说,如果光标位于文件的首行,运行 k 命令将什么也不会发生。若光标位于文件的末行,按下 j 也会出现同样的情况。当发生上述情况时,Vim 会提示我们动作命令失败了。

如果宏执行动作命令失败了,Vim 将中止执行宏的其余命令。这是一项功能,而不是漏洞。我们可以用动作命令进行简单测试,来判断该宏是否应该在当前上下文中继续执行。

考虑这样一个例子:我们要查找一个模式(pattern),假设文档中有 10 处匹配。我们开始录制宏,先用 n 重复上一次的查找操作。一旦光标移到匹配处,我们会做一些小的修改。然后,停止宏的录制。改完这处后,这个地方就再没有可匹配的模式了。至此,整篇文档只剩 9 处匹配了。

当我们执行这个宏时,光标将移到下一处匹配并做相同的修改。至此,整篇文档只剩下 8 处匹配了。就这样,我们周而复始地执行该宏,直到再也没有一处匹配为止。若此时再执行该宏,由于已没有匹配项,n 命令会失败,宏将中止退出。

假设宏保存在寄存器 a 中。这一次,我们不再执行 10 次 @a,而是改用次数作为前缀执行宏 10@a。这种技术的过人之处,就在于执行宏的时候,可以不必顾忌执行的次数。真的不用去管执行次数了么?当然!我们可以执行 100@a,甚至是 1000@a,反正结果都是一样的。

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 宏的读取与执行
Vim 技巧 - 加次数回放宏

← Vim 技巧 - 宏的读取与执行 Vim 技巧 - 加次数回放宏→

最近更新
01
version 1.15
07-01
02
version 1.14
06-27
03
version 1.13
06-27
更多文章>
Theme by Vdoing | Copyright © 2017-2023 HenryTSZ | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式