一、三种选择模式
Vi/Vim可视化模式(Visual Mode)下可以选择一块编辑区域,然后对选中的文件内容执行插入、删除、替换、改变大小写等操作,是Vim使用过程中使用非常频繁的一种模式,在表格中删除指定列非常有用。
需要注意,光标所在字符不包含在选区中。
在Vim命令模式下,输入 v 或者 V 或者 Ctrl + v 都可进入可视化模式,这三个Vim可视化模式的主要区别在于:
- 字符选择模式: 选中光标经过的所有字符,普通模式下按小写 v 进入
- 行选择模式:选中光标经过的所有行,普通模式下按 大写V 进入
- 块选择模式:选中一整个矩形框表示的所有文本,普通模式下按 + v 进入
进入Vim可视模式后,光标选中的文本区域由两个端点来标识(即左上角和右下角),默认情况下,在Vim可视化模式下移动光标是控制右下角端点的位置,当需要调整左上角端点的位置时,可以使用o键在左上角和右下角之间进行切换
二、快捷操作
2.1 快速选中目标区域
我们在普通模式博客中已经介绍了许多快速移动光标的命令,幸运的是,在可视模式下面,这些快速移动光标的命令我们都可以用。
- 通过相应的选择模式,配合h,j,k,l方向键进行选择;
- 也可以用f{char}来跳转到当前行的某个字符上面,之后再用 ;;(向后), (向前)来重复跳转;
- 或者用查找命令/target来进行光标的快速移动,再用n(向后)N(向前)进行重复
- 输入$,从当前位置选择到行尾
- 输入^,从当前位置选择到行首
举个栗子:
比如在下面的栗子里面,我们要从25行字符c开始,一直选中直到行尾
首先点击v切换到字符模式,键入fc,接着可以直接按$,这时光标会跳到行尾,字符c到行尾之间的内容就被选中了
2.2 重复选择目标区域
我们可以使用gv命令来重新选中之前可视模式选中的目标区域,但是如果之前的选中的区域文本被删除,那么会选中相同字符宽度的内容。
举个例子:
假如我们选中字符串"Hello World",然后再将"Hello World"删除,如果我们再次调用gv命令,那么选中的区域不再是之前的"Hello World",而是相同字符宽度的内容
删除"Hello World",gv选中的区域
不仅如此,就算这行文本的列数有所偏移,比如将文本多缩进了几行,再次gv发现也是不对的
所以,博主个人估计Vim底层的实现可能是记住目标区域的起始行的行数和起始列的列数,键入gv以后就根据之前保存行列信息进行还原
2.3 在选择过程中切换选择模式
可视模式有一个好处就是我们可以在三种选择模式之间进行随意的切换,比如在行文本模式下面希望进行更加细粒度的选择,我们可以直接按v切换到字符模式,同理可以得到在某一选择模式中切换到任意其他两种模式的方法。
2.4 重复上次执行过的命令
. 点命令可以重复执行上一次执行过的命令。(普通模式和可视模式均适用)
这里需要注意:在可视模式下执行操作的范围也同样会被记录,也就是说. 点命令重复执行的作用范围由上一次命令操作决定。这是一个很大的限制条件,必须这次操作的字符数(或行、块)与上次操作的字符数(或行、块)相同我们才可以放心的使用重复操作。
举个例子:
我们要将27-29的printf打印的内容全都转为大写
在27行,我们在v模式下选中引号内的东西,U将选中的内容转化为大写
如果我们下移一行,用.重复上次操作,得到
发现只作用了前两个字符,后面的llo还是小写
三、可视模式下的文本操作命令
我们不仅可以在可视模式中使用普通模式的光标移动和跳转命令,还在可视模式中使用普通模式模式下的文本操作命令。
常用的(可视模式)操作命令有:
- x或d: 剪切(即删除,同时所选的文本进入剪贴板),d 与 D 的区别:d只删除选中的字符,而D删除选中字符所在行的所有字符,
- y和Y: 复制,y只复制选中的字符,而Y复制选中字符所在行的所有字符
- p或P: 在当前位置粘贴剪贴板的内容,p 粘在光标所在字符后面,P 粘在前面。
- r字符: 所有字符替换为新字符
- c字符:修改选中的文本
- I字符:在选中文本前插入
- A字符:在选中文本后插入
- u U ~ :分别是所有字母变小写、变大写、反转大小写
- J字符:将高亮显示的文本内容合并为一行,同时以空格来分隔各行。
- >和<: 将选中字符右移或左移 shiftwidth位置
四、可视模式下的底行命令
在可视化模式下,按下 : 键就可以对选定范围进行操作。底行命令行中会自动填充‘<,’>便是选定的区域。
例如:
- 我们先在可视化模式下选中文本,然后执行
:‘<,’>write block.txt
命令,就可以将文本块写入另一文件中。 - 选择多行,然后执行
:‘<,’>sort
命令,则可以对选中的文本进行排序。 - 选中一块文本区域,然后执行
:‘<,’>s/{替换目标}/{替换内容}/{替换的标志}
命令,在选中的区域内进行批量替换。
提示:当执行完命令以后,VIM 将回到普通模式:
五、在可视模式下解决实际问题
5.1 Vim同时在多行末尾加;
假设main函数的头三行代码忘了加;号,现在我们要用可视模式为这三行代码加上分号;
首先开启块选择模式,然后输入指令jj$选择到这三行末尾,选中区域如下所示
再输入A指令在选中的区域后面添加文本;,虽然在编辑的过程中只有一行文本看上去添加了分号,如下图
但是只用按下,剩下的其余选中行也会自动添加分号,这里与其他编辑器稍有不同,新手应注意
5.2 Vim同时修改多行内容
下面是一个打开四个文件标识符的栗子
如果我们已经将四个文件file1,file2,file3,file4移动到了新的目录/tmp/fileDir里面,于是我们要将testDir目录改为fileDir目录
进入块选择模式,并选中testDir区域,如下图
点击c对选中区域进行替换,并输入fileDir
跟之前的栗子一样,只有一行文本发生改变,点击使改变作用于全部选中区域
5.3 Vim同时注释多行
使用Vim可视化模式可以很方便地操作多行文本内容,比如一次性注释多行文本,可以如下操作:
(1) Ctrl + v进入块选择模式
(2) 向上或向下移动光标选择多行
(3) 移动光标到行的起始位置(或输入指令^)
(4) 然后按大写 I 进入行首插入模式
(5) 插入注释符
(6) 按Esc回到命令模式
需要注意的是:Vim同时编辑多行时,只有在当前的插入动作结束后(按Esc退为命令模式),之前选中的其它行才会出现同样插入的文本。
5.4 Vim同时取消多行注释
如果想一次性取消多行注释,则可以这样做:
(1) Ctrl + v 进入块选择模式
(2) 向上或向下移动光标,选择要删除的注释符号
(3) 按d键删除