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 模式
      • 按正则表达式查找时,使用 \v 模式开关
      • 按原义查找文本时,使用 \V 原义开关
      • 历史课堂:Vim 模式语法的传承
    • 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-03
目录

Vim 技巧 - 查找使用 v 或 V 模式

目前 VSCodeVim 还不支持此功能,就简单介绍一下

在正则表达式中,某些符号具有特殊含义,而不是其本身的含义

但 Vim 缺省使用 magic 搜索模式,即这些符号就是其本身含义,要使用其特殊含义,需要转义一下

# 按正则表达式查找时,使用 \v 模式开关

我们可以利用 \v 模式开关来统一所有特殊符号的规则。该元字符将会激活 very magic 搜索模式,即假定除_、大小写字母以及数字 0 到 9 之外的所有字符都具有特殊含义(参见:h \v)。

比如我们要匹配 css 颜色代码:我们需要匹配 1 个 # 字符以及紧随其后的 3 个或 6 个十六进制字符(包括所有数字以及大写或小写的字母 A 到 F)。

下面的正则表达式将满足这些需求:

➾/#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)

尽管这个正则表达式能够完成任务,但你看看这些反斜杠,竟有 5 处之多!

在此例中,我们用到了 3 类括号。方括号缺省具有特殊含义,因此不用转义。圆括号会按原义匹配字符 (及),因此需要转义,使其具有特殊含义。花括号也一样需要转义,不过,我们只需为开括号转义,而与之对应的闭括号则不用,因为 Vim 会推测我们的意图。圆括号的情况有所不同,无论开闭括号都必须转义。

这一次,让我们使用 \v 模式开关,来重写那个匹配十六进制颜色代码的正则表达式:

➾/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})

由于出现在起始位置的 \v 开关,位于它后面的所有字符都具有特殊含义。这样一来,那些反斜杠字符就可以去掉了,可读性是不是更强了?

我们可以进一步优化这个模式,在拼写时,用字符类 \x 代替完整的字符集 [0-9a-fA-F](参见:h/character-classes)。以下模式等同于前面的那个:

➾/\v#(\x{6}|\x{3})

最后说明一点:字符 # 没有特殊含义,因此可按原义匹配。还记得 very magic 搜索模式是把除_、字母和数字以外的所有字符都当作具有特殊含义的字符吗?看样子我们已经发现了该规则的一个特例。

对于这个问题,Vim 的解释是任何还未具有特殊含义的字符都被“保留以备将来扩展时使用”(参见:h /\)。换句话说,尽管 # 目前不具有特殊含义,但不意味着将来的版本也会这样。万一将来 # 被赋予了特殊含义,我们必须要将其转义后,才可以匹配“#”字符本身。

# 按原义查找文本时,使用 \V 原义开关

在正则表达式中使用的特殊字符,在按正则模式查找时用起来很顺手,但如果我们想按原义查找文本时,它们就变成了阻碍。使用 very nomagic 原义开关,可以消除附加在 .、* 以及?等大多数字符上的特殊含义。

来看一下这段文本:

现在假设我们想通过查找“a.k.a.”(此缩写表示 also known as)的方式将光标移到该处。针对这种情况,第一反应就是执行以下这条查找命令:

➾/a.k.a.

但当我们按下回车键时,会发现此模式所匹配的内容比我们预想得要多。这是因为,符号“.”具有特殊含义。它匹配任意字符,而单词“backward”的部分内容又恰好可以匹配该模式。下表展示了查找的结果。

我们在本例中遇到的麻烦还不算大,因为只需按一下 n 键,我们就可以跳到下一处匹配——真正的目标。但在有些情况下,如果某个匹配被误判为正确,可能会有潜在的风险。想象一下,如果我们还没意识到查找模式太宽泛了,就接着运行了 substitute 命令,例如,:%s//also␣known␣as/g(正如在 Vim 技巧 - 把当前单词插入到命令行所讨论的那样,若将:substitute 命令的查找域留空,Vim 将使用上一次的查找模式),会导致某些意想不到的错误发生。

我们可以用转义的方法消除 . 字符的特殊含义。以下模式不会匹配单词 backward 中的一部分,但仍然会匹配“a.k.a”:

➾/a\.k\.a\.

或者,我们可以使用原义开关\V,激活 very nomagic 搜索模式:

➾/ \Va.k.a.

正如 Vim 帮助文档所述,“使用 "\V"会使得其后的模式中只有反斜杠有特殊的意义”(参见:h/\V)。这样做未免过于简化了,但却符合本例的目的。

在 very nomagic 搜索模式下创建正则表达式也不是不可能,不过会很别扭,因为我们必须为每个符号转义。作为通用法则,如果你想按正则表达式查找,就用模式开关\v,而如果你想按原义查找文本,就用原义开关\V。

# 历史课堂:Vim 模式语法的传承

对于 Vim 的模式来说,除了由 \v 与 \V 开关使能的语法外,还有两种更为古老的语法。Vim 缺省使用 magic 搜索模式,而 nomagic 模式则用于模拟 vi 的行为,我们可以通过 \m 与 \M 开关,来分别使能这两种语法。

\M 作为 nomagic 搜索模式的开关,其功能类似于 \V 原义开关,不同的是,一些字符会自动具有特殊含义,即符号 ^ 与$。

magic 搜索模式会自动为某些额外的符号赋予特殊含义,例如:.、*以及方括号。magic 模式的设计初衷,是想能更容易地构造简单的正则表达式,但它却没能为诸如 +、?、圆括号以及花括号等符号赋予特殊含义,这些符号还必须经过转义才具有特殊含义。

magic 搜索模式旨在让构造正则表达式变得容易,但却半途而废,导致对于哪些字符需要转义的规则制定得比较混乱,难以记忆。\v 模式查找开关正好弥补了这一点,除了 _、数字以及字母外,它为所有符号都赋予了特殊含义。这样一来,既好记又恰好与 Perl 正则表达式的规则保持一致。

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