乐趣区

关于vim:oeasy教您玩转vim-85-全局命令

全局命令 global

回顾

  • 能够定义本人的命令command
  • 也能够执行自定义的命令
  • 能够批改删除命令
  • 命令能够带上

    • 参数 argument
    • 范畴 range
  • 除了自定义命令之外
  • 零碎也有一些 built-in 的命令
  • 零碎有什么好玩的命令么?🤔

global 全局命令

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

    • range 是执行的范畴

      • :1,$
    • 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

    • g

      • global 全局命令
        • 宰割符
    • //

      • 查找的模式为 //
    • s/oeasy/o1z/g

      • s 的意思是 subtitute
      • 把这些行中的 oeasy 换成 o1z
      • 并且是 global 替换,全都替换
      • 实现批量替换
    • 把所有蕴含 // 行中,把 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 = 1
console.log("oeasy:", oeasy);

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

const o3z = 3
console.log("o3z:", o3z);
  • qaA;<Esc>q

    • 定义一个宏 macro 叫做 a
    • a 的性能就是 A;<Esc>
    • 在行尾插入分号而后退出回到失常模式
  • :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 的
    • 找到的后果删除

打印命令 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/\[/+1,/\]/-1sort
  • 在这个中括号的范畴内
  • 排序

总结

  • 这次钻研的是 global
  • :[range]global/{pattern}/{command}

    • range 是执行的范畴
    • pattern 是搜寻的模式
    • command 执行的命令
  • 命令有很多

    • d 删除
    • m 挪动
    • t 拷贝
    • p 打印
    • s 替换
    • sort 排序
    • update 更新
  • global 是很好用的外部命令
  • vim 还能够执行外部命令呢!
  • 怎么玩呢?🤔
  • 下次再说!
退出移动版