从Vim小白到Vim superstar

引言

我的图形界面环境(GUI)编辑器一直是 Visual Studio Code,而命令行环境(CLI)的编辑器一直是Vim. 我一直想写一篇关于如何使用VIM的文章,但是我感觉使用Vim首先就是应该熟练掌握它强大地命令,从而才能高效地使用这个编辑器,所以我感觉写一篇罗列各种命令的文章毫无任何意义,因此就一直拖延到现在。但是,最近看到了老外写的一篇关于Vim的文章,感觉写的太好了。就像他说的那样,一旦你读完了文章,你就可以成为 Vim 的 superstar 了。这里我不想一成不变地翻译这篇文章,但是我会按照他的思路来组织我的这篇文章,并加入一些我平时用到的一些非常方便的命令。

英文好的同学可以自己看看这篇文章,写的思路确实非常清晰。Learn Vim Progressively

在学习Vim之前,给大家一个警告。起初,学习Vim是一件非常痛苦的一件事情,你需要花很多时间来熟悉它,如果你对它不熟练,它不但不会加快你的编辑效率,反而会降低你的编辑效率。所以,大家要有耐心,把它当作是你刚刚拿到的一件神器,你需要一些时间来与它磨合,一旦你与它磨合之后,你就可以最大限度地发挥这件兵器地威力了。

学习Vim的4个阶段

按照老外那篇文章所写,学习Vim需要4个阶段。

  1. Survive
  2. Feel comfortable
  3. Feel Better, Stronger, Faster
  4. Use superpowers of vim

在下面的文章中,我会介绍这几个阶段你所需要掌握的Vim知识,但是在学习这些阶段之前,我觉得有必要介绍一下Vim的三个不同模式。

Vim的三个不同模式

在学习具体地命令之前,我们应该去理解Vim的三个不同模式。

command mode

当你用Vim命令打开要编辑的文件时,你当前所在的模式就是command模式。在这个模式下,你不能编辑你当前的文件,但是,你可以发布插入、追加、删除和许多强大的移动光标位置的命令。这些命令我会在下文中讲。

insert mode

在这个模式下,你可以像其它编辑器那样编辑自己的文本。你可以通过按[ESC]键来返回到command mode

last line mode

你只能从command mode进入last line mode,在command mode下,你输入冒号(:)就可以进入last line mode了。在这个模式下,你可以退出Vim编辑器,保存修改的文件。最cool的是你还可以执行Linux命令,下面我执行一下top命令。:!top

Survive 阶段

在这个阶段,我只要求你使用Vim能像其它的编辑器一样,可以做一些基本的操作就行。比如文件的修改,保存,退出编辑器等。上面我已经提到过,当我们进入Vim时处于command mode,因此我们需要进入insert mode才能对文件进行编辑,下面有几种进入insert mode的常用方式:

  • I 把插入光标放到行首
  • i 把插入光标放到cursor之前
  • A 把插入光标放到行尾
  • a 把插入光标放到cursor之后
  • O 在cursor所在行的上面插入一个新行
  • o 在cursor所在行的下面插入一个新行

一旦你进入到insert mode,你就可以自由地编辑文本了。编辑完文件以后需要保存这个文件,首先我们需要按[ESC]键退回到command mode,然后进入last line mode输入:wq,就可以保存文件并退出编辑器了。

在command mode下,你可以用方向健去移动光标,但是我高度建议大家用hjkl 来移动光标。提示:j 像一个向下的箭头。

Feel comfortable 阶段

学会了Survive阶段的命令,你就可以用Vim做一些基本的编辑就没问题了。那么在这个阶段,你应该去学一些更多的命令提高Vim的使用效率。

  • cw 这个命令也可以让你进入insert mode,但是它会把当前光标到单词末尾的内容剪切掉。
  • x 删除当前光标下的字符
  • dd 剪切掉当前行
  • yy复制当前行
  • p 粘贴。P.S. 你可以把剪切掉的内容粘贴到当前位置。

