【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)
文章目录
- Section 3:Vim Essentials(Vim 核心知识)
- S03L10 Vim 核心浏览命令同步练习点评课
- S03L11 Deleting Text and "Thinking in Vim" 文本的删除及 Vim 思维习惯的培养
- 1 删除单个字符
- 2 删除一个单词
- 2.1 推广1:D + HJKL
- 2.2 推广2:D + 0$
- 2.3 推广3:大写的 D
- 3 删除一整行
- 3.1 推广1:删除 3 行
- 3.2 推广2:[count]operation[count]{motion}
- 4 点操作符 .
- 5 保存文件相关操作
- 5.1 编辑过程中报错文件
- 5.2 保存并退出文件
- 5.3 退出文件且不保存变更
- 6 感叹号键 ! 的用法
- 6.1 用法1:强制执行
- 6.2 用法2:切换状态
- 6.3 用法3:执行某个命令行命令
- 7 小结
【写在前面】
都说“温故而知新”,用在这篇笔记上真是太贴切了。第一遍做笔记的时候还检查过一遍,但这次再以专栏形式发出来、隔了一段时间再看当时的笔记,就会发现很多细小的问题。笔记、文章、代码、项目,生活中的很多人和事,大抵如此。我们要做的不是毕其功于一役,而是“先完成,再完美”。这篇笔记的知识点非常重要,重点在于培养Vim专属的思维习惯,这也是我为什么把同步练习环节安排到下一篇的原因。
Section 3:Vim Essentials(Vim 核心知识)
(接上篇笔记)
S03L10 Vim 核心浏览命令同步练习点评课
没有需要特别注意的补充知识点,都是基础操作,多练多熟悉即可。
S03L11 Deleting Text and “Thinking in Vim” 文本的删除及 Vim 思维习惯的培养
1 删除单个字符
删除当前光标所在的单个字符:X
删除当前光标所在字符的前一个字符:Shift + X
2 删除一个单词
DW:删除一个单词 1
Vim 基本形式:operation{motion}( 操作{移动} )——
- 这里的 操作 即 D,表示 “删除操作”;
- 移动 即 W,这里表示 一个单词的移动。
2.1 推广1:D + HJKL
此外,由于浏览内容用的 H、J、K、L 命令也是一个 motion,因此,DW 还可以写成 D + n × L,即若干个 L 键,直到该单词被删除。
再联系 X 的用法:
- 小写 X 相当于 DL,删除光标当前位置的字符;
- 大写 X 则相当于 DH,删除紧挨光标前的那个字符。
那么,DJ 和 DH 呢?由于 J 的移动量是从上一行到下一行(如下图所示),因此 DJ 是否只会删除图中选中的部分?

【图 11-1 J 键产生的光标位移效果】
答案是否定的—— DJ 删除的是光标所在的 一整行,外加光标下面的那 一整行,如图 11-2 所示:

【图 11-2 按下 dj 后的实际效果:删除了两行,而不是单独的 J 选中的部分】
因此基本形式中的 motion 还不能简单理解为 位移量,而是要看当时 motion 的真实含义:J 表示将光标从 当前行向下 移动 一行,因此删除的是两行,而非单个 J 键扫过的部分。
同理,DK 的效果即为 删除当前行以及上一行。
2.2 推广2:D + 0$
有了上面的铺垫,D0 和 D$ 的行为就更好理解了,二者分别删除当前光标到该行起始、以及该行结束的内容:
# 0. Before operation
Here is another line of text.^ current cursor position
# 1. after pressing d0
ther line of text.
^ current cursor position
# 2. after pressing d$ (no content)
Here is ano^ current cursor position
注意:执行 d$ 后,原光标所在的字符 也将被同时删除。
2.3 推广3:大写的 D
在 Vim 中,大写的 D,即 Shift + D,等效于 D$,即删除当前光标及其后面所有的内容(在同一行上)
可见,Vim 中要达到同一个目的,通常有很多操作方案,根据个人喜好选择即可。自己熟悉的操作才更容易记牢。
3 删除一整行
按键:DD(均为小写)
3.1 推广1:删除 3 行
按键:3DD
由此出现了 Vim 的另一个基本形式:[count]operation{motion}([数量]操作{移动})——
5DW:
- 5:重复操作的次数
- DW:待重复命令(删除单个单词)
其实 DW 只是 1DW 省略了重复次数 1 之后的特殊形式。
3.2 推广2:[count]operation[count]{motion}
回忆 L08 中介绍的核心浏览操作,{motion} 前还可以跟一个数量:[count]{motion},因此结合第二个 Vim 基本形式,得到第三种推广形式:[count]operation[count]{motion}
注:这里的中括号 [] 表示非必填项,{} 则为必填项,什么都不加的也是必填项。
再看一个例子加深印象:
- 3W:重复 W 移动 3 次。
- D3W:删除 3W 移动(一遍)。即删除 3 个单词。
- 2D3W:删除 3W 移动,共执行两遍。即删除 6 个单词。
4 点操作符 .
表示快速重复上一次操作。类似 MS Word 中的 Ctrl + Y。
5 保存文件相关操作
5.1 编辑过程中报错文件
操作::w + Enter
执行完毕后仍在 Vim 常规模式下。

