本节书摘来自异步社区《Vim实用技巧(第2版)》一书中的第2章,第2.6节,作者:【英】Drew Neil(尼尔)著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 双剑合璧,天下无敌

Vim的强大很大程度上源自操作符与动作命令相结合。在本节,我们将看到它是如何工作的,并考虑其寓义。
操作符 + 动作命令 = 操作
d{motion} 命令可以对一个字符(dl)、一个完整单词(daw)或一整个段落(dap)进行操作,它作用的范围由动作命令决定。c{motion}、y{motion} 以及其他一些命令也类似,它们被统称为操作符(operator)。可以用 :h operator 来查阅完整的列表,表2-1总结了一些比较常见的操作符。

g~、gu 和 gU 命令要用两次按键来调用,我们可以把上述命令中的 g 当作一个前缀字符,用以改变其后面的按键行为,进一步的讨论请参见本技巧最后的“结识操作符待决模式”部分。

操作符与动作命令的结合形成了一种语法。这种语法的第一条规则很简单,即一个操作由一个操作符,后面跟一个动作命令组成。学习新的动作命令及操作符,就像是在学习Vim的词汇一样。如果掌握了这一简单的语法规则,在词汇量增长时,就能表达更多的想法。

假如我们已经知道如何用 daw 删除一个单词,然后又学到 gU 命令(参见 :h gU )。它也是个操作符,所以可以用 gUaw 把当前单词转换成大写形式。如果我们的词汇进一步扩充,学会了作用于段落的 ap 动作命令,就会发现我们可以进行两个新的操作:用 dap 删除整个段落,或者用 gUap 把整段文字转换为大写。

Vim的语法只有一条额外规则,即当一个操作符命令被连续调用两次时,它会作用于当前行。所以 dd 删除当前行,而 >> 缩进当前行。gU 命令是一种特殊情况,我们既可以用 gUgU ,也可以用简化版的 gUU 来使它作用于当前行。

表2-1 Vim的操作符命令

扩展命令组合的威力
使用Vim缺省的操作符和动作命令,我们能够执行的操作的数目是巨大的,然而,我们还可以通过自定义动作命令及操作符来进一步扩充其数目。让我们想想这寓示着什么。

自定义操作符与已有动作命令协同工作
随同Vim发布的标准操作符集合相对比较少,但可以定义新的操作符。Tim Pope的commentary.vim插件提供了一个很好的例子[2],此插件为Vim支持的编程语言增添了注释及取消注释的命令。

注释命令以 gc{motion} 触发,它会切换指定行的注释状态。它是一个操作符命令,因此可以把它和所有动作命令结合在一起。gcap 将切换当前段落的注释状态, gcG 会把从当前行到文件结尾间的所有内容注释掉,gcc 则注释当前行。

如果你对如何创建自定义操作符感到好奇,可以先阅读一下文档 : h :map-operator

自定义动作命令与已有操作符协同工作
Vim缺省的动作命令集已经相当全面了,但是我们还是可以定义新的动作命令及文本对象来进一步增强它。

Kana Natsuno的textobj-entire插件是一个很好的例子[3],它为Vim增加了两种新的文本对象 ie 和 ae,它们作用于整个文件。

如果想用 = 命令自动缩进整个文件,可以执行 gg=G (就是说,先用 gg 跳到文件开头,然后用 =G 自动缩进从光标位置到文件结尾的所有内容)。但是如果安装了textobj-entire插件的话,简单地执行 =ae 就可以了。运行这条命令时光标在哪儿并不重要,因为它总是作用于整个文件。

注意:
如果同时安装了commentary和textobj-entire插件,就可以把它们放在一起使用。例如,执行 gcae 会切换整个文件的注释状态。
如果你对如何创建自定义动作命令感到好奇,可以由阅读 :h omap-info 开始。

结识操作符待决模式
普通、插入及可视模式很容易辨识,但是Vim还有另外一些很容易被忽视的模式,操作符待决模式(operator-pending mode)就是一个例子。每天我们无数次地使用它,但通常它只持续不到一秒时间。举个例子,在执行命令 dw 时,就会激活该模式。这一模式只在按 d 及 w 键之间的短暂时间间隔内存在,一眨眼工夫就不见了。

如果把Vim想象成有限状态机,那么操作符待决模式就是一个只接受动作命令的状态。这个状态在调用操作符时被激活,然后什么也不做,直到我们提供了一个动作命令,完成整个操作。当操作符待决模式被激活时,我们可以像平常一样按 <Esc> 中止该操作,返回到普通模式。

