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-10-12
目录

Vim 技巧 - 重用上次的查找模式

将 substitute 命令的查找域留空,意味着 Vim 将会重用上次的查找模式。我们可以利用这一特点精简工作过程。

事实明摆着,为了执行一次 substitute 命令,我们必须要打很多字。首先,指定命令的执行范围;然后,输入查找模式以及替换域的内容;最后,在命令末尾添加合适的标志位。由此可见,我们需要考虑的东西有很多,无论在哪一字段敲错了键,都有可能导致结果出现偏差。

好消息是当我们把查找域留空时,就会让 Vim 使用当前的模式。

看看这个庞大的 substitute 命令吧(技巧 - 利用查找历史,迭代完成复杂的模式):

➾:%s/\v'(([^']|'\w)+)'/“\1”/g

它等价于以下两条单独的命令:

➾ /\v'(([^']|'\w)+)'

➾:%s//“\1”/g

那又怎样?因为不管怎么变,我们还是得输入完整的模式,对吧?但这并不是关键。执行 substitute 命令通常包括两个步骤:一是撰写查找模式,二是设计合适的替换字符串。因此,一分为二的技术让我们消除了这两项任务的耦合性,这才是关键所在。

在我们撰写复杂的正则表达式过程中,通常需要尝试多次才能达到正确的匹配效果。如果打算通过执行 substitute 命令的方式来验证模式的话,每次执行命令都会改变文档的内容,这样做简直太麻烦了。与之形成鲜明对比的是,当执行查找命令时,文档不会被修改。因此,即使我们犯的错误再多也无所谓。总之,将两个任务彻底分开,将使得我们的工作过程更加清晰。正所谓,万事俱备,一举成功。

# 并非永远奏效

我的意思并不是说绝对不能在 substitute 命令的查找域中输入文本。例如,下面的 substitute 命令会把文件中每一行的换行符都替换为逗号,最终形成一行。

➾:%s/\n/,

对于这种简单的命令,就没必要将它一分为二了。否则的话,非但得不到什么好处,反而有可能增加工作量。

# 对命令历史的影响

另外需要注意一点,把查找域留空,会在命令历史中留下一项不完整的记录。由于模式通常保存在 Vim 的查找历史记录中,而 substitute 命令则保存于 Ex 命令的历史记录中(参见:h cmdline-history)。因此,将查找任务与替换任务分离,会致使这两组信息被单独存放,从而导致当你再想重用之前的 substitute 命令时,会遇到困难。

如果你觉得将来会以完整形式来调用历史记录中的 substitute 命令,就要养成在查找域中填充内容的习惯。你只需在命令行中输入<C-r>/,即可把上次的查找内容粘贴进来。因此,通过以下命令,我们就可以在命令历史中创建一项完整的记录。

➾:%s/<C-r>//“\1”/g

在使用 substitute 命令时将查找域留空,有时很方便,有时却很麻烦。两种方法都体验一下,你就会形成自己的直觉,并依此来判断使用的时机。就像我常说的那样,要靠你自己的判断。

编辑 (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
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式