跳到主要内容

vim编辑器

设计理念

学习vim之前,先知道其设计理念是很重要的,不仅有助于记忆,而且还能举一反三。

vim命令的设计理念是组合(Composeability)

例如:"d" 表示删除,"j" 移动到下一行,组合 "dj" 表示删除当前行和下一行。

模式及其切换

vim是模式编辑器,有六种基本模式,六种附加模式。其中,附加模式是基本模式的变体。

vim最常用的有三种模式:普通模式(Normal Mode)、插入模式(Insert Mode)、视觉模式(Visual Mode)。

本文不区分普通模式、命令模式抑或是“底线命令”模式(Command Mode/Command-line Mode/Cmdline Mode)。关于vim模式的更多信息,请翻阅 Vim documentation: vim_faq4.4. Where can I read about the various modes in Vim? 章节。

命令助记作用
[Esc]-切换到普通模式
iinsert在光标前插入
aappend在光标后插入
oopen(open a new line)下方另起一行在行首插入
I-在行首插入
A-在行尾插入
O-上方另起一行在行首插入
vvisual进入行选视觉模式
[Ctrl]v-进入列选视觉模式

移动光标

移动光标是入门vim的第一关。各式各样的移动指令和其他命令相组合,是vim强大能力的来源。

单字符移动

基本的上下作用移动,vim使用k/j/h/l来实现。J可以看作向下的箭头。k在j的旁边,即为向上。h与l分列两边,分别为向左、向右。此外,向下移动一个字符,作为使用频率最高的一个命令,放在j键是很合理的。

命令作用
j向下移动一个字符
k向上移动一个字符
h向左移动一个字符
l向右移动一个字符

短距移动

部分命令可以移动到一些特殊位置。

命令助记作用
^-移动到行首
$-移动到行尾
wword(forward one word)移动到下一个单词的词首
bbackward(backward ont word)移动到上一个单词的词首

跨行移动

输入数字进行组合可以移动多行或者移动到指定行。

命令作用
[n]-向上移动n行
[n]+向下移动n行
:[n]移动到第n行
[n]G移动到第n行
gg移动到文件的首行
G移动到文件的末行

g相对特殊,其移动光标的命令看起来凭空出现。StackExchange有相关的解释,相关大意翻译在了下方,更多信息请参看附录。

g类似“命名空间”(namespace)。设计vi时,有很多操作(比如去文件的开头/结尾,或者去特定某行)比较有用,因此非常必要为这些操作创建命令。

但单键命令最多只有95个,这些命令的使用频率并没有高到需要分配单键命令。因此,g作为“命名空间”给这些命令提供了入口。与之相似的还有命令

翻页

翻页操作依靠Ctrl实现。

命令助记作用
[Ctrl]fforward向上移动一页
[Ctrl]bbackward向下移动一页
[Ctrl]uup向上移动半页
[Ctrl]ddown向下移动半页

搜索并移动

可以使用t/f来查找字符进而移动到指定位置。

命令助记作用
t[c]toward向后查找,将光标移动到字符c的前一个字符
f[c]find向后查找,将光标移动到字符c
T[c]-向前查找,将光标移动到字符c的前一个字符
F[c]-向前查找,将光标移动到字符c

删除、复制与修改

命令助记作用
x-删除一个字符
ddelete删除(需组合)
yyank复制(需组合)
cchange修改(需组合)

关于yank为何是复制,请参看附录,部分解释摘录如下。

yanking 是 Vim 中拷贝命令的名字。由于 "c" 已经被用于表示 change 了,所以拷贝 (copy) 就不能再用 "c" 了。但 "y" 还是可用的。把这个命令称为 "yanking" 是为了更容易记住 "y" 这个键。

(译者注: 这里只是把原文译出以作参考,"抽出" 文本毕竟是不妥的。)

其中,修改操作实际上就是删除操作和进入编辑模式的组合。

以下是一些常见的删除命令组合,复制命令与修改命令以此类推。

命令作用
dd删除一行
dw删除一个单词
:[m],[n]d删除[m,n]
d^删除到行首
d$删除到行尾
dt[c]删除到字符c

需要注意的是,vim没有“剪切”命令。Vim中的删除类似Windows中的剪切,会将删除的内容复制到Vim的"剪切板"中。

粘贴、撤销与恢复

命令助记作用
ppaste粘贴
uundo撤销
[Ctrl]rrecovery恢复

查找与替换

查找

命令作用
/[pattern]向后匹配pattern
?[pattern]向前匹配pattern
n移动到下一个匹配项
N移动到上一个匹配项

其中pattern为正则表达式。

替换

基本格式:

:s/[pattern]/[substitute]/[option] 

s意为substitute,命令作用为将匹配pattern的内容替换为substitute,只会替换第一个匹配项,替换所有匹配项需添加g选项,g意为globally。

以下是几个常用的组合:

1)  :s/pattern/substitute  
只会替换光标所在行的第一个匹配项
2) :s/pattern/substitute/g
替换光标所在行的所有匹配项
3) :[m],[n]s/pattern/substitute/g
替换[m,n]行的所有匹配项
4) :%s/pattern/substitute/g
替换全文的所有匹配项

视图模式常见用法

批量注释

1)  [Ctrl]+v 进入竖选模式
2) 选择范围
3) 输入I
4) 输入//
5) 输入[ESC]

文件、多文件与多窗口

文件基本操作

vim保存文件的方式是将buffer中的内容写入文件。基本命令如下:

命令作用
:w保存
:q退出
:q!强制退出(不保存)
:wq保存并退出

务必注意:[Ctrl]s不表示保存,而是表示冻结终端。输入此命令后终端界面冻结,但所有操作依然生效。[Ctrl]q可以退出此状态。

多窗口

命令作用
:split (:sp)水平分割
:new水平分割
:vsplit (:vsp)垂直分割
:vnew垂直分割
[Ctrl]ww切换窗口
:wall保存所有修改过的窗口
:qall退出所有窗口
:only保留当前窗口,关闭其他所有窗口

多窗口打开新文件:

:sp newtext
:vsp newtext

多文件

启动时打开多文件:

$ vim file1.txt file2.txt

启动后打开新文件:

:e newtext

切换与查看文件:

命令作用
:n移到下一个文件
:N移到上一个文件
ZZ保存当前文件更改
:buffer查看缓冲区内的文件
:buffer [n]切换到文件n

使用:e打开的文件无法使用n或N命令切换,必须使用:buffer

附录 参考文献与链接

  1. Vim documentation: vim_faq
  2. VIM Editor Commands
  3. 为什么在 vi 的世界, 拷贝都使用 yank 这个词, 而不是 copy? - Dictionaryphile的回答 - 知乎
  4. vi - Wikipedia
  5. VIM User Manual
  6. Linux vi/vim | 菜鸟教程
  7. What is the meaning of 'g'?
  8. English mnemonics to Vim's shortcuts
  9. 如何使用Vim编辑器编辑多个文件
  10. 其他资料