"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}

    • 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还可以执行外部命令呢!
  • 怎么玩呢?
  • 下次再说!

oeasy教您玩转vim - 85 - # 全局命令的更多相关文章

  1. oeasy教您玩转vim - 56 - # 字符可视化模式

    ​ 可视化编辑 回忆上节课内容 我们学习了关于模式匹配中使用参数 单个参数 :%s/<h2>\(.*\)</h2>/ - \1/g 多个参数 :%s/<img src=\ ...

  2. oeasy教您玩转vim - 57 - # 行可视化

    ​ 可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...

  3. oeasy教您玩转vim - 53 - # 批量替换

    查找细节 回忆上节课内容 我们温习了关于搜索的相关内容 /正向,?反向 n保持方向,N改变方向 可以设置 是否忽略大写小写 是否从头开始查找 是否高亮显示 还有一些正则表达式的使用方法 行头行尾 ^$ ...

  4. oeasy教您玩转linux010203显示logo

    我们来回顾一下 上一部分我们都讲了什么?

  5. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  6. oeasy教您玩转linux010202软件包管理apt

    顾一下 上一部分我们都讲了什么?

  7. oeasy教您玩转linux010201持续输出yes

    我们来回顾一下 上一部分我们都讲了什么?

  8. oeasy教您玩转linux010108到底哪个which

    到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?

  9. oeasy教您玩转python - 006 - # hello world

    ​ Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...

  10. oeasy教您玩转linux-010110内容回顾

    我们来回顾一下 我们都讲了什么?

随机推荐

  1. 改造 Kubernetes 自定义调度器

    原文出处:改造 Kubernetes 自定义调度器 | Jayden's Blog (jaydenchang.top) Overview Kubernetes 默认调度器在调度 Pod 时并不关心特殊 ...

  2. PHP-FPM 运行原理分析

    概述 PHP-FPM 是一种 Master / Worker 多进程运行模式,进程的数量可以通过 php-fpm.conf 进行具体的配置. Master 进程主要负责 CGI.PHP 环境的初始化. ...

  3. nginx重载流程nginx请求处理流程nginx单进程和多进程

    nginx重载流程 首先nginx会向master进程发送HUP信号[reload命令] master进程校验配置语法是否正确 master进程打开新的监听端口 master进程用心配置启动新的wor ...

  4. web游览器的标签页仿 ios mac 苹果的墓碑机制 (js代码)

    背景: 本来项目开发系统防挂机功能,在其余游览器中均可以使用.但是呢在苹果的safair游览器中会出现几率失效,最后经过排查发现是苹果的墓碑机制导致.即:此标签页活跃,其他标签页假死.然后就导致防挂机 ...

  5. 关于前三次pta的总结

    前言 这三次pta难度在不断上升的同时,要求我们线上慕课+自主学习来了解更多的java中的各种方法,如:正则表达式 List Map等.与此同时要求我们展开尝试并熟练类的构造,类的引用,链表的基本运用 ...

  6. springboot3时代创建springboot2程序项目

    springboot3时代创建springboot2程序项目 目前,IDEA,springboot 官网,都不能创建基于JDK8(JDK1.8)的springboot程序了. 解决办法: 1. 先在官 ...

  7. Vue学习:8.v标签综合-强化版

    通过前几节的认识和学习,我们掌握了常用v标签的用法,这一节再来巩固提高一下吧. 实例:成绩面板 实现功能: 主体由两大部分组成:表格+表单.这个表格可以显示多科成绩,并具有表头.删除以及底部统计功能. ...

  8. golang reflect 反射机制的使用场景

    Go语言中的 reflect 包提供了运行时反射机制,允许程序在运行时检查和操作任意对象的数据类型和值. 以下是 reflect 包的一些典型使用场景: 1. 动态类型判断与转换:当需要处理多种类型的 ...

  9. 接口签名规则及Java代码demo实现

    接口签名规则及Java代码demo实现 签名规则 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用UR ...

  10. @Async异步方法对异常的处理,从内层向外层抛出机制

    @Async异步方法对异常的处理,从内层向外层抛出机制 @RequestMapping(value = "/test", method = RequestMethod.GET) p ...