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 命令
      • 在整个文件范围内重复面向行的替换操作
      • 修正 substitute 命令的执行范围
      • 结论
      • 修正 & 命令
    • Vim 技巧 - 使用子匹配重排 CSV 文件的字段
    • Vim 技巧 - 自动补全整行文本
    • Vim 技巧 - 以 g 开头的命令
    • Vim 技巧 - 以 z 开头的命令
    • Vim 技巧-ctrl 命令
    • Vim 技巧
    • 每日一 Vim 笔记
  • 键盘侠
  • Vim 技巧
Henry
2022-10-12
目录

Vim 技巧 - 重复上一次 substitute 命令

注:本文大部分功能 VSCodeVim 均不支持,只有 s//~/ 支持

有的时候,我们可能要修正 substitute 命令的执行范围。原因多种多样,有可能是由于在第一次尝试运行 substitute 命令时犯了错,也有可能是我们想在另一个缓冲区中再次运行相同的命令。我们可以利用一些快捷方式更容易地重复 substitute 命令。

# 在整个文件范围内重复面向行的替换操作

假设我们刚刚执行完以下命令(其作用范围为当前行):

➾:s/target/replacement/g

突然,我们意识到了失误,应该加上前缀 % 才对。幸好该命令没有造成什么不良后果。

接下来,我们只需输入 g&(参见:h g&),即可在整个文件的范围内重复这条命令。在效果上,它等同于以下命令:

➾:%s//~/&

这条命令可以详解为如下指令:用同样的标志位、同样的替换字符串、同样的查找模式以及新的执行范围 %,重复上一次 substitute 命令。换句话说,该命令表示在整个文件的范围内重复上一次替换操作。

当你下次再碰到某条 substitute 命令除了没加 % 前缀之外,其余都正确的时候,不妨试一试 g&。

# 修正 substitute 命令的执行范围

看一下这段代码:

假设我们想把它扩展成以下模样:

由于与现有的函数相比,新的 applyNumber 函数几乎没什么变化。因此,我们首先创建一份 applyName 函数的副本,然后用 substitute 命令将其中出现“Name”的地方改为“Number”。但下图所展示的操作流程有点问题。

你能发现问题所在么?由于我们采用符号 % 作为范围值,从而导致每一处“Name”都被改成了“Number”。这样做显然不对,我们应该指定一个范围,限定 substitute 命令只作用于第二个函数(副本)中的那几行文本才对。

不用担心。我们可以先简单地撤销一下,然后再进行修正

其中,gv 命令会激活可视模式,并重新将上次被选中的文本高亮起来。而当我们在可视模式下按输入 : 时,表示范围的 '<,'> 将被预先填充在命令行上,它限定了下一条命令只会在被选中的行上执行。

另外,我们需要解释一下 && 命令,因为这两处 & 符号的含义有所不同。前一个 & 作为 Ex 命令 :& 的组成部分,用作重复上一次的 :substitute 命令(参见:h :&),而第二个 & 则会重用上一次 :s 命令的标志位。

# 结论

我们总是可以指定一个新的范围,并使用 :&& 命令重新执行替换操作。至于上次用的范围是什么并不重要。具体来说,:&& 命令本身只作用于当前行,:'<,'>&& 会作用于高亮选区,而 :%&& 会作用于整个文件。正如我们已经看到的那样,g& 命令作为 :%&& 的快捷方式,使用起来会更方便一些。

# 修正 & 命令

& 命令是 :s 命令的同义词,用于重复上一次的替换操作。遗憾的是,不论我们使用什么标志位,& 命令都将忽略它们,这意味着本次替换的结果可能与上一次截然不同。

让 & 来触发 :&& 命令会更有用,因为后者会保留标志位,从而使得执行命令的结果始终如一。以下映射项旨在修正普通模式下的 & 命令,并为可视模式创建一个类似的命令。

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 用寄存器的内容替换
Vim 技巧 - 使用子匹配重排 CSV 文件的字段

← Vim 技巧 - 用寄存器的内容替换 Vim 技巧 - 使用子匹配重排 CSV 文件的字段→

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