Vim 全局命令global详解

回忆

global全局命令

  • :h global
  • :[range]global/{pattern}/{command}
    • range是执行的范围
    • pattern是搜索的模式
    • command执行的命令

图片描述

  • 如果在这个范围里面
  • 匹配这个模式
  • 就执行这个命令
  • 我们来看个例子

先搜再删

  • 源代码如下
const oeasy = 1;
console.log("oeasy: ", oeasy);

const o2z = 2;
console.log("o2z: ", o2z);

const o3z = 3;
console.log("o3z: ", o3z);
  • :g/console/d
    • 把所有带console的行都删除
  • :g/const/d
    • 把所有带const的行都删除
  • :g/console/d _
    • 删除console行之后,结果放入黑洞寄存器
  • :g/console/d|update
    • 删除完成之后,进行保存

切换分割符

  • :g@console@d
    • 把分隔符变成@
  • 什么不能当分割符
    • 大小写字符
    • 数字
    • ", |, \
  • 下面的分隔符都可以
    • :g=console=d
    • :g?console?d
  • :g+//+s/oeasy/o1z/g
    • g
      • global全局命令
        • 分割符
    • //
      • 查找的模式为//
    • s/oeasy/o1z/g
      • 完成批量替换
    • 把所有包含//行中,把oeasy全部替换为o1z

反转模式

图片描述

  • :g/console/d
    • 把所有带console的行都删除
  • :v/console/d
    • 把所有不带console的行都删除
  • :g!/console/d
    • g!v一样

图片描述

匹配模式

图片描述

  • 我们猜猜下面的命令会删除那些行?
  • :g/one\|two/d
  • :g/[0-9]/d:g/\d/d

删除空行

  • :g/^$/d
    • ^$开头之后就是结束
    • 没有任何字符的行
    • 就delete删掉
  • :g/^\s*$/d
    • ^$开头结尾之间只有空格和tab
    • 没有任何其他字符
    • 就delete删掉

图片描述

配合范围range

  • :1,5g/console/d 从1到5行

  • :,5g/console/d 从当前行到第5行

  • :3,g/console/d 从3到当前行

  • :3g/console/d 只搜索第3行

  • 特定行

    • . 当前行
    • $ 末行
    • +n 当前行之后的第n行

再来一个

const oneMillion = 1000000;
const oneThousand = 1000;
const one = 1;
  • :g/0\{3,6\}/d

执行命令command

  • 除了d删除之外,还可以执行normal正常模式下命令

图片描述

  • :g/.*/normal A;
    • 每一行都在结尾加分号;
    • .*代表有0到任意多个非空字符
    • 空行^$有0个字符也满足
  • :g/./normal A;
    • 非空行都在结尾加分号;
    • .代表有一个字符,任意字符都可以
    • 空行^$一个字符都没有,不满足

执行宏macro

const oeasy = 1
console.log("oeasy: ", oeasy);

const o2z = 2
console.log("o2z: ", o2z);

const o3z = 3
console.log("o3z: ", o3z);
  • qaA;<Esc>q
    • 定义一个宏macro
  • :reg a
    • 查看宏a
  • :g/const/normal @a
    • const
      • 对于可以匹配const的行
    • normal @a
      • 正常模式下执行宏a
  • :2,$g/const/normal @a
    • 2,$
      • 从第2行到末行
    • const
      • 对于可以匹配const的行
    • :normal @a
      • 正常模式下执行宏a

递归使用全局命令

const oeasy = 1
console.log("oeasy: ", oeasy);

const o2z = 2
console.log("o2z: ", o2z);

const o3z = 3
console.log("o3z: ", o3z);
  • :g/console/g/two/d
    • 先搜console
    • 在搜索结果中搜two
    • 找到的结果删除
  • :g/console/v/two/d
    • 先搜console
    • 在搜索结果中搜不存在two的
    • 找到的结果删除

打印命令print

图片描述

  • :g/const/p
    • 找到匹配const模式的行
    • 打印print

图片描述

移动命令move

  • :g/^/m 0
    • ^ 行的开头,所有的行都符合,包括空行
    • m 移动 move
    • 0 移动到第0行 最初
  • 整体就是上下颠倒

复制命令copy 或 t

const oeasy = 1
console.log("oeasy: ", oeasy);
// TODO oeasy

const o2z = 2
console.log("o2z: ", o2z);
// TODO o2z

const o3z = 3
console.log("o3z: ", o3z);
// TODO o3z
  • :g/TODO/t $

    • 符合TODO的行选中
    • 执行t $ 拷贝到末行
  • :g/TODO/m 0

    • 把TODO行都移动到最上面

排序命令sort

const arrayA = [
  "h",
  "b",
  "f",
  "d",
  "e",
  "a",
  "c",
]
  • :g//,//sort
  • :g/\[/,/\]/sort
  • :g/\[/+1,/\]/-1sort
  • 在这个中括号的范围内
  • 排序

总结

  • 这次研究的是global
  • :[range]global/{pattern}/{command}
    • range是执行的范围
    • pattern是搜索的模式
    • command执行的命令
  • 命令有很多
    • d 删除
    • m 移动
    • t 拷贝
    • p 打印
    • s 替换
    • sort 排序
    • update 更新
  • global是很好用的内部命令
  • vim还可以执行外部命令呢!
  • 怎么玩呢?🤔
  • 下次再说!

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

iOS开发高手课 -〔戴铭〕

从0开发一款iOS App -〔朱德权〕

Python核心技术与实战 -〔景霄〕

说透中台 -〔王健〕

罗剑锋的C++实战笔记 -〔罗剑锋〕

爱上跑步 -〔钱亮〕

流程型组织15讲 -〔蒋伟良〕

手把手带你搭建推荐系统 -〔黄鸿波〕

LangChain 实战课 -〔黄佳〕