欢迎光临散文网 会员登陆 & 注册

oeasy教您玩转vim - 85 - # 全局命令

2022-01-10 10:36 作者:oeasy  | 我要投稿

 "h",  "b",  "f",  "d",  "e",  "a",  "c",]```- `:g/\[/+1,/\]/-1sort`- 在这个中括号的范围内- 排序## 总结- 这次研究的是global- `:[range]global/{pattern}/{command}`    - range是执行的范围    - pattern是搜索的模式    - command执行的命令- 命令有很多    - d 删除    - m 移动    - t 拷贝    - p 打印    - s 替换    - sort 排序    - update 更新- global是很好用的内部命令- vim还可以执行外部命令呢!- 怎么玩呢?🤔- 下次再说!

全局命令 global

回忆

  • 可以定义自己的命令command

  • 也可以执行自定义的命令

  • 可以修改删除命令

  • 命令可以带上

    • 参数 argument

    • 范围 range

  • 除了自定义命令之外

  • 系统也有一些built-in的命令

  • 系统有什么好玩的命令么?🤔

global全局命令

  • :h global

  • :[range]global/{pattern}/{command}

    • :1,$

    • range是执行的范围

    • pattern是搜索的模式

    • command执行的命令

  • 如果在这个范围里面

  • 匹配这个模式

    • :global

  • 或者不匹配这个模式

    • :g!:v

  • 就执行这个命令

  • 我们来看个例子

先搜再删

  • 源代码如下

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的行都删除

    • 整行删除

    • 删完之后u回来

  • :g/console/d _

    • 删除带console行之后

    • _ 的意思是将结果放入黑洞寄存器

  • :g/console/d|update

    • 删除完成之后

    • |update 进行保存

切换分割符

  • :g@console@d

    • 把分隔符从/变成@`

  • 什么不能当分割符

    • 大小写字符

    • 数字

    • ", |,  \

  • 什么可以当分隔符

    • :g=console=d

    • :g?console?d

  • :g+//+s/oeasy/o1z/g

    • s的意思是subtitute

    • 把这些行中的oeasy换成o1z

    • 并且是global替换,全都替换

    • 完成批量替换

    • 查找的模式为//


    • 分割符

    • global全局命令

    • g


    • //

    • s/oeasy/o1z/g

    • 把所有包含//行中,把oeasy全部替换为o1z

反转模式

  • :g/console/d

    • 把所有带console的行都删除

  • :v/console/d

    • 把所有不带console的行都删除

  • :g!/console/d

    • g!v一样

匹配模式

  • 我们猜猜下面的命令会删除那些行?

  • :g/o2z\|o3z/d

  • :g/[0-9]/d:g/\d/d

删除空行

  • :g/^$/d

    • ^$开头之后就是结束

    • 没有任何字符的行

    • 就delete删掉

  • :g/^\s*$/d

    • ^$开头结尾之间只有空格和tab

    • 没有任何其他字符

    • 就delete删掉

配合范围range

  • :1,5g/console/d

    • 从1到5行

    • 出现console的行

    • 删除

  • :.,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

  • 出现3到6个零的行

  • u回来

  • 可以把数值分别调整一下

    • :g/0\{4,6\}/d

执行命令command

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

  • :g/.*/normal A;

    • .*代表有0到任意多个非空字符

    • 空行^$有0个字符也满足

    • normal A; 每一行都在结尾加分号;

  • :g/./normal A;

    • .代表有一个字符,任意字符都可以

    • 空行^$一个字符都没有,不满足

    • 非空行 normal A; 在结尾加分号;

执行宏macro

const oeasy = 1console.log("oeasy: ", oeasy);const o2z = 2console.log("o2z: ", o2z);const o3z = 3console.log("o3z: ", o3z);

  • qaA;<Esc>q

    • 定义一个宏macro叫做a

    • a的功能就是A;<Esc>

    • 在行尾插入分号然后退出回到正常模式

  • :reg a

    • 查看宏a

  • :g/const/normal @a

    • 正常模式下执行宏a

    • 对于可以匹配const的行

    • const

    • normal @a

  • :2,$g/const/normal @a

    • 正常模式下执行宏a

    • 对于可以匹配const的行

    • 从第2行到末行

    • 2,$

    • const

    • :normal @a

递归使用全局命令

const oeasy = 1console.log("oeasy: ", oeasy);const o2z = 2console.log("o2z: ", o2z);const o3z = 3console.log("o3z: ", o3z);

  • :g/console/g/two/d

    • 先搜包含console的所有行

    • 在搜索结果中搜o2z

    • 找到的结果删除

  • u回来

  • :g/console/v/two/d

    • 先搜包含console的所有行

    • 在搜索结果中搜不包含o2z的

    • 找到的结果删除

打印命令print

  • :g/const/p

    • 找到匹配const模式的行

    • 打印print

移动命令move

  • :g/^/m 0

    • ^ 行的开头,所有的行都符合,包括空行

    • m 移动 move

    • 0 移动到第0行 最初

  • 每一行都要挪到第一行

  • 最后一行最后执行

  • 整体就是上下颠倒

复制命令copy 或 t

const oeasy = 1console.log("oeasy: ", oeasy);// TODO oeasyconst o2z = 2console.log("o2z: ", o2z);// TODO o2zconst o3z = 3console.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/\[/+1,/\]/-1sort

  • 在这个中括号的范围内

  • 排序

总结

  • 这次研究的是global

  • :[range]global/{pattern}/{command}

    • range是执行的范围

    • pattern是搜索的模式

    • command执行的命令

  • 命令有很多

    • d 删除

    • m 移动

    • t 拷贝

    • p 打印

    • s 替换

    • sort 排序

    • update 更新

  • global是很好用的内部命令

  • vim还可以执行外部命令呢!

  • 怎么玩呢?🤔

  • 下次再说!


oeasy教您玩转vim - 85 - # 全局命令的评论 (共 条)

分享到微博请遵守国家法律