vim实用技巧读书笔记(5)

本文介绍了Vim编辑器中可视模式的各种实用技巧,包括不同可视模式的选择与切换、利用gv命令重复选择、针对不同场景使用操作符命令以及如何高效编辑表格和列文本。
技巧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

chapterPage
Normal mode15
Insert mode31
Visual mode44

<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

这样就能完成多个地方的输入了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值