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 命令也一样会重用上一次的字符串吧?但事实并非如此。将替换域留空,意味着 substitute 命令会用空的字符串替换每一处匹配。换句话说,所有的匹配都被删除了。

# 传值

通过输入 <C-r>{register},我们可以将寄存器的内容插入到命令行。假设我们已经复制了一些文本,如果要将它们粘贴到 substitute 命令的替换域,需要输入以下命令:

➾:%s//<C-r>0/g

当我们输入 <C-r>0 时,Vim 会把寄存器 0 的内容粘贴进来,这意味着我们可以在执行 substitute 命令之前对其进行一番检查。在大多数情况下,它工作得都很好,但也引入了新的问题。

如果寄存器 0 中的文本包含了在替换域中具有特殊含义的字符(例如&或~),我们必须手动编辑这段文本,对这些字符进行转义。另外,如果寄存器 0 包含多行文本,有可能在命令行上显示不全。

为了避免这些问题,我们可以在替换域中简单地引用某个寄存器,从而得到该寄存器的内容。

# 引用

假设我们已经复制了多行文本,并存放于寄存器 0 中。我们现在的目标是在 substitute 命令的替换域中使用这段文本。通过运行以下命令,可以做到这一点:

➾:%s//\=@0/g

替换域中出现的 \= 将指示 Vim 执行一段表达式脚本。在 Vim 脚本中,我们可以用 @{register} 来引用某个寄存器的内容。具体来说,@0 会返回复制专用寄存器的内容,而 @" 则返回无名寄存器的内容。因此,表达式 :%s//\=@0/g 表示 Vim 将会用复制专用寄存器的内容替换上一次的模式。

注:VSCodeVim 不支持此功能

# 比较

先看一下这条命令:

➾:%s/Pragmatic Vim/Practical Vim/g

再与以下命令序列进行比较:

➾:let @/='Pragmatic Vim'

➾:let @a='Practical Vim'

➾:%s//=@a/g

其中,:let @/='Pragmatic Vim'是采用编程的方式输入查找模式,它等同于直接执行查找命令/Pragmatic Vim<CR>(有一点不同,即运行:let @/='Pragmatic Vim'不会在查找历史中留下任何记录)。

同样的道理,:let @a='Practical Vim'表示设置 a 寄存器的内容。它等同于高亮选中“Practical Vim”并用 "ay 将选中的文本存入寄存器 a。

这两条 substitute 命令都完成同一件事,即把所有“Pragmatic Vim”替换为“Practical Vim”。但我们要考虑一下它们各自的影响。

第一种方法,会在命令历史中留下一项内容为:%s/Pragmatic Vim/Practical Vim/g的记录,使人一目了然。在稍后的编辑过程中,如果我们意识到要重复这条命令的话,可直接从命令历史中调出该项记录,即可加以执行。总之,不会有什么意外发生。

而第二种方法,会在命令历史中留下一项内容为:%s//\=@a/g 的记录。这看上去是不是相当神秘呢?

试想一下,当我们首次运行 substitute 命令时,查找模式为“Pragmatic Vim”,而寄存器 a 包含文本“Practical Vim”。但是半小时之后,当前的查找模式可能已经被多次修改了,而且寄存器 a 也可能被其他内容所覆盖。因此,如果我们重复:%s//\=@a/g 命令的话,结果会与第一次执行这条命令时截然不同。

我们可以利用这一特点。首先,我们查找要操作的文本,并将替换的内容复制到寄存器 a 中。之后,我们可以重复调用命令:%s//\=@a/g,而该命令会使用刚刚被赋值的 @/ 和 @a 中的内容。接下来,我们可以查找新的文本,并复制新的替换字符串至寄存器 a。而当我们再次重复 :%s//\=@a/g 命令时,运行结果将会迥然不同。

此法不妨一试。你或许会爱上它,也可能会讨厌它。但无论哪种情况,都是不错的技巧。

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 重用上次的查找模式
Vim 技巧 - 重复上一次 substitute 命令

← Vim 技巧 - 重用上次的查找模式 Vim 技巧 - 重复上一次 substitute 命令→

最近更新
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
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式