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-04
目录

Vim 技巧 - 只要可能,最好用操作符命令,而不是可视命令

可视模式可能比 Vim 的普通模式操作起来更自然一些,但是它有一个缺点:在这个模式下 . 命令有时会有一些异常的表现。我们可以用普通模式下的操作符命令来规避此缺点。

假设我们想把下面列表中的链接文字转换为大写格式:

我们可以用 vit 来选择标签里的内容。vit 可被解读为高亮选中标签内部的内容(visually select inside the tag),其中,it 命令是一种被称为文本对象(text object)的特殊动作命令

# 使用可视模式下的命令

在可视模式中,我们可以选定一个选区然后对其进行操作。本例中,我们可以使用 U 命令来把所选中的字符转换为大写

在转换完第一行后,现在我们想对接下来的两行进行同样的修改。用点范式试一下吧,怎么样?

好,我们执行一下 j. 命令,把光标移到下一行并重复上次的修改。此命令在第二行工作得很好,但如果我们再执行一次,最终就会得到这个看起来有点古怪的结果:

你看到发生什么了吗?当一条可视模式命令被重复执行时,它会影响相同数量的文本。在本例中,最初的命令影响了一个由 3 个字母组成的单词。在第二行它依旧工作得很好,因为该行恰好也包含一个由 3 个字母组成的单词。但是,当我们想对一个由 5 个字母组成的单词重复此命令时,它只成功转换了其中的前 3 个字母,留下 2 个字母未被转换。

# 使用普通模式下的操作符命令

可视模式下的 U 命令有一个等效的普通模式命令:gU{motion}。如果我们用此命令做第一处修改,就可以用点范式完成后续的修改

# 结论

这两种方式都只需要 4 次按键操作:vitU 及 gUit,但其背后的含义却大相径庭。在可视模式所采用的方式里,这 4 次按键可以被当做两个独立的命令。vit 用来选中选区,而 U 用来对选区进行转换。与之相反的是,gUit 命令可以被当成一个单独的命令,它由一个操作符(gU)和一个动作命令(it)组成。

注:本人在 VSCode 中使用 Vim 插件无法复现这个 bug,可以正常转换为大写,但在命令行确实复现了,应该是 VSCode 的 Vim 插件修复了这个 bug

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