【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录

  • [Section 7:Text Objects and Macros](#Section 7:Text Objects and Macros)
    • [S07L28 Text Objects](#S07L28 Text Objects)
      • [1 文本对象的含义](#1 文本对象的含义)
      • [2 操作文本对象的基本语法](#2 操作文本对象的基本语法)
      • [3 操作光标所在的整个单词](#3 操作光标所在的整个单词)
      • [4 删除光标所在的整个句子](#4 删除光标所在的整个句子)
      • [5 操作光标所在的整个段落](#5 操作光标所在的整个段落)
      • [6 删除光标所在的中括号内的文本](#6 删除光标所在的中括号内的文本)
      • [7 删除光标所在的小括号内的文本](#7 删除光标所在的小括号内的文本)
      • [8 操作尖括号内的文本](#8 操作尖括号内的文本)
      • [9 操作光标所在的标签文本](#9 操作光标所在的标签文本)
      • [10 操作大括号内的文本](#10 操作大括号内的文本)
      • [11 操作光标所在的各种括号内的文本](#11 操作光标所在的各种括号内的文本)
      • [12 本节思维导图](#12 本节思维导图)

写在前面

本篇开始介绍 Vim 的另一类核心操作:文本对象与宏。这是筑牢 Vim 基础后真正开始为开发者提效的一章,也是 Vim 在文本编辑领域至今没有敌手的重要原因之一。只要你还在写 HTML、还需要修改配置文件、还需要一次性变更代码块中的文本,Vim 的操作效率就会秒杀其他文本工具,不仅可以摆脱对鼠标的依赖,甚至都不用把右手移到旁边的四个方向键。这样节约的时间看似微不足道,长期积累下来就非常可观了,甚至还可以缓解因为频繁操作鼠标导致的腱鞘炎。总之,Vim 的强大,谁用谁知道。

Section 7:Text Objects and Macros

S07L28 Text Objects


本节演示文件:vimclass/textobjects.txt

1 文本对象的含义

Vim 中的 文本对象(Text Objects) (又叫 逻辑区域(Logical Regions))主要包括:

  • 单词
  • 句子
  • 段落
  • 各种标点符号分隔的文本,如:
    • 引号(单引号、双引号)
    • 反引号
    • 大括号
    • HTML 标签

2 操作文本对象的基本语法

语法一:

markdown 复制代码
{operator}{a}{object}

语法二:

markdown 复制代码
{operator}{i}{object}

3 操作光标所在的整个单词

删除整个单词:

DAW:即 D elete A W ord(带对象分隔符,A 表示 aroundall

更改整个单词:

CIW:即 C hange I nner W ord(不带对象分隔符,I 表示 inner

此外,{object} 指代 "单词" 时(即 wW)也有大小写的区别,主要体现在 对象分隔符 的认定上:

  • 小写形式(即 W):对象分隔符包括 标点符号空白字符
  • 大写形式(即 ShiftW):对象分隔符只包含 空白字符

4 删除光标所在的整个句子

句子(Sentence)对应的 {object}s,例如以下操作指令:

  • DAS:删除光标所在的一整句话,包括该句子的 句点位置,以及句点后面的空白字符
  • DIS:删除光标所在的一整句话,且仅删到句点位置(含)

此外,对于句子中出现换行的情况,Vim 也能自动视为同一句话,一并处理。例如,对于下列三句话,如果需要删除第二句,操作前如下所示(假设光标位于单词 multiple 上):

markdown 复制代码
This is a sentence comprised of many words.  This is another sentence. A 
paragraph is made up of multiple sentences.  Just like this one!

执行操作 DAS,得到:

markdown 复制代码
This is a sentence comprised of many words.  This is another sentence. Just like this one!

重复上述操作,还可以使用快捷键 .

5 操作光标所在的整个段落

Vim 中,一句话是以句点 . 结尾的;而一个段落则是用空行进行分隔的。段落对应的对象表示为 p,即段落的英文单词 paragraph 的首字母,相关操作如下(以 d 命令为例):

  • DAP:删除当前光标所在的一整段文本,以及该段落后面的空行。
  • DIP:仅删除当前光标所在的一整段文本,段落后面的空行不动。

6 删除光标所在的中括号内的文本

中括号对应的文本对象用 [] 表示,二者含义相同,都指代中括号圈定的文字,与 A 结合表示包含括号本身,与 I 组合则仅针对其中的文本。例如:

  • DA[DA]:删除当前光标所在的、由中括号圈定的文本内容,且包含中括号本身;
  • CI[CI]:更改当前光标所在的、由中括号圈定的文本内容,但保留中括号本身。

7 删除光标所在的小括号内的文本

Vim 中,小括号对应的文本对象用 () 表示;包含小括号用 a,不包含则与 i 组合。例如:

  • DA(DA):删除当前光标所在的小括号圈定的文本内容,且包括小括号本身一并删除。
  • DI(DI):删除当前光标所在的小括号圈定的文本内容,但保留小括号本身。

同时,小括号还可以用 b 表示,意指 block 区块,同时也省去了多按一次 Shift 键的麻烦。

8 操作尖括号内的文本

Vim 中,尖括号对应的文本对象用 <> 表示,包含则用 a,不包含与 i 组合。例如,对 <html> 作如下操作:

  • YA<YA>:复制(Yank)光标所在的尖括号圈定的文本,且包含尖括号本身(即复制 <html>);
  • YI<YI>:复制(Yank)光标所在的尖括号圈定的文本,但不包含尖括号本身(即复制 html);

9 操作光标所在的标签文本

Vim 中,标签对应的文本对象为 t(即 tag 的首字母)。包含标签与 a 组合,不包含则与 i 组合。例如,删除下列文本中 p 标签内的文字(不含 p 标签本身):

html 复制代码
<p>This is <strong>so, so, very</strong> cool!</p>

DIT,得到:

html 复制代码
<p></p>

注意

当标签只存在嵌套的其他标签时,光标必须正确定位,因为 t 只对当前光标所在的最近一层的标签生效。因此,如果光标位于 <strong> 内,则只对 <strong> 圈定的文字生效,而位于 p 内部、strong 外部的文字则不受影响。

此外,对于自定义的标签(如 XML 或自定义组件标签),atit 操作同样适用。

10 操作大括号内的文本

同理,大括号对应的文本对象用 {} 表示,且与 a 组合表示包含大括号本身,与 i 组合表示不包含大括号。与标签的情况类似,存在嵌套时,也仅对当前光标所在的最内层大括号生效。

同时,也可以用 B 表示大括号文本对象,与小括号的 b 相对。这里也体现了 Vim 的形象化思维:小括号用小写的 b 表示(即小写的 block 区块);大括号用大写的 B 表示(对应大写的 Block 区块)。

11 操作光标所在的各种括号内的文本

  • 双引号:A"I"
  • 单引号:A'I'
  • 反引号:A</kbd>、<kbd>I</kbd><kbd>

12 本节思维导图

【图 28-1:本节思维导图】

后话

不得不佩服 Vim 对各种键位的天才设计思路,与英语的自然融合几乎不用去死记硬背这些组合键。很多人被 Vim 所谓的高门槛吓退,殊不知磨刀不误砍柴工。忽视这样先难后易、掌握后终身受用的硬核技能,也就是大部分人捡芝麻丢西瓜的倒置人生的真实写照。

相关推荐
wqfhenanxc13 分钟前
Mixing C++ and Rust for Fun and Profit 阅读笔记
c++·笔记·rust
豆沙沙包?1 小时前
8.学习笔记-Maven进阶(P82-P89)
笔记·学习·maven
刘婉晴8 小时前
【信息安全工程师备考笔记】第三章 密码学基本理论
笔记·安全·密码学
晓数10 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
我的golang之路果然有问题10 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
lwewan10 小时前
26考研——存储系统(3)
c语言·笔记·考研
搞机小能手11 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
nongcunqq11 小时前
爬虫练习 js 逆向
笔记·爬虫
汐汐咯12 小时前
终端运行java出现???
笔记
无敌小茶13 小时前
Linux学习笔记之环境变量
linux·笔记