何小豆儿在此 发表于 4 小时前

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

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

(接上节内容)本节演示文件:vimclass/visual.txt。
1 使用可视化模式控制代码块的缩进

为下列代码块增长缩进量:
https://i-blog.csdnimg.cn/direct/8dc1c15cd59a412487cd1040943cd1bd.png#pic_center
【图 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 命令进行观测:
https://i-blog.csdnimg.cn/direct/c06cf032480f4dc5a8aa8557f508010c.png#pic_center
【图 35-2:打开 list 模式看到的缩进版本(tabstop 和 shiftwidth 均为 8)】
上图中 ^I 表示一个制表符,$ 则表示一行的末了。
由于 Tab 与空格混淆会令代码缩进效果变差,通常会阻止该默认替换行为。这可以通过手动设置 :set expandtab 来实现(默认是关闭状态)。该命令可将 Tab 制表符填充为等宽的多个空格。
查看 Vim 的 expandtab 状态,实行命令 :set expandtab? + Enter 即可。
这些缩进量和缩进行为的设置通常会写入 vimrc 文件自动见效。后续会专门介绍 vimrc 文件,这里不睁开。
3 仅对选中区域实行替换使用

给定如下一组文本:
https://i-blog.csdnimg.cn/direct/d9d8b1ad3cab431c886319cd2b62841d.png#pic_center
【图 35-3:待处置惩罚的示例文本块】
若只对该段文本中的 United States of America 批量替换为 USA,可以借助区块级可视化模式实现——

[*]选中待替换区域:J + CtrlQ + /G + Enter(如图 35-4 所示)
[*]对选中区域使用 :s/old/new/ 替换命令:键入 : 后自动补全为 :'<,'>。'<,'> 就是当前选中区域在命令模式下的写法,分别对应出发点和终点,并用逗号分隔。
[*]完整的替换命令为::'<,'>s/United States of America/USA/ + Enter(如图 35-5 所示)
https://i-blog.csdnimg.cn/direct/55de659aa9fd4bfdb80917fe0fd9ee38.png#pic_center
【图 35-4:选中待替换区域后的实测效果图(Windows 版 Vim,v9.1)】
https://i-blog.csdnimg.cn/direct/09b3d2b823a54232b32a89c8cf5cb378.png#pic_center
【图 35-5:对选中区块实行替换命令的实测效果图】
这样就实现了仅对选中区域进行文本替换,而其他位置的匹配项则不受影响,如图 35-6 所示:
https://i-blog.csdnimg.cn/direct/70586c7392314f2ca10ba033ecbd4ea8.png#pic_center
【图 35-6:仅对选中区域实现内容替换后的实测效果图】
   关于视频提到的 Bug 的本地验证


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


https://i-blog.csdnimg.cn/direct/525b745af28c44f7afafe2dfb92a5a3a.png#pic_center
【图 35-7:临时构造的待验证文本,同一行包含两处待替换内容】

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


https://i-blog.csdnimg.cn/direct/976fe157a483498c96779bd2f2d3eb84.png#pic_center
【图 35-8:字符级可视化模式下,只选中后面谁人匹配项】

然后在命令行模式下实行类似的替换命令,发现 Vim 及时匹配的是选中区外的谁人关键词:


https://i-blog.csdnimg.cn/direct/d29642cb45444b078d8ae078a6794e41.png#pic_center
【图 35-9:在命令模式下实行类似的替换命令】

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


https://i-blog.csdnimg.cn/direct/3beba2346c9947fab0f00cfbbbffc7ae.png#pic_center
【图 35-10:实行替换后,选区外的关键词被不测替换,而选取内的却保持原样】

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


https://i-blog.csdnimg.cn/direct/c343da8af33b414cb4d18214adbb284c.png#pic_center
【图 35-11:改为全局替换后,两个关键词均被替换,与选中区域无关】

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


【结论】


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

对齐 Vim 文本的官方文档如下:
https://i-blog.csdnimg.cn/direct/6d0299e026134cd89d39b072917cf4ac.png#pic_center
【图 3-12:对齐 Vim 文本行的官方文档截图】
联合可视化模式,要选中行设置文本居中对齐,需实行命令::'<,'>center 或 :'<,'>ce ,其中 width 为对齐参考的总宽度,默认为 80 个字符宽度,可手动变更。
同理,设置左对齐、右对齐只需将居中命令分别改为 left(或 le)、right(或 ri)即可。
该方法非常适合生成源码文件中的精美解释块:
################################################################################
#                                  Episode V:
#                           The Empire Strikes Back
################################################################################

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【Vim Masterclass 条记18】第八章 + S08L35:Vim 的可视化模式(二)