技巧21 选择高亮选区
vim有三种可视模式,在面向字符的可视模式中,我们能够选择任意的字符范围.不论它是单个字符,还是位于一行内,或是跨若干行的指定字符范围.都没问题.该模式适用于操作单词或短语.如果我们想对整行进行操作,我们可以改用面向行的可视模式.而面向列块的可视模式则允许我们对文档的列块进行操作.列块可视模式非常特别.
激活可视模式
v键是通往可视模式的大门. 按v可以激活面向字符的可视模式.
按V(v和shift 一起按)可以激活面向行的可视模式,而按(v和Ctrl 一起按)则可以激活面向列块的可视模式.
参见下表中的汇总:
命令 用途
v 激活面向字符的可视模式
V 激活面向行的可视模式
<C-v> 激活面向列块的可视模式
gv 重选上次的高亮选取
gv命令是一个有用的快捷键,它用来重选上次由可视模式所选择的文本范围.不管上个选区是面向字符的,面向行的,或是面向列块的,gv命令总能正确地工作.如果上次的选取被删除了,它也许会工作的不太正常.
在可视模式间切换
如果当前在面向字符的可视模式,我们可以按V来切换面向行的可视模式,或是<C-v>来切换到面向列块的可视模式.然而,如果在面向字符的可视模式中再次按v,就会回到普通模式.所有你可以把v键当成普通模式及面向字符的可视模式间的转换开关.V及<C-v>键也一样可以在普通模式及其对应的可视模式间切换.当然了,你总是可以按<Esc> 或
技巧22 重复执行面向行的可视命令
当使用.命令重复对高亮选取所做的修改时,此修改会重复作用于相同范围的文本.在本节中,我们会对一个面向行的高亮选取做一个修改,然后使用.命令重复此修改.
在可视模式中执行完一条命令后,我们就返回普通模式,并且在可视模式中选中的文本范围也不再高亮显示了.那么,如果我们想对相同范围的文本执行另外一条可视模式命令,该怎么办?
举例:
def fib(n):
a,b = 0,1
while a < n:
print a,
a,b = b,a+b
fib(42)
这段代码的每级缩进使用4个空格.
首先需要对vim进行配置.使之符合此缩进风格.
-
准备工作.
要想让< 和 > 命令正常工作,我们需要把”shiftwidth” 及 “softtabstop” 的值设置为4,并启用”expandtab”选项.
下面的一行命令会完成上述设置:
- set shiftwidth=4 softtabstop=4 expandtab
先缩进一次,然后重复
在这段错误的python代码中,while关键字下面的两行应该多缩进两级.我们可以高亮选择这两行.然后用>命令来对它进行缩进.以修正其缩进错误.
要解决这个问题,一个办法是使用gv命令重选相同的文本,然后再次调用缩进命令,然而,如果你已经对vim解决问题的方式有所领悟,你的脑海中应该会敲响警钟.
当需要执行重复操作时, .命令是最佳的解决方案,与其手动重选相同范围的文本并执行相同的命令,倒不如直接在普通模式里按.键.下面是具体的操作:
举例:
def fib(n):
a,b = 0,1
while a < n:
print a,
a,b = b,a+b
fib(42)
>. 先缩进一下,用.再缩进一下
在使用.命令重复一条可视模式命令时,它所操作的文本数量和上次被高亮选中的文本数量相同.对于面向行的高亮选取来说,这种做法往往符合我们的需要.但是对于面向字符的高亮选区来说,这却会产生令人意外的结果,接下来通过一个例子来说明一下.
技巧23.只要可能,最好用操作符命令,而不是可视命令
举例:
<a href="#">one</a>
<a href="#">two</a>
<a href="#">three</a>
我们可以用vit来选择标签里的内容,vit可以被解读为高亮选中标签内部的内容,其中,it命令是一种被称为文本对象(text object)的特殊动作命令.
vit
U
j.
j.
上面的命令,执行到最后一个的时候,我们发现当一条可视模式命令被重复执行时,它会影响相同数量的文本.在本例中,最初的命令影响了一个由三个字母组成的单词.第二行它依旧工作得很好,因为该行恰好也包含一个由三个字母组成的单词.但是,当我们想对一个由5个字母组成的单词重复此命令时,它只成功转换了其中的3个字母,留下2个字母未被转换.
使用普通模式下的操作符命令
<a href="#">one</a>
<a href="#">two</a>
<a href="#">three</a>
可视模式下的U命令有一个等效的普通模式命令.gU{motion}
gUit
j.
j.
这两种方式都只需要四种按键操作,vitU,gUit,但其背后的含义却大相径庭.在可视模式所采用的方式里,这四个按键可以被当做两个独立的命令,vit用来选中选区,而U用来对选区进行转换,与之相反的是,gUit命令可以被当成是一个单独的命令,它由一个操作符(gU)和一个动作命令(it)组成.
技巧24 用面向列块的可视模式编辑表格数据
在任何编辑器中,我们都可以操作以行为单位的文本,但以列为单位进行文本操作就需要更为专业的工具了.vim面向列块的可视模式就提供了这种能力.我们可以用它来对纯文本表格进行转换.
举例:
visual_model/chapter-table.txt
| chapter | Page |
|---|---|
| Normal mode | 15 |
| Insert mode | 31 |
| Visual mode | 44 |
<C-v>3j
x...
gv
r|
yyp
Vr-
一开始,我们先使用进入列块可视模式,然后向下移动光标,选中一列文本,然后按x删除此列,并用.命令重复删除相同范围的文本,多重复几次直到距右边差不多有两列的距离.
我们也可以不用.命令,而是把光标向右移动两三次,把列选区扩展为块选区,然后只需要删除一次即可.
现在,我们已经把所需的两列文本排列到了合适的位置,接下来就可以在这两列文本中画一条竖线了,我们先用gv命令重选上次的高亮选区,然后输入r|,用管道符替换此选区内的字符.
到了这一步,我们或许也想画一条横线来分割表头以及其下的内容,我们先快速地复制顶行并粘贴一份副本(yyp),然后再用字符替换行内的所有字符(Vr-)
技巧25 修改列文本
用列块可视模式可以同时朝若干行中插入文本,列块可视模式不仅仅对表格数据有用,在编程的时候,我们也受惠于此功能.
visual_model/sprite.css
li.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/目录,那么就需要修改每一行的内容,使其指向该文件的新位置.我们可以使用列块可视模式完成此工作.
操作.
<C-v>jje 选中images
c 进入插入模式 Insert mode
components Insert mode
<Esc>
Normal mode
这样就能完成多个地方的输入了.
本文介绍了Vim编辑器中可视模式的各种实用技巧,包括不同可视模式的选择与切换、利用gv命令重复选择、针对不同场景使用操作符命令以及如何高效编辑表格和列文本。
8128

被折叠的 条评论
为什么被折叠?



