Vim实用技巧-1

背景

时光荏苒,转眼又回到了Vim的世界里,我决心将此前《Vim实用技巧》一书看完,以慰寡淡之生活,读本书之开始,是基于此前所定计划「深度Vim工作者」,尽管Python的学习步履维艰,但还是知道没得办法,迟早又要回头,既然实在不想看,那么就值此反感之间隙,摸一摸别的。

内容

vim中显示行号

1
2
3
4
5
6
7
8
# 在文件中执行命令
:set number

# 或者执行命令
:set nu

# 或者修改home下的配置文件.vimrc,追加内容
set nu

撤销修改

1
Ctrl + r

修改大小写

vim中当一个操作符命令被连续调用两次时,它会作用于当前行,但是有一个除外,即gU。

1
2
3
4
5
6
7
gU: 将指定区域全部转换为大写
gu:将指定区域全部转换为小写
g~:将指定区域的大小写进行转换

如:
gUaw:表示将当前光标的单词全部转化为大写
gUU:表示将当前光标所在行单词全部转换为大写

你也会发现,上述的操作并没有作用到最小单元:字母。

1
2
# vim使用~可以将当前光标所在的字符转为其对应的大/小写

屏幕绘制

除了寻常的H、M、L切换光标在窗口的位置方式外,还可以重回当前窗口的内容

1
2
# 将当前光标的所在行居于屏幕中央
zz

内容复制、修改

普通模式下,除了yy之类,还可以通过其他方式在一行中快速复制想要的内容

1
2
# 快速复制当前光标到下一个,之间的内容
yt,

有时,我们需要重复选择前一次选中的内容

1
gv

而有时我们需要跨多行对内容进行修改,此时可以使用块选择操作符

1
2
3
4
5
6
7
8
9
10
11
# 启动块选择以后,移动选择区域
Ctrl + v

# 执行修改命令,在行首/行尾修改
I/A

# 也可以选中单词进行修改
w + c

# ESC退出选择
ESC

命令行

在vim中每一个常见指令都可以找到与其对应的命令,命令的格式大致如下:

1
:{start},{end}命令 [action]

在{start}, {end}中常用的标识符如下:

1
2
3
4
5
6
7
.:表示当前行
$:表示文档最末尾
%:表示文档中所有行
<':表示选中区域的左侧起始位置
>':表示选中区域的右侧起始位置
/<html>/:表示文档中标志的内容位置,当有/内容时,可用\/表示
/<html>/+1:表示根据定位的位置产生偏移

每次执行命令后,:都会记录下我们最后一次执行的命令,同时默认缓存区会缓存下20条历史命令,当我们需要重复执行最后一次执行的命令的时候:

1
2
3
4
5
# 初次重复执行最后一次执行的命令
@:

# 当再次需要重复执行的时候
@@

与操作指令类似,在命令行中有查看、复制、移动、替换的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看指定行的内容
:{start},{end}p

# 复制粘贴命令,对应:y。
:{start},{end}t {address}
# :2,5t 6 --> 表示将第2~5行内容复制到第6行下

# 移动命令
:{start},{end}m {address}
# :2,5m 6 --> 表示将第2~5行内容剪切到第6行下

# 替换, g表示一行多个匹配,c表示确认替换
:{start},{end}s/old/new/gc

# start、end不填默认为当前光标所在行

同样vim对于批量操作有着更为高级的命令normal,它可以一次性直接对选定的区域执行相同的操作指令

1
2
3
4
5
6
:{start},{end}normal [操作命令]

# :2,19normal A; --> 将第2到19行的行后都加上;

# 由于当执行normal命令时,它会自动的将光标移动到行首,所以在行首插入命令时,直接使用i和I效果都是一样的
:2,19normal i# --> 将第2到19行的行首加上#

可能你也会恐惧命令集的多,为此可以在输入命令的时候,通过如下方式获取vim的智能提示

1
2
3
4
5
6
7
8
# 会展示出所有的匹配命令
Ctrl + d

# 依次循环补足匹配的指令
tab

# 反向循环补足匹配的指令
Shift + tab

有时,我们必须将vim文本中的内容输入到命令行中,如替换文本指令,这个时候手敲自然显得不那么高明,vim也为我们提供了快捷的方式

1
2
3
4
5
# 在命令行状态下,复制当前光标所在的单词
C-r + C-w

# 在命令行状态下,复制当前光标所在的字符串
C-r + C-a

同样,有时我们需要对历史命令进行编辑重组成新的命令,然后执行,如果手动敲一遍不免有点繁琐,vim其实也提供了历史命令编辑功能

1
2
3
4
5
6
7
8
9
10
11
12
13
# 进入历史命令窗口
q:

# 编辑命令同普通模式下的编辑一样
a/i/A/I

# 记录一个特殊指令:J。它可以删除当前行的换行符,将当前行与下一行进行合并

# 退出历史命令窗口
:q

# 多个连贯的指令可以通过|来链接,譬如将当前行复制,然后将复制的内容中2003替换为2004
:t. | s/2003/2004/g

在vim作业中,很多时候需要切换回bash状态下去执行命令,比如修改配置文件中的路径,很多时候就必须要出去检查配置的是否准确。为此,vim中提供了shell指令,但是一般并不使用它,而是采用另一种解决方案:

1
2
3
4
5
6
7
8
# 执行一次命令
:! [cmd]

# 需要执行多次命令,则将vim作业挂起,直接切换回bash shell
Ctrl + z

# 执行完毕后回vim作业
fg

vim命令的另一个高明之处在于其直接可以调用外部linux命令对vim中指定的内容进行筛选作业

1
2
3
4
5
# 将指定区域的内容直接
:{start},{end}! [cmd]

# 譬如将csv文件中的内容按照第二行进行排列
:2,$!sort -t',' -k2