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/W
、e/E
、b/B
、ge/gE
来进行单词/词组级别的移动
w/W
用于跳到单词的首字母
e/E
用于跳到单词的末字母
b/B
与w/W
作用相反
ge/gE
与e/E
作用相反
大小写的区别在于,是否将除空格外的字符认作一个单词,用以下文本试验可知:
test,line, for motion
- 对于任意的字符(单词内部),用
f/F
、t/T
与;/,
相结合来移动是很好的手段
f <char>
用于移动到当前光标后行内第一个char
出现的位置,例如对于以下文本(用|
表示光标位置):
|test lone for f char
,键入f o
将会将光标移动到lone
的o
位置,
若要再次执行搜索,比如移动到第二个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/I
、gI
、a/A
、o/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
的转换常用 ESC
或 Ctrl-[
键
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 Mode
下 cw
会删除至单词的开头,ci{
会删除{}
内的内容
这是日常编辑中用得最多的一种编辑模式
1.4.3 移动、修改与撤销
可以看下面这个例子:
var foo = "method("+argument1+","+argument2+")";
目的是在每个+
两边各加一个空格
一个想法是用f+
移动到+
号,然后i
进入Insert Mode
,键入一个空格,回到Normal Mode
,
然后a
再键入另一个空格。然后再用;
重复上一次搜索,移动到下一个+
,再重复之前的行为。
但是这么做显然需要按过多的键,没有效率可言。究其原因是无法重复使用过去的动作
再来看看另一种编辑方法。
依次的按键:f+s + <ESC>;.;.;.
这种方法利用;
重复搜索,利用点命令(.
)來重复一次修改缓冲区的动作(s +
)
一次修改缓冲区的动作指的是 用动词+名词
修改了缓冲区的动作 或者 从进入Insert Mode
到Normal Mode
为止
做的修改,例如cw或de或x或s<someword><ESC>
详情可以看:h .
平时也可以注意一下哪些操作是可重复的
这种编辑模式也是相当有用的,用一键來移动(f/j等
),另一键來修改(往往是.
),出现意外的修改时用u
來撤销
(上面的编辑其实也可以直接用:s/+/ + /g
來替换,但是有些时候这种移动,重复的编辑模式会比直接替换更合适)
END
到这里就暂时结束。现在可以退出 Vim ,喝杯茶休息一下了 :)
:x