【图 11-3 在不退出 Vim 的情况下保存文件的操作】
5.2 保存并退出文件
操作::wq + Enter
5.3 退出文件且不保存变更
操作::q! + Enter
6 感叹号键 ! 的用法
6.1 用法1:强制执行
例如,退出但不保存::q + ! + Enter
此时文件有变更,只是不保存、直接退出。
如果此时省略叹号,变成 :q + Enter,则 Vim 会再次确认是否真的想退出,并给出提示信息(如图所示):

【图 11-4 有变更但未强制退出时,Vim 会中断操作并给出中文提示信息】

【图 11-5 有变更但未强制退出时,Vim 会中断操作并给出英文提示信息】
上面两张截图,第一张是 Windows 下安装的 v9.1 版 Vim;第二张为 Windows Subsystem for Linux(WSL)下 Ubuntu 系统自带的 v8.1 版 Vim。二者效果一致,都会中断操作。
6.2 用法2:切换状态
如配置状态栏的信息显示与否时,可以使用 :set ruler + ! 来切换 :set ruler 和 :set noruler 两个状态。
6.3 用法3:执行某个命令行命令
(后面详述,本节略)
7 小结
Vim的三个基本形态:
| 基本形态 | 示例 |
|---|---|
operation{motion} | DW |
[count]operation{motion} | 3DW |
[count]operation[count]{motion} | 2D3W |
- 感叹号的三个用法:
| 感叹号用法 | 示例 |
|---|---|
| 强制退出 | :q! |
| 状态切换(命令模式下) | :set ruler! |
| 执行命令(命令模式下) | :!ls(查看当前目录的文件列表)2 |
准确讲,应该是从 当前光标位置 开始,将按下小写 W 键经过的内容都删掉。 ↩︎
来自
ChatGPT,本节未涉及。 ↩︎
相关文章:
【Vim Masterclass 笔记03】S03L10 + S03L11:Vim 中的文本删除操作以及 Vim 思维习惯的培养(含 DIY 拓展知识点)
文章目录 Section 3:Vim Essentials(Vim 核心知识)S03L10 Vim 核心浏览命令同步练习点评课S03L11 Deleting Text and "Thinking in Vim" 文本的删除及 Vim 思维习惯的培养1 删除单个字符2 删除一个单词2.1 推广1:D HJK…...
ARM200~500部署
前提:数据库已经安装好,并且正常运行 1.修改hostname,将里面的AR-A 改为hzx vi /etc/hostname 2.重启网络服务 sudo systemctl restart NetworkManager 3.修改community-admin.service 文件,更改小区名称和IP,并将文件上传到/…...
word中插入zotero引用
1、参考文献末尾没有文献? 在文献条目要显示的地方点击“refresh” 2、参考文献条目没有悬挂缩进? 把“书目”添加到样式库中,修改样式为悬挂缩进1.5字符 3、交叉引用? 宏 新建一个宏 粘贴下面代码 Public Sub ZoteroLinkCita…...
需求上线,为什么要刷缓存?
在需求上线的过程中,刷缓存主要有以下几个重要原因: 一、保证数据的准确性 旧数据残留问题 缓存是为了加快数据访问速度而存储的数据副本。在需求更新后,之前缓存中的数据可能已经不符合新的业务逻辑。例如,一个电商网站修改了商…...
TVS二极管选型【EMC】
TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…...
《从入门到精通:蓝桥杯编程大赛知识点全攻略》(一)-递归实现指数型枚举、递归实现排列型枚举
本篇博客将聚焦于通过递归来实现两种经典的枚举方法:指数型枚举和排列型枚举。这两种枚举方式在计算机科学和算法竞赛中都有广泛应用,无论是在解题中,还是在实际工作中都极具价值。 目录 前言 斐波那契数列递归 递归实现指数型枚举 算法思…...
C#对线程同步的应用
什么是线程同步?线程同步的应用场景有哪些?在C#中有哪些线程同步方式?下面对这些问题做一个总结,让大家在面试的时候遇到这些问题能够游刃有余。 线程同步是指在多线程环境下,多个线程同时访问共享资源时,确…...
基于微信小程序的面部动作检测系统
引言 本技术文档旨在详细阐述一个基于微信小程序的面部动作检测系统的技术路线、实现方法及关键技术框架。系统的核心功能包括检测用户的左右转头、眨眼和张嘴动作,并根据检测结果逐步引导用户完成任务。为确保系统的安全性和准确性,特别是防止用户通过…...
Activation Functions
Chapter4:Activation Functions 声明:本篇博客笔记来源于《Neural Networks from scratch in Python》,作者的youtube 其实关于神经网络的入门博主已经写过几篇了,这里就不再赘述,附上链接。 1.一文窥见神经网络 2.神经…...
《Vue3实战教程》37:Vue3生产部署
如果您有疑问,请观看视频教程《Vue3实战教程》 生产部署 开发环境 vs. 生产环境 在开发过程中,Vue 提供了许多功能来提升开发体验: 对常见错误和隐患的警告对组件 props / 自定义事件的校验响应性调试钩子开发工具集成 然而ÿ…...
Linux:各发行版及其包管理工具
相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 Debian 包管理工具:dpkg(低级包管理器)、apt(高级包管理器,建立在dpkg基础上)包格式:…...
【计算机网络】课程 作业一 搭建连续覆盖的办公网络
作业一 搭建连续覆盖的办公网络 题目:论述题(共1题,100分) 充分利用所学习的数据链路层局域网知识,加上物理层的基础知识,请给一个办公场所(三层,每层约100平方)…...
C++ 设计模式:单例模式(Singleton Pattern)
链接:C 设计模式 链接:C 设计模式 - 享元模式 单例模式(Singleton Pattern)是创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式在需要全局共享资源或控制实例数量的…...
OpenCV调整图像亮度和对比度
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 1、基本方法---线性变换 // 亮度和对比度调整 cv::Mat adjustBrightnessContrast(const cv::Mat& src, double alpha, int beta) {cv::Mat dst;src.convertTo(dst, -1, alpha, beta);return dst; }// 使用…...
Kafka Offset explorer使用
Kafka集群配置好以后以后运维这边先用工具测试一下,便于rd展开后续的工作,本地调试时一般使用Offset explorer工具进行连接 使用SASL(Simple Authentication and Security Layer)验证方式 使用SCRAM-SHA-256(Salted Challenge Response Authentication…...
二维码文件在线管理系统-收费版
需求背景 如果大家想要在网上管理自己的文件,而且需要生成二维码,下面推荐【草料二维码】,这个系统很好。特别适合那些制造业,实体业的使用手册,你可以生成一个二维码,贴在设备上,然后这个二维码…...
UE4.27 Android环境下获取手机电量
获取电量方法 使用的方法时FAndroidMisc::GetBatteryLevel(); 出现的问题 但是在电脑上编译时发现,会发现编译无法通过。 因为安卓环境下编译时,包含 #include "Android/AndroidPlatformMisc.h" 头文件是可以正常链接的,但在电…...
vue-i18n报错
1. 开发环境报错Uncaught (in promise) TypeError: ‘set’ on proxy: trap returned falsish for property ‘$t’ legacy需要设置为false const i18n createI18n({legacy: false,// 默认语言locale: lang,// 设置语言环境messages, })2. 打包配置tsc --noEmit时报错&#…...
Docker新手:在tencent云上实现Python服务打包到容器
1 使用docker的原因 一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。 隔离性ÿ…...
React基础知识学习
学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