很多命令都由两个或更多的按键来调用(查阅 :h g 、:h z 、:h ctrl-w ,或者 :h [ ,可以看到一些例子),但在多数情况下,头一个按键只是第二个按键的前缀。这些命令不会激活操作符待决模式,相反,可以把它们当成命名空间(namespace),用来扩充可用命令的数目。只有操作符才会激活操作符待决模式。

你也许想知道,为什么要有一个完整的模式,专门用于操作符和动作命令之间的短暂瞬间,而命名空间命令则仅仅是普通模式的一个扩充?好问题!这是因为我们能够创建自定义映射项来激活或终结操作符待决模式。换句话说,它允许我们创建自定义的操作符及动作命令,从而让我们可以扩充Vim的词汇。

《Vim实用技巧(第2版)》——2.6 双剑合璧,天下无敌相关推荐

  1. vim实用技巧(第二版)........持续更新ing

    全书共123个技巧,每天更新两个,计划两个月更新完. (目前更新完技巧39) vim实用技巧第二版全部教学内容 前言 第1章 Vim解决问题的方式  技巧1 认识 . 命令  技巧2 不要自我重复   ...

  2. 《Vim实用技巧(第2版)》——1.4 执行、重复、回退

    本节书摘来自异步社区<Vim实用技巧(第2版)>一书中的第1章,第1.4节,作者:[英]Drew Neil(尼尔)著,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

  3. 《Vim实用技巧(第2版)》学习笔记:技巧12-双剑合璧,天下无敌

    <Vim实用技巧(第2版)>学习笔记:技巧12-双剑合璧,天下无敌 1. 操作符 + 动作命令 = 操作 d{motion}命令可以对一个字符.一个完整单词或一整个段落进行操作,它作用的范 ...

  4. Vim实用技巧:global命令

    :global命令结合了Ex命令与Vim的模式匹配这两方面能力.凭借该命令,可以在某个指定模式的所有匹配行上运行Ex命令.就处理重复工作的效率而言,global 命令是除点范式以及宏之外,最为强大的V ...

  5. vim实用技巧-笔记(第九章)

    vim实用技巧-笔记(第九章) 前言 我记得很早以前我就说过了,我是一个菜鸟,我写博客的主要目的不是为了别人,更多的是为了记录自己的成长过程.如果阁下认为我的行为是在划水的话,那我也不妨大方地承认. ...

  6. Vim实用技巧高清完整版PDF中文

    Vim实用技巧高清完整版PDF是一本中文版的参考教材,该书适合想要学习和掌握 Vim 工具的读者阅读,有一定 Vim 使用经验的程序员,也可以参考查阅以解决特定的问题. 欢迎大家下载阅读学习:http ...

  7. Vim实用技巧_2.普通模式和插入模式

    下面介绍vim的几种常用模式的技巧 vim有4种模式:普通模式,插入模式,可视模式,命令模式 为什么要分这么多模式? 想一想我们平时常用的编辑工具word,应该是将上面4种模式融合在一起的:这种做法的 ...

  8. Vim实用技巧pdf

    下载地址:网盘下载 内容简介  · · · · · · vim是一款功能丰富而强大的文本编辑器,其代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中得到非常广泛的使用.vim能够大大提高程序 ...

  9. Vim实用技巧(第2版)

    ISBN:978-7-115-42786-1 作者:[英]Drew Neil 译者:杨源 车文隆 页数:289页 阅读时间:2020-04-05 推荐指数:★★★★★ Linux系统默认的经典强大的文 ...

最新文章

  1. 如何通过 Scratch 教小朋友编程思维?
  2. FPGA之道(49)DCM与PLL
  3. PAT 1041. 考试座位号(15)
  4. Rancher通过Aliyun-slb服务对接阿里云SLB教程
  5. 经典排序算法python回顾之一 交换排序
  6. Python学习【day02】-str类型方法记录
  7. c语言用指针实现打开和关闭文件,我用rewind函数没把指针直到开始,关闭文件然后打开就行。帮忙看看...
  8. 开源 数据查询 工具_6个用于数据新闻的开源工具
  9. CentOS下安装SecureCRT的sz/rz工具包
  10. 大道至简,职场上做人做事做管理(From Jimmy Zhang)
  11. iOS 内存泄漏的常见场景
  12. 在Linux系统中安装caffe
  13. idea调试代码步入用法
  14. C++实现演讲比赛小项目
  15. 联网玩具CloudPets 泰迪熊泄漏数百万语音信息
  16. java jsessionid 会话_jsessionid 对JAVA WEB jsessionid的剖析
  17. 我们是如何设计出,让玩家们有“上瘾症”的抽卡系统的
  18. 二维快速傅里叶逆变换
  19. oracle创建编号函数,oracle函数初次尝试
  20. MSRA相关资料总结!

热门文章

  1. 深度Linux简单高级全盘区别,DEEPIN LINUX 之高级分区方案说明、分区顺序建议
  2. 【交易架构day8】洋码头交易系统的演进之路——先生存后发展
  3. javascript绘制股票走势图
  4. sass,less,stylus
  5. 学校校车运营各项安全管理制度_学校校车安全管理制度汇编
  6. 银行系统3(功能又强大了哟 增加了些功能(例如改密码)还在优化中。)
  7. 【Matlab反正切函数】atan和atan2的不同点
  8. macOS Sonoma 14 beta 2 (23A5276g) ISO、IPSW、PKG 下载
  9. VS2017的TensorFlow安装
  10. Ansys Zemax | 如何在序列模式下模拟分光棱镜