下面是一些快速移动光标位置的命令。

  • 0 移动光标到行头
  • $ 移动光标到行尾
  • ^ 移动光标到本行第一个不是空白字符的位置(空白字符包括空格,tab,换行,回车等)
  • g_ 移动光标到本行最后一个不是空白字符的位置。
  • /pattern 搜索 pattern 的字符串(如果搜索出多个匹配,可按n键到下一个)
  • :%s/foo/bar/g 用bar替换文本中所有的foo

如果我们编辑出错了,想撤消先前的操作,可以用如下两个命令,这2个命令是在command mode下执行的。

  • u undo
  • Ctrl + r redo

在编辑一个文件的时候,我们有可能想要打开另一个文件,或者想要保存这个被修改的文件退出编辑器。或者你也想要用Vim同时编辑多个文件,并在多个tab之间来回切换。下面的命令就可以做到这些。

  • :tabedit 文件路径 在一个新tab中打开这个文件
  • :wq 保存并退出当前的tab
  • :saveas 文件路径 把当前文件另存为指定的文件路径
  • :tabn 切换到下一个tab
  • :tabn tab号 切换到指定的tab,tab号从1开始
  • :tabp 切换到上一个tab

下面的3个命令是移动当前行在屏幕中的显示位置。

  • zz 移动当前行到屏幕的中间
  • zt 移动当前行到屏幕的顶端
  • zb 移动当前行到屏幕的底部

bonus: 当我们有tab很多时,如果我们要每次切换一个tab都需要输入这4个字母岂不是累死了。大家不要担心,Vim给我们提供了一个重复last colon命令的快捷方式。当你第一次重复的时候用@:命令,当你想进一步重复的时候你可以用@@

花点时间熟悉一下上面的命令,一旦你掌握他们了,你就几乎可以干其它编辑器都能干的事了。但是到现在为止,你可能觉得vim还是有点笨拙。但是跟我进入下个阶段后,你就会发现所有的这些笨拙都是值得的。

Feel Better, Stronger, Faster

学会了comfortable阶段的命令,相信大家可以用Vim做很多事情了。但是,大家并没有看到Vim是多么地有效率的一个编辑器。因此在这个阶段,我们介绍一些让Vim更好、更强、更快地一些命令,从而让大家感受到Vim的强大之处。

Better

首先,大家先熟悉一下下面这3个命令。

  • . (dot) 重复上一次执行的命令
  • N<command> 重复命令N次
  • Ctrl + v 进入visual-block模式,在这个模式下,可以让你同时对多行文本进行操作

下面我先给大家出个题目,大家先想一想怎么做。首先我想把“I love zhou jie lun”这句话写10次,然后把“zhou jie lun”加上引号。下面这张Gif图片是我用Silentcast画的,以供大家参考。

vim

bonus: 在练上面命令的时候,大家有可能会想要一下删掉整个文件的内容。其实要做这件事很简单,只需要2步:

  1. gg 把光标移动到第1行行首
  2. dG 删除所有行

Stronger

掌握怎样在Vim中有效地移动非常重要,不要跳过这个小节

  • [行号]G 将光标跳到指定的行号
  • G 跳到最后一行

上面的命令是关于在各个行之间的移动,接下来是单词之间的移动命令。

  • w 到下一个“单词”的开头
  • e 到下一个“单词”的结尾
  • W 到下一个“单词”的开头
  • E 到下一个“单词”的结尾

上面的单词我已经加了引号,大写与小写对单词的定义是有区别的。对于小写字母而言,一个单词由数字、字母和下划线组成。对于大写字母而言,单词与单词之间是用空白字符分隔的。比如对于下面这个字符串来说:光标的初始位置在行首,w 会跳到#号,而W会跳到w字符。

abcdefg_p3434#sdsfdf23 world is changing

