【Vim Masterclass 笔记18】第八章 + S08L35:Vim 的可视化模式(二)

devtools/2025/1/22 12:41:49/

文章目录

  • S08L35 Visual Mode - Part 2
    • 1 利用可视化模式控制代码块的缩进
    • 2 缩进宽度的设置
    • 3 仅对选中区域执行替换操作
    • 4 利用可视化模式实现文本对齐

写在前面
本篇为 Vim 可视化模式的第二部分,主要介绍了可视化模式在代码缩进方面的应用。该视频应该录制于 2018 年前后,但时至今日视频中提到的一个 Bug 仍然存在,本篇也进行了详细论证。这可能也是二八定律中人迹罕至的那 80% 功能里难免会遇到的情况。我的基本观点是,穷则独善其身:与其因噎废食,不如扬长避短,因地制宜;达则兼济天下:充分利用自己已有的资源,积极促成该 Bug 的修复,引发关注也好,提交 issue / PR 也罢,坚信星星之火也可以燎原。

S08L35 Visual Mode - Part 2


(接上节内容)本节演示文件:vimclass/visual.txt

1 利用可视化模式控制代码块的缩进

为下列代码块增加缩进量:

图 35-1:待添加缩进的示例代码块

【图 35-1:待添加缩进的示例代码块】

选中目标区域后 ——

  • 增加缩进:>
  • 减少缩进:<

