【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
文章目录
- Section 7:Text Objects and Macros
- S07L28 Text Objects
- 1 文本对象的含义
- 2 操作文本对象的基本语法
- 3 操作光标所在的整个单词
- 4 删除光标所在的整个句子
- 5 操作光标所在的整个段落
- 6 删除光标所在的中括号内的文本
- 7 删除光标所在的小括号内的文本
- 8 操作尖括号内的文本
- 9 操作光标所在的标签文本
- 10 操作大括号内的文本
- 11 操作光标所在的各种括号内的文本
- 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 操作文本对象的基本语法
语法一:
{operator}{a}{object}
语法二:
{operator}{i}{object}
3 操作光标所在的整个单词
删除整个单词:
DAW:即 Delete A Word(带对象分隔符,A 表示 around
或 all
)
更改整个单词:
CIW:即 Change Inner Word(不带对象分隔符,I 表示 inner
)
此外,{object}
指代 “单词” 时(即 w
与 W
)也有大小写的区别,主要体现在 对象分隔符 的认定上:
- 小写形式(即 W):对象分隔符包括 标点符号 和 空白字符
- 大写形式(即 ShiftW):对象分隔符只包含 空白字符
4 删除光标所在的整个句子
句子(Sentence)对应的 {object}
为 s
,例如以下操作指令:
- DAS:删除光标所在的一整句话,包括该句子的 句点位置,以及句点后面的空白字符。
- DIS:删除光标所在的一整句话,且仅删到句点位置(含)。
此外,对于句子中出现换行的情况,Vim
也能自动视为同一句话,一并处理。例如,对于下列三句话,如果需要删除第二句,操作前如下所示(假设光标位于单词 multiple
上):
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,得到:
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
标签本身):
<p>This is <strong>so, so, very</strong> cool!</p>
按 DIT,得到:
<p></p>
注意
当标签只存在嵌套的其他标签时,光标必须正确定位,因为
t
只对当前光标所在的最近一层的标签生效。因此,如果光标位于<strong>
内,则只对<strong>
圈定的文字生效,而位于p
内部、strong
外部的文字则不受影响。此外,对于自定义的标签(如 XML 或自定义组件标签),
at
与it
操作同样适用。
10 操作大括号内的文本
同理,大括号对应的文本对象用 {
或 }
表示,且与 a
组合表示包含大括号本身,与 i
组合表示不包含大括号。与标签的情况类似,存在嵌套时,也仅对当前光标所在的最内层大括号生效。
同时,也可以用 B
表示大括号文本对象,与小括号的 b
相对。这里也体现了 Vim
的形象化思维:小括号用小写的 b
表示(即小写的 block
区块);大括号用大写的 B
表示(对应大写的 Block
区块)。
11 操作光标所在的各种括号内的文本
- 双引号:A"、I"
- 单引号:A'、I'
- 反引号:A`、I`
12 本节思维导图
【图 28-1:本节思维导图】
后话
不得不佩服 Vim 对各种键位的天才设计思路,与英语的自然融合几乎不用去死记硬背这些组合键。很多人被 Vim 所谓的高门槛吓退,殊不知磨刀不误砍柴工。忽视这样先难后易、掌握后终身受用的硬核技能,也就是大部分人捡芝麻丢西瓜的倒置人生的真实写照。
相关文章:

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象
文章目录 Section 7:Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…...

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例
Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架,使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序,您可…...
统计有序矩阵中的负数
统计有序矩阵中的负数 描述 给你一个 m * n 的矩阵 grid,矩阵中的元素无论是按行还是按列,都以非递增顺序排列。 请你统计并返回 grid 中 负数 的数目 示例 1: 输入:grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]]…...

【6】Word:海名公司文秘❗
目录 题目 List.docx Word.docx List.docx和Word.docx 题目 List.docx 选中1/4全角空格复制→选中全部文本→开始→替换:粘贴将1/4全角空格 替换成 空格选中全部文本→插入→表格→将文本转化成表格→勾选和布局→自动调整→勾选 选中第一列,单机右键…...
c语言 --- 字符串
创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0; }解释: 数组大小 20 表…...

LeetCode 热题 100_二叉树的最近公共祖先(49_236_中等_C++)(二叉树;深度优先搜索)
LeetCode 热题 100_二叉树的最近公共祖先(49_236) 题目描述:输入输出样例:题解:解题思路:思路一(深度优先搜索): 代码实现代码实现(思路一(深度优…...
(三)c#中const、static、readonly的区别
在 C# 中,const、static 和 readonly 都是用来定义不可变的值,但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点: 1. const(常量) 编译时常量:const 用于声明常量,其值必须在编…...

人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日,演员王星因接到一份看似来自知名公司的拍戏邀约,被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…...

【C++】函数(下)
1、函数的常见样式 常见的函数样式有四种: (1)无参数无返回值 (2)有参数无返回值 (3)无参数有返回值 (4)有参数有返回值 (1)无参数无返回值 示例…...

一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取
大家好,今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana,旨在提供高效、灵活且功能丰富的网络爬取体验,适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…...
深入探讨 Vue.js 的动态组件渲染与性能优化
Vue.js 作为一款前端领域中备受欢迎的渐进式框架,以其简单优雅的 API 和灵活性受到开发者的喜爱。在开发复杂应用时,动态组件渲染是一项极其重要的技术,它能够在页面中动态地加载或切换组件,从而显著提升应用的灵活性与用户体验。…...

vulnhub靶场【IA系列】之Tornado
前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…...

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript
目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址: https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准,由一系列的标准组成,大部分由W3C&…...

C# 修改项目类型 应用程序程序改类库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

卡通风格渲染
1、卡通风格渲染是什么 卡通风格渲染(Cartoon Shading),也称为非真实感渲染(NPR)或卡通渲染(Toon Shading) 主要目的是使3D模型看起来更像手绘的二维卡通或漫画风格,而不是逼真写实…...
ubuntu各分区的用途
在 Ubuntu 中,分区是将硬盘划分为多个逻辑部分的过程,每个分区可以用于不同的用途。合理分区可以提高系统性能、数据安全性和管理效率。以下是 Ubuntu 中常见分区及其用途的详细说明: 1. 根分区 (/) 用途:存放操作系统核心文件、…...

理解STC15F2K60S2单片机的最小电路
一、STC15F2K60S2与51单片机的区别 STC15F2K60S2和51单片机虽然都基于8051内核,但在多个方面存在显著区别: 1. CPU性能: - STC15F2K60S2:采用增强型8051 CPU,1T单时钟/机器周期,速度比普通8051快8-12倍…...

Docker官网安装
1.官网 官方文档 https://www.docker.com/ Docker Hub官网 镜像 https://hub.docker.com/ 2.Docker 的三要素 1、镜像 2、容器 3、仓库 小总结 3.Docker 平台架构图 (架构版本) 4.安装Docker CentOS | Docker Docs 1.确定你是CentOS7及以上版本 …...

成功案例分享 — 芯科科技助力涂鸦智能打造Matter over Thread模块,简化Matter设备开发
芯科科技(Silicon Labs)的愿景之一是让开发者每天都能够更轻松地开发无线物联网(IoT)。特别是在拥有相同愿景的合作伙伴的帮助下,我们每天都在取得进步。但是要想弥合知识水平和物联网开发之间的差距仍会面临一定的挑战…...

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解
1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...