全局命令 global 回忆
- 可以定义自己的命令
command
- 也可以执行自定义的命令
- 可以修改删除命令
- 命令可以带上
- 参数
argument
- 范围
range
- 参数
- 除了自定义命令之外
- 系统也有一些built-in的命令
- 系统有什么好玩的命令么?
:h global
:[range]global/{pattern}/{command}
- range是执行的范围
:1,$
- pattern是搜索的模式
- command执行的命令
- range是执行的范围
文章图片
- 如果在这个范围里面
- 匹配这个模式
: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
- g
- global全局命令
-
-
- 分割符
-
- //
- 查找的模式为//
- s/oeasy/o1z/g
- s的意思是subtitute
- 把这些行中的oeasy换成o1z
- 并且是global替换,全都替换
- 完成批量替换
- 把所有包含//行中,把oeasy全部替换为o1z
- g
文章图片
: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
- 除了d删除之外,还可以执行normal正常模式下命令
文章图片
:g/.*/normal A;
.*
代表有0到任意多个非空字符- 空行
^$
有0个字符也满足 normal A;
每一行都在结尾加分号;
:g/./normal A;
.
代表有一个字符,任意字符都可以- 空行
^$
一个字符都没有,不满足 - 非空行
normal A;
在结尾加分号;
const oeasy = 1
console.log("oeasy: ", oeasy);
const o2z = 2
console.log("o2z: ", o2z);
const o3z = 3
console.log("o3z: ", o3z);
qaA;
q
- 定义一个宏macro叫做a
- a的功能就是A;
- 在行尾插入分号然后退出回到正常模式
: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的所有行
- 在搜索结果中搜o2z
- 找到的结果删除
- u回来
:g/console/v/two/d
- 先搜包含console的所有行
- 在搜索结果中搜不包含o2z的
- 找到的结果删除
文章图片
:g/const/p
- 找到匹配
const
模式的行 - 打印print
- 找到匹配
文章图片
移动命令move
:g/^/m 0
^
行的开头,所有的行都符合,包括空行- m 移动 move
- 0 移动到第0行 最初
- 每一行都要挪到第一行
- 最后一行最后执行
- 整体就是上下颠倒
const oeasy = 1
console.log("oeasy: ", oeasy);
// TODO oeasyconst o2z = 2
console.log("o2z: ", o2z);
// TODO o2zconst o3z = 3
console.log("o3z: ", o3z);
// TODO o3z
:g/TODO/t $
- 包含TODO的行选中
- 执行t $ 拷贝到末行
:g/TODO/m 0
- 把TODO行都移动到最上面
const arrayA = [
"h",
"b",
"f",
"d",
"e",
"a",
"c",
]
:g/\[/+1,/\]/-1sort
- 在这个中括号的范围内
- 排序
- 这次研究的是global
:[range]global/{pattern}/{command}
- range是执行的范围
- pattern是搜索的模式
- command执行的命令
- 【oeasy教您玩转vim - 85 - # 全局命令】命令有很多
- d 删除
- m 移动
- t 拷贝
- p 打印
- s 替换
- sort 排序
- update 更新
- global是很好用的内部命令
- vim还可以执行外部命令呢!
- 怎么玩呢?
- 下次再说!
推荐阅读
- oeasy教您玩转vim - 89 - # 高亮细节Highlight
- oeasy教您玩转vim - 88 - # 自动命令autocmd
- oeasy教您玩转vim - 87 - # 内容查找grep命令
- oeasy教您玩转vim - 84 - # 命令command
- vim 命令整理(从FreePlane的mm格式导出)
- oeasy教您玩转vim - 82 - # 函数function
- oeasy教您玩转vim - 81 - # 宏macro的进阶
- oeasy教您玩转vim - 80 - # 宏macro
- oeasy教您玩转vim - 79 - # 编码格式encoding