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

Vim 技巧 - 在指定范围上执行普通模式命令

如果想在一系列连续行上执行一条普通模式命令,我们可以用 :normal 命令。此命令在与 . 命令或宏结合使用时,我们只需花费很少的努力就能完成大量重复性任务。

比如我们想在一系列行后添加一个分号:

使用点范式让我们迅速完成了这项工作,但是在这个例子里,只需对连续的 3 行做此修改。如果不得不做 50 次同样的修改会怎么样呢?如果还用点范式的话,得按 50 次 j.,总共得 100 次按键动作!

这里有一种更好的方法。我们将在下面文件的每行后都添加一个分号,以此作为演示。为节省空间,此处只列出了 5 行内容,然而你可以想象这里有 50 行,那么这种方法看起来就颇具诱惑了。

我们像之前做的那样,首先修改第一行:

接下来,用不着一行一行地执行 . 命令,而是使用 Ex 命令 :normal 对整个范围内的所有行同时执行 . 命令:

:'<,'>normal . 命令可以解读为“对高亮选区中的每一行,对其执行普通模式下的 . 命令”。无论是操作 5 行还是 50 行文本,这种方法都能出色地完成任务,更棒的是我们甚至都不需要计算行数,在可视模式中选中这些行使我们摆脱了计数的负担。

这个例子使用 :normal 执行 . 命令,但是也可以用这种方式执行任意其他的普通模式命令。例如,可以用如下命令解决上面的问题:

➾:%normal A;

符号 % 代表整个文件范围,因此 :%normal A; 告诉 Vim 在文件每行的结尾都添加一个分号。在做此修改时会切换到插入模式,但是在修改完后 Vim 会自动返回到普通模式。

在执行指定的普通模式命令之前,Vim 会先把光标移到该行的起始处。因此在执行时,用不着担心光标的位置。例如,下面这条命令可以把整个 JavaScript 文件注释掉:

➾:%normal i//

虽然用 :normal 命令可以执行任意的普通模式命令,但是我发现当它和 Vim 的重复命令结合在一起时,最为强大,既可以用 :normal . 应对简单的重复性工作,也可以用 :normal @q 应对较复杂的任务。

在 Ex 命令影响范围广且距离远 中,我们说过 Ex 命令可以一次修改若干行。而 :normal 命令则让我们可以把具有强大表现力的 Vim 普通模式命令与具有大范围影响力的 Ex 命令结合在一起,这种结合真地是珠联璧合!

编辑 (opens new window)
#Vim
上次更新: 5/27/2023, 1:02:05 PM
Vim 技巧 - 使用‘:t’和‘:m’命令复制和移动行
Vim 技巧 - 重复上次的 Ex 命令

← Vim 技巧 - 使用‘:t’和‘:m’命令复制和移动行 Vim 技巧 - 重复上次的 Ex 命令→

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