可视化模式版本:ShiftV + I{ + >

对比正常模式版本:> + I{

正常模式下,单行内容的缩进控制 ——

  • 增加缩进:>>
  • 减少缩进:<<

注意:单行操作时,光标不必定位到行首。

2 缩进宽度的设置

通过 >< 控制的缩进量,由命令参数 shiftwidth 的大小决定。相关设置命令如下:

:set shiftwidth?  # 默认为 8 个空格的距离:shiftwidth=8
:set shiftwidth=4 # 改为 4 个空格的距离

此外,Vim 中的制表符 \t 的宽度默认也为 8 个空格,它通过命令参数 tabstop 设置:

:set tabstop?   # 默认为 8 个空格的距离:tabstop=8
:set tabstop=4  # 改为 4 个空格的距离

每次增加一个缩进单位,Vim 就会插入与 shiftwidth 等宽的多个空格;当空格数累计到与 tabstop 等宽时,这些连续的空格就会自动替换为 Tab,相当于插入了一个 Tab 制表符。该默认行为可以通过 :set list 命令进行观测:

图 35-2:打开 list 模式看到的缩进版本(tabstop 和 shiftwidth 均为 8)

【图 35-2:打开 list 模式看到的缩进版本(tabstop 和 shiftwidth 均为 8)】

上图中 ^I 表示一个制表符,$ 则表示一行的结尾。

由于 Tab 与空格混合会令代码缩进效果变差,通常会阻止该默认替换行为。这可以通过手动设置 :set expandtab 来实现(默认是关闭状态)。该命令可将 Tab 制表符填充为等宽的多个空格。

查看 Vimexpandtab 状态,执行命令 :set expandtab? + Enter 即可。

这些缩进量和缩进行为的设置通常会写入 vimrc 文件自动生效。后续会专门介绍 vimrc 文件,这里不展开。

3 仅对选中区域执行替换操作

给定如下一组文本:

图 35-3:待处理的示例文本块

【图 35-3:待处理的示例文本块】

若只对该段文本中的 United States of America 批量替换为 USA,可以借助区块级可视化模式实现——

  1. 选中待替换区域:J + CtrlQ + /G + Enter(如图 35-4 所示)
  2. 对选中区域使用 :s/old/new/ 替换命令:键入 : 后自动补全为 :'<,'>'<,'> 就是当前选中区域在命令模式下的写法,分别对应起点和终点,并用逗号分隔。
  3. 完整的替换命令为::'<,'>s/United States of America/USA/ + Enter(如图 35-5 所示)

图 35-4:选中待替换区域后的实测效果图(Windows 版 Vim,v9.1)

【图 35-4:选中待替换区域后的实测效果图(Windows 版 Vim,v9.1)】

图 35-5:对选中区块执行替换命令的实测效果图

【图 35-5:对选中区块执行替换命令的实测效果图】

这样就实现了仅对选中区域进行文本替换,而其他位置的匹配项则不受影响,如图 35-6 所示:

图 35-6:仅对选中区域实现内容替换后的实测效果图

【图 35-6:仅对选中区域实现内容替换后的实测效果图】

关于视频提到的 Bug 的本地验证

视频中还提到录制当时 Vim 存在的一个 Bug:命令模式下的替换命令会对一整行生效。也就是说,如果启用的是字符级可视化模式,从命令模式下执行的命令将会对那一整行生效。为此,实操过程中特地在本地进行了验证,发现该 Bug 依然存在。以下是验证过程(时间:2025 年 1 月17 日):

假如同一行有两处匹配项:

图 35-7:临时构造的待验证文本,同一行包含两处待替换内容

【图 35-7:临时构造的待验证文本,同一行包含两处待替换内容】


V 开启字符级可视化模式,并只选中后一个匹配项:

图 35-8:字符级可视化模式下,只选中后面那个匹配项

【图 35-8:字符级可视化模式下,只选中后面那个匹配项】


然后在命令行模式下执行相同的替换命令,发现 Vim 实时匹配的是选中区外的那个关键词:

图 35-9:在命令模式下执行相同的替换命令

【图 35-9:在命令模式下执行相同的替换命令】


Enter 执行命令,实际只替换了选中的第一项,选中区域内的关键词反而未被替换:

图 35-10:执行替换后,选区外的关键词被意外替换,而选取内的却保持原样

【图 35-10:执行替换后,选区外的关键词被意外替换,而选取内的却保持原样】


此时若修改命令,追加一个全局替换 g,则两个匹配项 都会被替换

图 35-11:改为全局替换后,两个关键词均被替换,与选中区域无关

【图 35-11:改为全局替换后,两个关键词均被替换,与选中区域无关】


为了排除实时匹配关键词的影响,又尝试关闭 is 参数::set nois。再次测试,问题依旧。

【结论】

对于 Vimv9.1Windows 版本,当同一行存在多个待替换关键词时,仍然无法通过选中部分关键词、并通过命令行模式中的 :s/old/new/ 替换命令,实现指定区域内的关键词替换。:s/old/new/ 命令将无视选中区域,对该行的关键字实施单个(不带 g 标记)或全量(带 g 标记)替换。

4 利用可视化模式实现文本对齐

对齐 Vim 文本的官方文档如下:

图 3-12:对齐 Vim 文本行的官方文档截图

【图 3-12:对齐 Vim 文本行的官方文档截图】

结合可视化模式,要选中行设置文本居中对齐,需执行命令::'<,'>center [width]:'<,'>ce [width],其中 width 为对齐参考的总宽度,默认为 80 个字符宽度,可手动变更。

同理,设置左对齐、右对齐只需将居中命令分别改为 left(或 le)、right(或 ri)即可。

该方法非常适合生成源码文件中的精美注释块:

################################################################################
#                                  Episode V:
#                           The Empire Strikes Back
################################################################################

http://www.ppmy.cn/devtools/152597.html

相关文章

UE5 开启“Python Remote Execution“

demo 代码 remote_execution.py 远程调用UE5 python代码-CSDN博客 在启用 Unreal Engine 5&#xff08;UE5&#xff09;的“Python 远程执行”功能后&#xff0c;UE5 会启动一个 UDP 组播套接字服务&#xff0c;以监听来自外部应用程序的 Python 命令。 具体行为如下&#xf…

Arm 计划涨价高达 300%,并考虑自行研发芯片

Arm 计划涨价高达 300% 据财联社 1 月 14 日消息&#xff0c;芯片技术供应商 Arm Holdings&#xff08;Arm&#xff09;正在制定一项长期战略&#xff0c;计划将其芯片设计授权费用提高高达 300%&#xff0c;并考虑自主研发芯片&#xff0c;以与其最大的客户展开竞争。以下是详…

ChatGPT大模型极简应用开发-目录

引言 要理解 ChatGPT&#xff0c;了解其背后的 Transformer 架构和 GPT 技术一路的演进则变得非常必要。 ChatGPT 背后的 LLM 技术使普通人能够通过自然语言完成过去只能由程序员通过编程语言实现的任务&#xff0c;这是一场巨大的变革。然而&#xff0c;人类通常容易高估技术…

亲测有效!如何快速实现 PostgreSQL 数据迁移到 时序数据库TDengine

小T导读&#xff1a;本篇文章是“2024&#xff0c;我想和 TDengine 谈谈”征文活动的优秀投稿之一&#xff0c;作者从数据库运维的角度出发&#xff0c;分享了利用 TDengine Cloud 提供的迁移工具&#xff0c;从 PostgreSQL 数据库到 TDengine 进行数据迁移的完整实践过程。文章…

ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)

参考Zookeeper 介绍——设计目的、使用场景、相关概念&#xff08;数据模型、myid、事务 ID、版本、监听器、ACL、角色&#xff09; ZooKeeper 设计目的、特性、使用场景 ZooKeeper 的四个设计目标ZooKeeper 可以保证如下分布式一致性特性ZooKeeper 是一个典型的分布式数据一致…

html转义符+h5提供的新标签

html转义符 h5提供的新标签 HTML5是HTML从传统的web端开始兼容移动互联网的重要标志&#xff0c;h5为HTML提供了大量好用的标签&#xff0c;如布局使用的三个标签header、section、footer标签&#xff1b;用来播放视频和音频的多媒体标签video、audio标签等&#xff0c;参考表…

Vue+Element-ui 中 使用el-table 设置表格单元格 (el -table-column) 保留空格和换行

遇到的问题 在使用 el-table 展示数据时&#xff0c;单元格中的数据中存在多个空格和换行符&#xff0c;若不进行设置&#xff0c;浏览器默认会取消空格和换行符。 解决办法 将单元格的样式 “white-space” 属性设置为“pre-wrap” 即可解决 ::v-deep .el-table .cell {wh…

mysql的测试方案

1. 测试目标与范围 1.1 性能测试目标 MySQL性能测试旨在评估数据库在不同负载条件下的响应速度、吞吐量和资源利用率&#xff0c;确保其能够满足业务需求。 响应时间&#xff1a;衡量查询和事务处理的延迟&#xff0c;目标是将平均响应时间控制在100毫秒以内&#xff0c;95%的…