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