下面介绍2个在写代码时非常有用的命令。

  • % 把光标跳到对应的(、{、 [
  • * 跳到当前光标下的单词,下一次出现的地方
  • # 跳到当前光标下的单词,上一次出现的地方

Faster

如果大家已经熟悉了上面的命令,那么你就可以非常快速地转换光标的位置。知道如何快速地转换光标的位置非常重要,这是因为大多数的Vim命令都支持如下的形式:

[start position] [command] [end position]

下面我来举个例子,比如下面的字符串,我想要把"IS"改成小写字母,但是我的光标位置在行首(即字符t的位置)。

the world IS changing

我们只需要用下面的命令就可以马上实现转换。

start positioncommandend position
2wgue

因此大家只要输入2wgue 这个命令就可以快速把它转换成小写字母。

组合可以千变万化,大家结合上面我讲过的命令,来尝试Vim的强大吧。对于改变大小写还有很多更快捷的方式,SO上已经有人回答了,这里我就不详细介绍了。

changing case in vim

Vim Superpowers

下面我所介绍的命令是Vim中杀手级别的特点,这也是我开始用Vim的原因。

当前行下的快速移动命令

  • f[字符] 在当前行中寻找给定字符下次出现的位置。; 会继续向前面查找,而, 号会向后面查找,有了这2个快捷方式,我们就不用每次都按f[字符] 去查找给定的字符了。
  • t[字符] 在当前行中寻找,跳到给定字符的前一个位置
  • F and T 和对应小写的功能一样,只不过查找方向相反

下面我来举个例子,比如下面的pom文件片段,假设我光标所在位置在行首(即字符<的位置),我现在想把中间的编码字符删掉。

< project.reporting.outputEncoding>UTF-8< /project.reporting.outputEncoding>

fUdt< 用这个命令就可以把它快速地删掉了。大家现在可以想想用一个普通的文本编辑器想做到这样需要多长时间。

自动补全功能

在Insert mode下,只需要输入单词的开头,然后按Ctrl + p 或者 Ctrl + n

Zone selection

它的语法格式为:

[action]a[ object] 或者 [action]i[ object]

  • 上面的action可以是dyv
  • 上面的object可以是w一个单词W 一个以空格为分隔的单词s 一个句字p 一个段落。也可以是一个特别的字符:" ' )}] >

比如下面的pom文件片段,我想选中logback.version,我的光标位置在第一个字符l那。

< logback.version>1.1.7< /logback.version>

vi> 这个命令就可以实现上面我想要的功能了。

宏录制

qa 命令会把你的操作记录到寄存器a中,接着我们可以用@a 命令去重复寄存器a中的操作。 @@ 是一种快捷方式来重复上一次执行的宏。

宏录制的格式:[qa][操作][q]

  • qa 表示开始记录
  • q 停止录制

总结

如果大家能熟练的掌握上面的命令,那么你就会感受到Vim会大大提高你的编辑效率。Vim还有很多需要探索的东西,这篇文章只不过是教你如何高效地使用它作为一个编辑器。学习Vim也是一个很痛苦的过程,你需要去慢慢适应它,每天保持用几个命令,你可以去Google一些我文章之外的命令,相信几周之后,你就可以成为Vim的superstar了。

补充

在这个小节中,把一些我知道有相应的操作,但是总忘记具体命令的,可以大大提高效率的实践放在这个小节中。

Making a list

In normal mode, enter the following to record a macro into the a register (type the characters shown, without pressing Enter). This macro yanks the current line, then pastes it below, then increments the number. Ctrl + x for decreasing by 1. Ctrl + a for increasing by 1.

qa -> Y -> p -> ctrl + a -> q

Typing 3@a to perform the macro 3 times.

delete until the next X character

f 包含查找的字符,而 t 不包含。为了方便记忆,f 补全是 find,而 t 补全是 till.

vi shortcut to delete “until the next X character”

What do the f and t commands do in Vim?

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值