找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1426

积分

0

好友

208

主题
发表于 8 小时前 | 查看: 0| 回复: 0

Vim的可视模式提供了一种灵活且直观的方式来选择文本块,然后应用操作符进行处理。它也是选择矩形文本列块的唯一方法。

其“先选择,后操作”的逻辑与现代图形编辑器(使用鼠标)非常相似,区别在于Vim通过键盘快捷键实现了这一切,在熟练后效率更高。

1. 可视模式基础

理解可视模式的基本概念是高效使用它的第一步。

要删除一些简单的文本,使用操作符‑动作命令(如 dw)通常就足够了。但在更复杂的场景中,可能很难找到合适的动作命令来精确移动到目标位置。这时,可视模式就派上了用场。

你可以使用 v(小写)命令启动可视模式。然后移动光标来选择文本区域,被选中的文本会高亮显示。最后,键入一个操作符命令(如 d 删除)来对高亮区域执行操作。

例如,要从一个单词的中间删除到下一个单词的中间,可以这样做:

This is an examination sample of visual mode
          └─────移动光标─────┘
This is an example of visual mode

操作步骤

  1. 将光标置于“examination”的某个字母上。
  2. v 进入字符可视模式。
  3. 使用 l(右移)、w(跳到下一个单词词首)等命令移动光标至“sample”的某个字母。
  4. 看到目标文本高亮后,按 d 删除。

字符可视模式示例

在这个过程中,你无需精确计算需要按多少次 l,因为可以直观地看到高亮的文本。如果中途想取消选择,只需按 <Esc> 键即可退出可视模式。

按行选择

若需要对整行进行操作,可以使用 V(大写)命令启动行可视模式。进入该模式后,当前整行会立即被高亮,左右移动光标无效,上下移动则可选择多行。

例如,使用 Vjj 可以选中三行(当前行及下面两行):

行可视模式示例

上图展示了光标在第6行时,按下 Vjj 后选中了三行文本。

列块选择

这是处理矩形文本区域的利器,使用 Ctrl-v 启动。在处理表格数据或代码注释时尤其有用。

假设有如下表格:

name   Q1  Q2  Q3
pierre 123 455 234
john   0   90  39
steve  392 63  334

要删除中间“Q2”这一整列:

  1. 将光标移动到第一个“Q2”的“Q”上。
  2. Ctrl-v 进入列块可视模式。
  3. 3j 向下移动三行,再按 w 移动到“Q3”的“Q”上(此时最后一列的首字符也被选中)。
  4. h 向左移动一格,排除“Q3”列。
  5. d 删除选中列。

列块删除示例

现在,让我们为这段文本的每一行行首添加注释符号 #

  1. 将光标移动到“name”的“n”上。
  2. Ctrl-v 进入列块模式,再按 j2j 向下选中所有行,形成一列。
  3. I 进入插入模式(状态栏显示 -- INSERT --)。
  4. 输入 #
  5. 连续按两次 <Esc> 键,所有选中行的行首将同时出现 #

列块插入示例
列块插入完成

这个功能在批量注释代码或格式化文本时非常高效。如果操作失误,可以按 <Esc> 退出,并在普通模式下按 u 撤销。

切换选择端点

可视模式下选中文本后,如果想调整选择范围的另一端,可以按 o 键(代表 other end)。光标会跳转到选中区域的另一端,此时移动光标即可改变起始点或结束点。再次按 o 可切回。

列块可视模式下,有四个角,按 o 会移动到对角,而按 O(大写)则移动到同一行的另一个角。

2. 可视模式进阶

可视模式的使用遵循一个清晰的流程:

  1. 标记开始:使用 v, VCtrl-v 在起始点启动可视模式。
  2. 标记结束:移动光标到目标结束位置。起始点与光标之间的文本将被高亮。
  3. 执行操作:键入一个操作符命令,该命令将作用于高亮区域。

核心命令

命令 作用
[count]v 进入字符可视模式。
V 进入行可视模式。
[count]Ctrl-v 进入列块可视模式。

可用的操作符

可视模式下,可以对选中的区域应用丰富的操作符:

~    切换大小写
d    删除
c    修改 (替换并进入插入模式)
y    复制 (抽出)
>    向右缩进
<    向左缩进
!    通过外部命令过滤
=    自动格式化代码
gq   按文本宽度重排段落

(注:标有数字的操作符行为有特定规则,详见Vim帮助文档)

文本对象选择

在可视模式下结合文本对象,可以更精准地选择语义单元:

aw / iw     一个单词(含/不含周围空格)
aW / iW     一个字串(含/不含周围空格)
ap / ip     一个段落(含/不含周围空格)
ab / ib     一个 () 块(含/不含小括号)
aB / iB     一个 {} 块(含/不含大括号)
a" / i"     一个双引号字符串(含/不含引号)

其他技巧

  • 使用寄存器:在操作符前指定寄存器,例如 "ay 将复制内容到寄存器 a
  • 指定计数:在操作符前加数字,例如选中后按 3> 会将选中区域向右缩进3次。
  • 执行Ex命令:在行可视模式下选中多行后,按 : 可以对这些行统一执行替换等命令。

3. 列块操作精讲

列块模式(Ctrl-v)提供了独特的矩形文本处理能力,掌握它们是提升Shell或配置脚本编辑效率的关键,让你告别繁琐的手动逐行调整。

列块插入 (I)

在列块选择状态下,输入 I{string}<Esc> 会在选择区域的左侧(每一行的相同起始列)插入相同的字符串 {string}。只有长度足以触及选择区域的行才会被插入。

列块添加 (A)

在列块选择状态下,输入 A{string}<Esc> 会在选择区域的右侧(每一行的相同结束列)追加相同的字符串 {string}。对于短于选择区域结束列的行,会用空格填充至该列再追加。

列块替换 (r)

选中一个列块区域后,按 r 再按一个字符(如 X),会将区域内每一个字符都替换为该字符(X),保持矩形结构不变。

实践挑战

尝试将下面表格中“name”列的所有字母改为大写:

name   Q1  Q2  Q3   Q4
pierre 123 455 234  Q4
john   0   90  39   Q4
steve  392 63  334  Q4

提示:利用列块选择选中“name”列的所有字母,然后使用 U(大写)命令。

通过系统性地练习这些可视模式操作,你将深刻体会到Vim在文本处理上的强大与高效,其设计哲学正是在于通过简洁的规则组合,应对复杂的编辑任务。

参考资料




上一篇:Linux进程地址空间探秘:为何内核必须驻留其中?
下一篇:业务宕机排查实战指南:15分钟定位问题与应急响应流程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 18:39 , Processed in 0.164581 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表