vim 从嫌弃到依赖(20)——global 命令
在前面的文章中,我们介绍了如何进行查找和替换,而替换是建立在查找基础之上的一个简单的应用,它只是将匹配文本修改为另一个。那么vim中还能针对匹配上的文本做哪些操作呢?在本篇文章中我们来对这个问题进行探讨。
初识global 命令
我们能够对存在匹配项的行进行其他操作的关键在于 global
命令。global
命令的作用是存在匹配项的行上执行指定的ex命令。命令的格式如下:
:[range] g[lobal][!]/{pattern}/[cmd]
- 与大多数ex命令一样,它接收一个作用范围。如果不给范围,则默认作用于整个文件,即它默认范围是 %
- ! 代表取反,是在不存在匹配项的行上执行ex命令
- pattern 表示匹配模式
- cmd表示将在对应文本上执行哪些ex命令。如果不指定则默认执行 print命令
这里需要强调的是,执行ex 命令操作的是有匹配项的行。操作的不是高亮的文本,而是有高亮文本的行。
我们还是以一个简单的例子来演示如何使用
#define VERSION "v1.0.1"
char pszVersion[] = VERSION;
#define TITLE "vim"
char* pszTitle = TITLE;
#define AUTHOR "Bram Moolenaar"
char* pszAuthor = AUTHOR;
假设有这么一段代码,我们先用 ".*"
来匹配一个字符串,然后执行 :g//d
来执行删除操作。
我们发现它并不是删除了后面的字符串而是将所有有字符串的行都删除了,只保留了赋值语句。相信通过这个例子各位小伙伴应该已经理解global
命令是如何作用的。
如果我们要删除上述代码中所有的赋值语句,可以利用 !来进行取反,:g!//d
在 《vim 实用技巧》这本书中提到一个很有意思的东西。通过上面的描述,可以总结出 global命令的一个简写形式 :g/re/p
其中 g
是 global
命令的缩写,re
代表正则表达式 regular expression
, 而 p
则是 print
的缩写。我们将 /
从中去掉就发现这个简写变成了 grep
这个单词。这也就是 grep
这个命令的由来。
上面的内容已经初步介绍了 global
命令的使用,下面再来看看其他的使用场景
配合缓冲区参数列表使用
我们还是用 neovim
的配置文件。我们随机在部分 lua
文件中加一些 TODO
的注释。表示暂时未做将来会实现的功能。
我们先在某个文件中查找 TODO字样,有的文件显示没有找到也不要紧,只是为了保存这个模式
然后将所有的 lua
文件加入到参数列表中,:args **/.*lua
然后选择清空一个寄存器 qaq
,其中 qa
代表我们将要使用 a
寄存器来录制一个宏,不输入任何内容直接使用 q
结束录制。因为宏就是将操作内容写入寄存器,所以不进行任何操作的宏就可以清除寄存器的内容。
然后执行 :argdo g//yank A
这里使用 yank
这个命令来复制内容到寄存器。另外使用了 A
而不是 a
因为这里是对每个文件依次执行命令的,需要一个个的添加到寄存器里面。所以这里使用大写字母。
此时可以查看 a
寄存器的内容,发现已经有对应内容了。
提取出来的内容有一个缺点就是无法显示具体是哪个文件中的 todo
项。将未来要实现但是现在没实现的功能用 TODO
描述出来在编程中是一个很常见的习惯,针对这个功能有许多做的不错的插件,后续将会介绍相关插件。
指定 ex 命令的执行范围
不光 global可以指定范围,后面接的 cmd也可以指定范围,下面将通过一个演示该如何使用
假设有一段 css
代码
html{margin: 0;padding: 0;border: 0;font-size: 100%;font: inherit;vertical-align: baseline;
}body{line-high: 1.5;color: black;background: white;
}
我们想对每组css内部属性按字母顺序进行排序。
第一个办法:可以录制宏来自动化。首先通过模式来匹配 {
即使用 /{
然后开始录制宏: nvi{:sort
,首先通过 n
来跳转到下一个匹配,然后使用 vi{
通过文本对象来选中 {}
中的内容,最后针对选中来执行 sort
命令
但是我们可以使用 global
命令完成同样的操作。首先还是来构造对应的模式。我们可以通过 :g/{/ .+1,/}/-1 sort
这么一条命令来完成这一操作。我们来分析一下这条命令的意思。
- 首先将这条命令按照
/
分为3个部分,第一部分是{
表示匹配所有{
之后的内容。 - 第二部分是
.+1,/}/-1
。它表示一个范围,范围分为两个部分,以,
分割,前面一部分代表的是当前行的下一行,也就是{
所在行的下一行,/}
表示匹配结束的}
符号,后面跟一个-1
表示}
所在的上一行,这个范围代表的就是{}
之间的所有行。 - 最后一个部分是命令也就是
sort
,在对应的这个范围中执行sort
命令。
针对上面解释的内容,我们可以对 global命令再做一个详细的使用格式:
:[range]/g[lobal][!]/{start pattern}/ .{offsize},/{end pattern}/{offsize} [cmd]
这里我们也可以跟其他命令,例如将C函数中的代码进行缩进,那么就可以使用 :g/{/ .+1,/}/-1 >
。
vim 从嫌弃到依赖(20)——global 命令相关推荐
- vim 从嫌弃到依赖(19)——替换
之前讨论了关于在vim中使用正则表达式的相关知识能方便的进行搜索,现在在之前的基础之上继续来讨论如何进行替换操作. substitute 简介 substitute 允许我们先查找一段文本并用新的文本 ...
- vim 从嫌弃到依赖(0)——概述
最近我想开一个新的系列,记录我使用vim的相关心得.初次接触vim是在大学操作系统实践课程中,跟着Linux一块进行学习的.当初我是百般嫌弃它的,想要进行编辑还要按下其他键,我想要移动光标居然还的切换 ...
- vim 从嫌弃到依赖(14)——快速跳转
之前介绍过众多的motion,根据移动范围来排序的话有 l.e.w.j等等,但是面对那么长的代码文件,仅仅使用这几个简单的motion不知道要移动多少次才能找到我想要的代码,这个速度有时候还不如我用鼠 ...
- vim 从嫌弃到依赖(23)——最后的闲扯
截止到上一篇文章,关于vim的基础操作都已经讨论完了,这篇我主要就是闲扯,瞎聊.就想毕业论文都有一个致谢一样,这篇我们就作为整个系列的致谢吧 学习vim到底能给我们带来什么 学习vim到底能给我们带来 ...
- Vim实用技巧:global命令
:global命令结合了Ex命令与Vim的模式匹配这两方面能力.凭借该命令,可以在某个指定模式的所有匹配行上运行Ex命令.就处理重复工作的效率而言,global 命令是除点范式以及宏之外,最为强大的V ...
- vim global命令
global命令格式 : [range]global/{pattern}/{command} global命令在[range]指定的文本范围内(缺省为整个文件)查找{pattern},然后对匹配到的行 ...
- [linux]:对于linux新手常用的20个命令
你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现我的世界里了. 从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳 ...
- Linux常用20条命令
Linux常用20条命令 假装这里有个标题 1.cd 2.ls 3.grep 4.find 5.cp 6.mv 7.rm 8.ps 9.kill 10.kill all 11.file 12.tar ...
- [转载]对 Linux 新手非常有用的20个命令
原文出处: Tecmit 译文出处: oschina.欢迎加入技术翻译小组. 你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现我的世 ...
最新文章
- 宜家通信- 会员管理 表结构搭建
- CTFshow php特性 web104
- 黑马程序员pink老师前端入门教程,零基础必看的h5(html5)+css3+移动端前端视频教程(CSS3)
- mysql 更新日的数据类型_[每日更新-MySQL基础]5.常用的数据类型-整数和字符串
- day38-数据库应用软件
- git Could not read from remote repository.Please make sure you have the correct access rights.
- codevs 1143 纪念品分组
- php学生成绩管理系统完整源代码,PHP学生成绩管理系统
- Unix网络编程开篇
- 预约小程序开发:小程序开发的费用都包含了哪些?
- 【CS106】编译原理笔记4 —— 用普遍性泵引理(Pumping lemma)证明语言的正则性
- 【蓝桥杯】:奇怪的分式
- 算法-动态规划-RNA最大碱基对匹配问题C语言求解
- 网站会员登录,注册设计
- [WARNING]:登录失败:密码错误或账号被冻结
- 各类型PPT免费模板,无需编辑直接套用即可!
- 电脑设备管理器无端口显示怎么办?
- 2.2.1 Nginx高性能负载均衡器
- 浅谈JAVA程序破解(原创)
- 拓扑排序(依次加入入度为0的节点)