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

Vim 技巧 - 将光标偏移到查找匹配的结尾

我们可用查找偏移把光标定位于距离某个匹配的起始或结尾一定步长的位置。在本节中,我们将通过一个例子,研究如何将光标定位于匹配的结尾,这样一来,我们就可以用点范式完成一系列的修改操作了。

每当我们执行查找命令时,光标总会被定位于匹配的首字母上。虽然这种缺省操作看起来比较合理,但我们可能有时更倾向于将光标定位于查找匹配的结尾。Vim 的查找偏移功能,可以将此想法变为现实(参见:h search-offset)。

让我们研究一个例子。在下段文本中,作者始终把单词“language”写成了缩写形式:

要怎样才能把所有出现“lang”的这 3 处地方扩展为完整的单词?一种方案是使用 substitute 命令,即 :%s/lang/language/g。但是,让我们看看是否可以用点范式作为另一种方案。我们可能会沿着这种思路学到些什么。

我们先不使用查找偏移功能处理此问题。首先,我们要找到需要修改的字符串 /langCR>,该命令把光标移到第一处匹配的起始位置。然后,我们输入 eauage<Esc>,即可在单词结尾添加新的内容。在某个单词的结尾添加文本是很常见的任务,你可以不假思索地把 ea 敲出来,就好像它们是一条命令似的。

现在,我们只需将光标移至正确的位置,后续工作交由 . 命令处理就可以了。通过输入 ne.,我们可以修改下一处“lang”。其中,n 表示跳转至下一处匹配的起始位置,e 负责将光标移至单词结尾,而 . 会补全单词所需的字母。这总共是 3 次按键操作,虽然没能达到理想的点范式,但至少完成了工作。

果真如此么?如果我们第二次执行相同的命令,即 ne.,结果却破坏了最后匹配的那个单词。你能找出问题所在么?最后一处匹配“lang”的地方实际上是“languages”的缩写(注意是复数形式)。因此,如果我们盲目地重复那个不太理想的点范式的话,将会得到一个不伦不类的“langsuage”。很明显,在这个场景中,如果能把光标移到匹配的结尾,而不是单词的结尾,那就完美了。

这一次,我们使用 /lang/e<CR> 进行查找,该命令会像我们期望的那样,将光标置于查找匹配的结尾。这样一来,每当我们使用 n 命令时,光标都会被定位于下一处查找匹配的结尾,让我们可以完美地使用 . 命令。可以说,查找偏移功能让我们得到了理想的点范式。

在实际使用过程中,查找偏移功能被派上用场的时机并不太好把握。假设我们一开始并没有用偏移执行查找命令,而是在敲了若干次 n 之后,才发现最好将光标移至匹配的结尾。亡羊补牢,犹未为晚。我们可以简单地运行 //e<CR>。当我们把查找域留空时,Vim 将重用上一次的查找模式,因此,该命令将使用偏移重复上一次查找。(注:目前 VSCodeVim 还不支持此功能)

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