Tip 20 体验可视化模式
在可视化模式下,很多命令的作用和它们在命令模式时相同.我们仍旧可以使用hjkl来移动光标.使用f{char}跳转到当前行的某个字符.然后使用;重复跳转,或者使用,反向跳转.我们甚至可以使用查找命令(包括n和N)跳转到匹配的地方.在可视化模式下,移动光标,将改变选择的范围.
虽然大多数命令一样,但是也有一些细微的差别,例如c这个命令.在命令模式下.我们使用c{motion}删除内容并进入插入模式.而在可视化模式下,在选中了部分内容时,只需要一个c就能进入插入模式,删除的内容是高亮部分的内容.这时候,这个c的作用更直观了.
下面看一个例子:
1 | March is a month |
如果要把March改为April,假设我们已经把光标放在了March这个单词上的任意位置了.那么可以通过viw选择整个单词.这时候,我们不能直接输入April,因为A会触发Vim命令.然后只会输入剩下的pril.所以,我们使用c这个命令,删除当前选择并进入插入模式.然后输入April.
遇见选择模式
在一般的编辑器中,当我们选中想要删除的文字时候,只要输入点内容,就能覆盖原来的文本,但是可视化模式没有遵循这个惯例.而选择模式是这样的.
我们可以通过<C-g>切换可视化模式和选择模式.唯一可以看到的区别就是在屏幕的底部,可视化模式是VISUAL而选择模式是SELECT.当在选择模式下输入任意可打印的字符时候,将替换,并自动进入插入模式.当然,这个功能也能通过在可视化模式下,按c来实现.Vim做这个东西的作用,应该为了更符合用户的习惯.
Tip21 定义可视化选区
可视化模式有三个不同的子模式,他们用来处理不同的可视化模式.
在字符可视化模式(character-wise Visual mode),我们可以以字符为单位选取内容.它可以是一个字符,也可以是多行.它适合于对独立的单词或者段落.
在行可视化模式(line-wise Visual mode),处理的单位是行
在块可视化模式(block-wise Visual mode),我们可以选择柱形区域
这里只是粗略一说,后面有更详细的内容.
进入可视化模式
使用v键,可以进入可视化模式.按v键,可以从命令模式,进入字符可视化模式.通过V(Shift-v),可以进入行可视化模式.通过<C-v>可以进入块可视化模式.
下面是简单的一个列举:
命令 作用
v 进入字符可视化模式
V 进入行可视化模式
gv 重新选择最后一次的选区
gv是个很好用的快捷命令.无论是什么可视化模式,gv都能应对自如.唯一可能有点问题的是:你已经删除了最后一次选区的内容.
在可视化模式中切换
下面是命令参考表
命令 作用
v 在命令模式和字符可视化模式切换
V 在命令模式和行可视化模式切换
o 把光标在选区的两端切换.
切换选区的可变端
默认选择选区的时候,一端是固定的,另一端是可以通过各种移动命令进行移动的.可以通过o这个命令切换移动端.
补充小知识:
e移动到下个单词的结尾.
Tip 22 重复行可视化模式命令
当我们在可视化模式下执行一个命令之后,我们就会进入命令模式.在可视化模式下选中的文字将取消选中.那么如果我们想对刚刚选中的文字重新执行一个可视化模式的命令该怎么办?
假设我们有下面一段python:
1 | def fib(n): |
准备工作
为了让<和>这两个命令正常工作,我们应该做下面的设置:1
:set shiftwidth=4 softtabstop=4 expandtab
缩进一次,然后重复
对于刚刚的python代码,缩进有问题,我们应该在可视化模式下选择.然后使用>这个命令缩进.但是缩进要超过两次.而执行一次刚刚的命令之后,我们就会进入命令模式.
有个解决方案是通过gv命令,然后再次执行缩进命令.但是如果你对Vim已经有了感觉,那你就应该知道这个方式是不好的.
当我们需要重复,.这个命令是一个非常好的选择.
1 | def fib(n): |
上面是通过 Vj选中两行,然后>.完成的
如果你喜欢计算,那么你可能更喜欢2>这个命令.但是我更喜欢使用.这个命令.因为这个命令可以给我可视化的反馈.我也能享受到自己键盘的反馈的乐趣.之前我们也讨论过计数和重复的取舍.你可以重新看看.
Tip 23 在可能的时候,在可视化模式下,使用操作符
可视化模式更直观,但是它有个缺点:.这个命令不能完全发挥作用.我们可以通过命令模式下的命令来搞定这个缺点.
假设我们有下面一段文字.我们想把下面链接设置为大写1
2
3<a href="#">one</a>
<a href="#">two</a>
<a href="#">three</a>
我们可以通过vit命令选中标签内部的文字,它理解为:可视化选中标签之间的文字.it命令是一种特别的{motion}命令.我们将在Tip 51进行更深入讨论.
使用可视化操作符号
在可视化模式下,我们选择一段文字,然后对它进行操作.在这个案例下,我们可以使用U命令来让选中的文字变成大写.
完成了第一行之后,如果想对第二行,第三行进行操作.应该怎么办呢?.命令可以吗?
1 | <a href="#">ONE</a> "vit |
可以看到,.命令仅仅重复了三个字符.造成了最后一行的样子.这并不是我们想要的结果.
使用命令模式下的操作符
U这个可视化模式的操作符对应了一个命令模式下的版本:gU{motion},但是在语义上有很大不同.
在可视化模式命令U的案例中,我们做了两件事:
vit选中文本U操作文本变成大写
在命令模式的案例中,我们弄了一个命令,这个命令由:gU操作和it作为{motion}.
1 | <a href="#">ONE</a> "gUit |
确实,可视化模式有局限性.但是它也很有用处.因为并不是所有编辑工作都需要重复.所以可视化模式是非常适合单次的编辑.
Tip 24 在块可视化模式下编辑表格化数据
所有编辑器都可以以行为单位编辑数据.在Vim中,块可视化模式,提供给我们以列为单位编辑数据.
假设有下面的文本
1 | Chapter Page |
我们要加点东西,让上面的文字看起来更像表格.
1 | Chapter | Page |
上面的实现步骤是:
<C-v>3j进入块可视化模式,并向下选择3行r|将选中范围替换为|- 同理,复制一行,然后替换为
=
Tip 25 改变多列文本
假设有下面一段css代码1
2
3li.one a{ background-image: url('/images/sprite.png'); }
li.two a{ background-image: url('/images/sprite.png'); }
li.three a{ background-image: url('/images/sprite.png'); }
假设sprite.png 已经从images文件夹移动到了components文件夹.我们需要修改三行来改变目录.这时候,我们就能使用块可视化模式了.
1 | li.one a{ background-image: url('/components/sprite.png'); } |
- 光标定位到images这个单词的开头.
<C-v>jje选中三列的imagesc删除单词,并进入插入模式, 输入components,然后<Esc>.
唯一一个可能造成疑惑的是,当第三步输入单词之后,只改变了第一行.但是,当按了<Esc>之后,三行都改变了.
确实Vim的这个功能有点不太人性化.但是,最终结果没有什么区别.习惯就好了
Tip 26 在参差不齐的块选区后面追加内容
假设有下面一段js代码1
2
3var foo = 1
var bar = 'a'
var foobar = foo + bar
这三行不是一样长的,假设我们想为每一行的后面添加一个, 在Tip2我们通过.完成了这个操作.其实通过块可视化区域也能完成这个任务.
1 | var foo = 1; |
<C-v>jj$选中全部A;移动到结尾,进入插入模式,并输入<Esc>完成
细心可以看出,这个操作和Tip 25差不多意思.
主要是通过$改变了矩形的结尾.
Vim关于 i 和 a 的惯例
Vim有很多从命令模式切换到插入模式的按键.i和a都能完成这个操作.i在光标前进入插入模式,a在光标后进入插入模式.I和A功能类似,是在行开头和行结尾进入插入模式.
在块可视化模式中,A和I的功能和在命令模式下类似.那么a和i呢?
在可视化模式和操作符悬停模式下,a和i有不同的意义.这个在Tip 51会有更深入的讨论.现在记得,使用A和I替代