vim 入坑指南(四)— 文本处理流程

这一篇,我们要补充一些简单操作,然后说说如何在 vim 中做到 DRY (don’t repeat yourself)。首先,我们先介绍一下如何向 vim 寻求 帮助

vim 帮助文档

在命令行中输入 help 即可进入帮助目录:

如果有 “明确” 的问题,比如某个键的功能是什么,或者想看某个概念的详细说明,也可以直接在命令行里查询相关文档,比如:

  1. 如果忘记了 j 这个键是干嘛的,可以通过 :help j 查询
  2. 如果忘记了 模式 这个概念,可以通过:help vim-modes 查询

我们也可以查询之前提到的 operator 和 motion,还有 text-objects:

1
2
3
:help operator
:help motion
:help text-objects

另外,我也会在关键词 里放上相关的 帮助 命令以供查询。

搜索

在 vim 中搜索文本十分容易,直接按下 / 键后输入要找的文本就好了。比如我想在当前文本搜索 test 的这个词,按下 /test

假设文本中有多个 test

  • 按下 n (next) 会移动到下一个 test
  • 反之则用 N

撤销和重做

在 vim 中,按下 u (undo) 是 撤销Ctrl + r 是重做。这一对操作比较容易,一试便知。

滚动文本

较常用的一对操作是 Ctrl + d 是向下 (down) 滚动文本,而 Ctrl + u 是向上 (up) 滚动文本。

Don’t Repeat Yourself. Let vim repeat it for you

vim 之所以好用,很大部分原因在于它能够替你去做 “重复功”,而且简单得有点粗暴,就一个键:. (好吧,非常粗暴)。话不多说,直接来演示一下。

假设我有四行 Python 代码,很明显,其中有两行需要缩进:

1
2
3
4
if "vimpress" in ["vimpress", "rocks!"]:
print "vim rocks!"
else:
print "vim rocks anyway!"

于是,我们会把光标移至第一个 print 处,然后按下 >>:

在这之后,我们可以很熟练的(通过 2j)把光标向下移动两行,然后按一下这个神奇的键:.

很快,不是么?我们不仅节省了一次按键(>> 要按两次,而 . 就一次),而且也保护了手骨的健康(除非你输入 > 是用两只手的)。当然,这个例子还不是很明显,再提供一个难一点的例子。

假设我想把 HTML 中所有 class="vimpress" 的标签:

1
2
3
<div class="vimpress">
<div>some stuff</div>
</div>

都变成这样

1
<div class="vimpress"> Vim Rocks </div>

很容易,就这么几步:

  1. 搜索 vimpress
  2. 找到标签后,通过 文本对象 更改标签,cit (change inner tag),输入替换内容
  3. 通过 n 移动到下一个标签,然后重复 .

Macro 宏

vim 也自带有宏录制的功能,对于大量重复的操作,可以利用这个功能把一系列动作记下来,然后让 vim 去重复执行。录制 Macro 十分简单,按下 q 后跟任何以字母就可以了,比如 qaqa 代表把之后的动作录制成 Marco 然后标记成 a。也就是说你可以同时录制很多 Macro,qa, qb, qc

好了,直接上例子,假设我有如下一段 vimrc,我想把每一行首个词都变成 test。由于首词长短不一,参差不齐,不能用 visual-block 解决。这种情况下,录制一个 Macro 就可以了。

1
2
3
4
5
6
7
8
9
10
11
set number
set relativenumber
set smartcase
set autoread
map j gj
map k gk
nnoremap <c-h> g0
nnoremap <c-l> g$
nmap <F2> :set nowrap! <cr>
nmap <c-s> :w!<cr>
nmap <leader>w :w!<cr>

假设光标在首行第一个词 set 处,按下 qa 开始记录:cw (change word) 然后输入 test,回到 normal mode 后移光标至下一行行首,再按下 q,录制结束。

接下来我们想让 vim 替我们执行 10 遍,按下 10@a (10 Macro a) 就好了。

Snippets 模板

Snippets 的作用就是利用提前写好的模板来加速我们的文字输入。如果你经常要输入同一段文本,那么你应该考虑把它做成一段 snippet,下次使用时直接调出。比如,经常要在代码作业前加上个人信息什么的:

1
2
3
// Homework: XXX
// Author: my name
// Description: XXX

如果要使用 Snippet 的话,我们就要借助插件了(终于要说到插件了)。vim 有许多 Snippet 插件可以选择,目前 V 字君使用的是 Ultisnips,之后我单独拿一篇出来讲这个插件(不出意外的话,每个插件都会是单独一篇)。在这里我们就是简单展示一下。

简单来说,灵活运用 .,Macro,以及 Snippet 会让你的效率会越来越高,而且你投入的时间越多(尤其是 Snippet),回报也会越大。

终于要说到插件了

好了,这一篇就这说这么多。目前为止,基本的 vim 操作都略有涉及,完整的处理流程也基本介绍完了。下一篇,我们要开始介绍 vim 的设置 (即 vimrc 里放什么),以及介绍第一个插件:vim-plug

VZJ wechat
欢迎您扫一扫上面的二维码,订阅 V 字君的微信公众号。