跳转至

Vim 使用

Vim 是一个开源自由的、基于终端的文本编辑器(text editor)。

这是 Vim 系列的第一篇,在本文中我们会专注 Vim 的使用

1. Vim 的使用

1.1 终端命令

大多数情况下我们用 vim [filename] 打开 Vim 或用 Vim 编辑文件,

若在类Unix系统内,command | vim - 亦是常用的技巧。

1.2 获取帮助☆

  • Vim 内置的文档 通过 :h <keyword> 获取,如 :h digraph-table(可以使用tab进行补全)
  • Vim 内置的用户手册 :h usr_??.txt ?? 为两位数字,可以用tab来补全

1.3 编辑模式

以下内容仅作手册之用,不建议一开始就细看

  • Vim 与其它大多数编辑器不同的一点是 Vim 有着多种编辑模式。
  • 可以使用 h vim-modes 查看介绍
  • 可以通过左下角的标识来判断当前所在的模式(-- VISUAL -- / -- SELECT --)

1.3.1 Normal Mode

在命令行用 Vim 打开文件后,我们默认处于 Vim 的 Normal Mode

在此模式下我们只能进行移动或者执行删改相关的命令,而不能从键盘中输入。

我们仍然可以使用键盘上的上下左右键进行移动,

但是更推荐使用 Vim 的方式: h j k l 分别代表 左 下 上 右

使用它们可以确保手指不会离开键盘的中心区域,提高编辑效率。

另外还有几组移动相关的键位:

在行内:

  • 我们常用w/We/Eb/Bge/gE来进行单词/词组级别的移动

w/W 用于跳到单词的首字母

e/E 用于跳到单词的末字母

b/Bw/W作用相反

ge/gEe/E作用相反

大小写的区别在于,是否将除空格外的字符认作一个单词,用以下文本试验可知:

test,line, for motion

  • 对于任意的字符(单词内部),用f/Ft/T;/,相结合来移动是很好的手段

f <char>用于移动到当前光标后行内第一个char出现的位置,例如对于以下文本(用|表示光标位置):

|test lone for f char,键入f o将会将光标移动到loneo位置,

若要再次执行搜索,比如移动到第二个o的位置,只需再键入;即可,而要反向搜索,使用,

t/T类似f/F,但只移动到搜索到字母的前一位,与删除相关的命令结合时很有用。

在整个文本内:

  • 常用Ctrl-u/Ctrl-d进行半屏的上下移动
  • 或者用<num> h/j/k/l进行重复num次的左/下/上/右移动
  • 亦或用/<string>回车利用搜索进行移动

1.3.2 Insert Mode

讲完移动,终于可以开始输入了。

输入在 Vim 的 Insert Mode 进行。

Normal Mode下,我们常用i/IgIa/Ao/O进入 Insert Mode

i 表示在当前光标前插入 I 在当前行第一个非空字符前插入

gI 表示在当前行第一个字符前插入

a 表示在当前光标后在插入 A 在当前行最后一个字符后插入

o/O 表示在当前行的下方/上方新起一行插入

还有两个特殊些的动词 c/C s/S

c 要与其它 Normal Mode 下移动的键组合,比如ce cw

C 表示从光标当前位置删除到行末

s 表示删除当前光标下的那个字符

S 表示删除当前行

1.3.3 Visual Mode

Vim 的 Visual Mode 类似一些编辑器的鼠标选中,但要更精细些

Vim 的选中分三种:

  • 字符级别的选中

Normal Mode 下,用v进入

这种选中类似鼠标选中

  • 行级别的选中

Normal Mode 下,用V进入

与字符级别选中不同,行级别选中后无论是移动还是执行动作,操作都是以行为单位的

  • 块级别的选中

Normal Mode 下,用Ctrl-v进入

选中以行列为单位,整体一般情况下是矩形

你可以用一切能在 Normal Mode 移动的键来扩展你的选中区域,

并对选中的区域执行一些动作,比如删除(x)、替换(r <char>)等

1.3.4 模式之间的转换

Normal Mode 到其它模式的转换在之前各模式的介绍里已经提及

从其它模式到 Normal Mode 的转换常用 ESCCtrl-[

1.4 Vim 编辑的哲学

1.4.1 总是回到 Normal Mode

不应该长时间停留在 Insert Mode 或其它模式,应该总是习惯性地回到 Normal Mode

1.4.2 动词+名词

Vim 大多数情况下使用的编辑命令都是 动词 + 名词 的形式

动词 指的是形如 c d gU 等单个命令没有任何效果的操作符待决模式命令

名词 指的是 Normal Mode 下的移动命令(h/j/k/l w/W等)或者文本对象(i{ at等)

例如 Normal Modecw 会删除至单词的开头,ci{ 会删除{}内的内容

这是日常编辑中用得最多的一种编辑模式

1.4.3 移动、修改与撤销

可以看下面这个例子:

var foo = "method("+argument1+","+argument2+")"; 目的是在每个+两边各加一个空格

一个想法是用f+移动到+号,然后i进入Insert Mode,键入一个空格,回到Normal Mode

然后a再键入另一个空格。然后再用;重复上一次搜索,移动到下一个+,再重复之前的行为。

但是这么做显然需要按过多的键,没有效率可言。究其原因是无法重复使用过去的动作

再来看看另一种编辑方法。

依次的按键:f+s + <ESC>;.;.;.

这种方法利用;重复搜索,利用点命令(.)來重复一次修改缓冲区的动作(s +)

一次修改缓冲区的动作指的是 用动词+名词修改了缓冲区的动作 或者 从进入Insert ModeNormal Mode为止

做的修改,例如cw或de或x或s<someword><ESC>

详情可以看:h . 平时也可以注意一下哪些操作是可重复的

这种编辑模式也是相当有用的,用一键來移动(f/j等),另一键來修改(往往是.),出现意外的修改时用u來撤销

(上面的编辑其实也可以直接用:s/+/ + /g來替换,但是有些时候这种移动,重复的编辑模式会比直接替换更合适)

END

到这里就暂时结束。现在可以退出 Vim ,喝杯茶休息一下了 :)

:x

评论