oeasy教您玩轉(zhuǎn)vim - 85 - # 全局命令
?"h", ?"b", ?"f", ?"d", ?"e", ?"a", ?"c",]```- `:g/\[/+1,/\]/-1sort`- 在這個(gè)中括號(hào)的范圍內(nèi)- 排序## 總結(jié)- 這次研究的是global- `:[range]global/{pattern}/{command}` ? ?- range是執(zhí)行的范圍 ? ?- pattern是搜索的模式 ? ?- command執(zhí)行的命令- 命令有很多 ? ?- d 刪除 ? ?- m 移動(dòng) ? ?- t 拷貝 ? ?- p 打印 ? ?- s 替換 ? ?- sort 排序 ? ?- update 更新- global是很好用的內(nèi)部命令- vim還可以執(zhí)行外部命令呢!- 怎么玩呢???- 下次再說!
全局命令 global
回憶
可以定義自己的命令
command
也可以執(zhí)行自定義的命令
可以修改刪除命令
命令可以帶上
參數(shù)
argument
范圍
range
除了自定義命令之外
系統(tǒng)也有一些built-in的命令
系統(tǒng)有什么好玩的命令么???
global全局命令
:h global
:[range]global/{pattern}/{command}
:1,$
range是執(zhí)行的范圍
pattern是搜索的模式
command執(zhí)行的命令

如果在這個(gè)范圍里面
匹配這個(gè)模式
:global
或者不匹配這個(gè)模式
:g!
或:v
就執(zhí)行這個(gè)命令
我們來看個(gè)例子
先搜再刪
源代碼如下
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
行之后_
的意思是將結(jié)果放入黑洞寄存器:g/console/d|update
刪除完成之后
|update
進(jìn)行保存
切換分割符
:g@console@d
把分隔符從
/
變成@
`什么不能當(dāng)分割符
大小寫字符
數(shù)字
"
,|
, ?\
什么可以當(dāng)分隔符
:g=console=d
:g?console?d
:g+//+s/oeasy/o1z/g
s的意思是subtitute
把這些行中的oeasy換成o1z
并且是global替換,全都替換
完成批量替換
查找的模式為//
分割符
global全局命令
g
//
s/oeasy/o1z/g
把所有包含//行中,把oeasy全部替換為o1z
反轉(zhuǎn)模式

:g/console/d
把所有帶
console
的行都刪除:v/console/d
把所有不帶
console
的行都刪除:g!/console/d
g!
和v
一樣

匹配模式

我們猜猜下面的命令會(huì)刪除那些行?
:g/o2z\|o3z/d
:g/[0-9]/d
或:g/\d/d
刪除空行
:g/^$/d
^$開頭之后就是結(jié)束
沒有任何字符的行
就delete刪掉
:g/^\s*$/d
^$
開頭結(jié)尾之間只有空格和tab沒有任何其他字符
就delete刪掉

配合范圍range
:1,5g/console/d
從1到5行
出現(xiàn)console的行
刪除
:.,5g/console/d
從當(dāng)前行到第5行
:3,.g/console/d
從3到當(dāng)前行
:3g/console/d
只搜索第3行
特定行
. 當(dāng)前行
$ 末行
+n 當(dāng)前行之后的第n行
再來一個(gè)
const oneMillion = 1000000;const oneThousand = 1000;const one = 1;
:g/0\{3,6\}/d
出現(xiàn)3到6個(gè)零的行
u回來
可以把數(shù)值分別調(diào)整一下
:g/0\{4,6\}/d
執(zhí)行命令command
除了d刪除之外,還可以執(zhí)行normal正常模式下命令

:g/.*/normal A;
.*
代表有0到任意多個(gè)非空字符空行
^$
有0個(gè)字符也滿足normal A;
每一行都在結(jié)尾加分號(hào);:g/./normal A;
.
代表有一個(gè)字符,任意字符都可以空行
^$
一個(gè)字符都沒有,不滿足非空行
normal A;
在結(jié)尾加分號(hào);
執(zhí)行宏macro
const oeasy = 1console.log("oeasy: ", oeasy);const o2z = 2console.log("o2z: ", o2z);const o3z = 3console.log("o3z: ", o3z);
qaA;<Esc>q
定義一個(gè)宏macro叫做a
a的功能就是A;<Esc>
在行尾插入分號(hào)然后退出回到正常模式
:reg a
查看宏a
:g/const/normal @a
正常模式下執(zhí)行宏a
對(duì)于可以匹配
const
的行const
normal @a
:2,$g/const/normal @a
正常模式下執(zhí)行宏a
對(duì)于可以匹配
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的所有行
在搜索結(jié)果中搜o2z
找到的結(jié)果刪除
u回來
:g/console/v/two/d
先搜包含console的所有行
在搜索結(jié)果中搜不包含o2z的
找到的結(jié)果刪除
打印命令print

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

移動(dòng)命令move
:g/^/m 0
^
行的開頭,所有的行都符合,包括空行m 移動(dòng) move
0 移動(dòng)到第0行 最初
每一行都要挪到第一行
最后一行最后執(zhí)行
整體就是上下顛倒
復(fù)制命令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的行選中
執(zhí)行t $ 拷貝到末行
:g/TODO/m 0
把TODO行都移動(dòng)到最上面
排序命令sort
const arrayA = [ ?"h", ?"b", ?"f", ?"d", ?"e", ?"a", ?"c", ]
:g/\[/+1,/\]/-1sort
在這個(gè)中括號(hào)的范圍內(nèi)
排序
總結(jié)
這次研究的是global
:[range]global/{pattern}/{command}
range是執(zhí)行的范圍
pattern是搜索的模式
command執(zhí)行的命令
命令有很多
d 刪除
m 移動(dòng)
t 拷貝
p 打印
s 替換
sort 排序
update 更新
global是很好用的內(nèi)部命令
vim還可以執(zhí)行外部命令呢!
怎么玩呢???
下次再說!