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-21

Vim 技巧 - 用寄存器中的内容替换高亮选区的文本

Vim 的粘贴命令在可视模式下使用时,会体现出一些不同寻常的特性。我们将在本节深入挖掘其可用价值。

在可视模式下使用 p 命令时,Vim 将用我们指定的寄存器内容来替换高亮选区中的文本(参见 :h v_p)。我们可以利用该功能解决糟糕!我弄丢了复制内容中的问题。

对于这个特定问题,此法是我本人最中意的方案,它不再把无名寄存器既用于复制又用于删除,因为根本就没有删除这一步。相反的,我们把删除和粘贴合成了一步,完成高亮选区的替换。

当然,了解此法的副作用也很重要。首先,我们输入 u 撤销上次的修改。然后,按 gv 重选上一次高亮选区的内容,再按一次 p 键。发生了什么?显然什么也没发生。

如果要达到我们的目的,还得按 "0p,即用复制专用寄存器的内容替换高亮选区中的文本。我们在第一次使用 p 时,之所以成功,是因为无名寄存器恰巧包含了我们想要的文本。但在第二次使用 p 时,无名寄存器包含的是被覆盖的内容,即 somethingInTheWay。

为了进一步解释这事有多离奇,让我们假设有一个 API,它为标准的剪切、复制与粘贴操作提供服务。该 API 有两个名为 setClipboard() 与 getClipboard() 的成员方法。剪切与复制操作都调用 setClipboard() ,而粘贴操作调用 getClipboard()。在 Vim 的可视模式下使用 p 命令时,会先后调用这两个方法。首先,从无名寄存器里取出内容,然后,把高亮选区中的内容存入无名寄存器。

继续沿着思路想下去,高亮选区中的内容与寄存器的文本被调包了。这是原本的设计初衷还是漏洞?你自己看着办吧。

要想连续粘贴相同的内容,可以修改一下 p 键:

"vim.visualModeKeyBindingsNonRecursive": [
  // 在可视模式下绑定 p 以粘贴而不覆盖当前寄存器:
  {
    "before": ["p"],
    "after": ["p", "g", "v", "y"]
  }
],
1
2
3
4
5
6
7

不过你就无法使用下面的技巧了

交换两个词

针对 Vim 在可视化粘贴时的这一特点,我们可以加以利用。假设我们想交换以下句中两个单词的次序,改为“fish and chips”。

首先,我们使用 de 把单词“chips”剪切掉,实际上是把它复制到了无名寄存器;然后,再选中要替换的单词“fish”。当我们执行 p 命令时,单词“chips”将重新出现在文档中,而单词“fish”则会被复制到无名寄存器。最后,我们把光标重新移到因删除“chips”而留下的空白处,再将单词“fish”从无名寄存器粘贴回文档即可。

针对此例而言,如果我们用 c3w 命令删除“chips and fish”并重新输入“fish and chips”,应该会更快地完成任务。但是,以上方法可被用于交换更长的短语。

m{char} 命令负责设置标记,而 `{char} 命令将跳转到该标记。

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 深入理解 Vim 寄存器
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
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式