Vim中的最常用命令

本指南系统地介绍了Vim中的修改、移动、搜索、多窗口等功能的使用方法, 整合了数10个示例,旨在帮助Vim初学者快速掌握必备的Vim编辑命令。

本文提供了一份较全的常用命令查询手册,如果希望根据使用频率来学习,可来我的B站频道 观看视频教程:Vim最常用命令指南

文章结构如下:

一、修改命令(基础)
二、移动命令(基础)
三、组合编辑命令(用得贼多)
四、搜索和定位命令
五、多窗口命令
六、Visual模式
七、文件操作命令

每类命令都以示例讲解使用场景,力求深入浅出,可以作为Vim新手的实践指南,帮助各位快速上手Vim。

一、编辑命令(基础)

1. 插入(i)

在当前光标位置的字符之前进行插入。

使用方法:快捷键i

例如:

1
2
3
4
5
6
操作前: 
abc
^
操作:i test
操作后:
testabc

其中,^表示当前光标位置,后续示例中也会使用该符号表示光标位置。

2. 追加(a)

在当前光标位置的字符之后进行插入。

使用方法:快捷键a

例如:

1
2
3
4
5
6
操作前:
abc
^
操作:a ba
操作后:
ababc

3. 替换(s)

删除当前光标位置的字符,并进入插入模式。

使用方法:快捷键s

例如:

1
2
3
4
5
6
操作前:
abc
^
操作:s x
操作后:
axc

4. 行首插入(I)

在当前行的行首插入。

使用方法:快捷键Shift+i

例如:

1
2
3
4
5
6
操作前:  
include <stdio.h>
^
操作:Shift+i #
操作后:
#include <stdio.h>

5. 行尾插入(A)

在当前行的行尾插入。

使用方法:快捷键Shift+a

例如:

1
2
3
4
5
6
操作前:
int x = 1
^
操作:Shift+a ;
操作后:
int x = 1;

6. 替换整行(S)

删除当前整行,并进入插入模式。

使用方法:快捷键Shift+s

例如:

1
2
3
4
5
6
操作前:
int x = 1;
^
操作:Shift+s int y = 2;
操作后:
int y = 2;

7. 换行(o)

在当前行之下插入新行。

使用方法:快捷键o

例如:

1
2
3
4
5
6
7
操作前: 
int x = 1;
^
操作:o
操作后:
int x = 1;
// ……这是一个新行

8. 上插行(O)

在当前行之上插入新行。

使用方法:快捷键Shift+o

例如:

1
2
3
4
5
6
7
8
9
操作前:
int main() {
}
^
操作:Shift+o
操作后:
int main() {

}

9. 删除字符(x)

删除当前光标位置的字符。

例如:

1
2
3
4
5
6
操作前:
int x = 1;
^
操作:x
操作后:
int x= 1;

10. 复制、粘贴1行(yy/p)

yy复制当前行, 移动到指定位置后, p粘贴复制的内容到当前行之下(或shift+p粘贴到当前行之上)。p表示Paste,即粘贴。

例如:

1
2
3
4
5
6
7
8
9
10
11
操作前:
def __init__(self):
^
self.__startTime = time.time()
self.__endTime = 0
操作:yy j p// 复制当前行,并向下移动一行,粘贴复制的内容
操作后:
def __init__(self):
self.__startTime = time.time()
def __init__(self):
self.__endTime = 0

11. 剪切1行(dd)

dd剪切当前行, 同样可配合p进行粘贴,也可以不粘贴,就当是删除当前行。

12. 剪切1行并进入插入模式(cc)

cc剪切当前行, 并进入插入模式。等于dd + i

二、移动命令(基础)

1. 上下左右移一个字符(k、j、h、l)

使用方法:快捷键kjhl

例如右移 l:

1
2
3
4
5
6
原位置:
int x = 1;
^
操作后:
int x = 1;
^

2. 下个单词词首(w/W)

移动到下个单词的开头。

使用方法:快捷键w

例如:

1
2
3
4
5
6
原位置:
def __init__(self):
^
操作后:
def __init__(self):
^

另外,快捷键W可以跳过标点符号,只要是连在一起的字母数字字符都会被视为一个单词。
例如:

1
2
3
4
5
6
7
8
9
10
原位置:
def __init__(self):
^
self._cards = [Card(rank, suit) for suit in self.suits
for rank in self.ranks]
操作后:
def __init__(self):
self._cards = [Card(rank, suit) for suit in self.suits
^
for rank in self.ranks]

3. 本单词词尾(e/E)

移动到当前单词的末尾,如果本身就在单词末尾,则移动到下个单词的末尾。

使用方法:快捷键e

例如:

1
2
3
4
5
6
原位置:
def __init__(self):
^
操作后:
def __init__(self):
^

类似的,快捷键E可以跳过标点符号,只要是连在一起的字母数字字符都会被视为一个单词。

例如:

1
2
3
4
5
6
原位置:
def __init__(self):
^
操作后:
def __init__(self):
^

4. 本单词词首(b/B)

移动到当前单词的开头,如果本身就在单词开头,则移动到上个单词的开头。

w/W类似,快捷键b/B可以跳过标点符号,只要是连在一起的字母数字字符都会被视为一个单词。同样的概念不举例了。

5. 移动到行首(0)

将光标移动到当前行的第一个字符。

使用方法:快捷键0

例如:

1
2
3
4
5
6
原位置:
def init(self):
^
操作后:
def init(self):
^

6. 移动到行尾($)

将光标移动到当前行的最后一个字符。

使用方法:快捷键$

例如:

1
2
3
4
5
6
原位置:
def init(self):
^
操作后:
def init(self):
^

7. 移动到文件首(gg)

将光标移动到文件的第一行第一个字符。

使用方法:快捷键gg

8. 移动到文件尾(G)

将光标移动到文件的最后一行第一个字符。

使用方法:快捷键G

9. 移动到指定字符(f/F)

f向右移动到指定字符,F向左移动到指定字符。

使用方法:

  • f{char}:向前移动到指定字符
  • F{char}:向后移动到指定字符

例如:

1
2
3
4
5
6
7
8
9
原位置:
def init(self):
^
操作:f )
def init(self):
^
继续操作:F e
def init(self):
^

三、组合编辑命令(用得贼多)

把编辑命令和移动命令组合起来使用,可以实现更强大的编辑功能。

1. 删除指定区域(d)

删除当前光标位置到指定位置的字符。

使用方法: d + 移动命令

例1:

1
2
3
4
5
6
7
8
9
10
11
原代码:
def __init__(self):
self.__startTime = time.time()
self.__endTime = 0
^
操作:d $ // 删除光标位置到行尾的字符
操作后:
def __init__(self):
self.__startTime = time.time()

^

例2:

1
2
3
4
5
6
7
8
9
10
11
原代码:
def __init__(self):
self.__startTime = time.time()
self.__endTime = 0
^
操作:d 2 w // 删除光标位置到下2个单词词首的字符
操作后:
def __init__(self):
self.__startTime = time.time()
__endTime = 0 // 删除了self. 这被视为2个单词
^

例3:

1
2
3
4
5
6
7
8
原代码:
def __init__(self):
^
self.__startTime = time.time()
self.__endTime = 0
操作:d 2 d // 删除2行
操作后:
self.__endTime = 0

2. 改变指定区域©

删除当前光标位置到指定位置的字符,并进入插入模式。基本相当于d + 移动命令 + i,就不举例了。

3. i和a表示范围

我们经常遇到光标在一对符号之间的情况,比如在括号内部,或者在引号内部,具体位置无所谓,这时候可以使用ia来表示范围。i表示inside, 即符号内部;a表示around,即包括符号内部和符号本身。配合dcy等命令使用,可以快速删除、复制、修改符号内部的内容。

例1:

1
2
3
4
5
6
原代码:
def __init__(self):
^
操作:d i ( // 删除括号内部的内容,这里还可以写成d i ),效果一样
操作后:
def __init__():

例2:

1
2
3
4
5
6
原代码:
def __init__(self):
^
操作:y a ( // 复制括号内部的内容,这里还可以写成y i ),效果一样
操作后:
def __init__(self): // (self)这6个字符被复制了

四、搜索和定位命令

1. 搜索(/)

用于进入Vim的搜索模式,可以向前或向后搜索关键词。

使用: /搜索词

例如:

1
/python   -> 进入搜索模式,并匹配到第一个python

2. 向下搜索匹配(n)

在搜索模式下,可重复向下搜索匹配项。

使用: n

例如:

1
2
/python  -> 进入搜索模式,并匹配到第一个python
n -> 找到下一个python

3. 向上搜索匹配(N)

在搜索模式下,可重复向上搜索匹配项。

使用: N

例如:

1
2
/python  -> 进入搜索模式,并匹配到第一个python
N -> 找到上一个python

4. 书签功能(m)

命令 m[a-zA-Z] 命令会用选定的字母标记当前光标所在位置。 m 可以理解为 mark

使用:

  • m+标记 -> 做标记
  • `+标记 -> 跳转到标记处

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
操作前:
class StopWatch:
^
def __init__(self):
self.__startTime = time.time()
self.__endTime = 0

def start(self):
self.__startTime = time.time()

def stop(self):
self.__endTime = time.time()
操作1: ma // 将光标位置标记为 a
操作2: G // 跳转到文件最后一行
操作3: `a // 跳转到 a 标记处
操作后:光标回到原来位置

五、多窗口命令

1. 窗口拆分(vs/sp)

vs垂直拆分窗口(v表示vertical),sp水平拆分窗口。

vs的效果是将当前窗口分为两个垂直窗口,sp的效果是将当前窗口分为两个水平窗口。

2. 快速窗口跳转(Ctrl+w+w)

一般我们最多也就开个2、3个窗口,Ctrl+w+w可以在窗口间快速跳转。

六、Visual模式

Visual模式就相当于普通编辑器的选中功能,可以高亮选中文本,再进行编辑操作。

1. 进入Visual模式(v)

按下v键进入Visual模式,高亮当前光标所在字符。

2. 选中行(V)

按下shift+v键可直接选中整行。

3. 选中块(Ctrl+v)

Ctrl+v可实现块选择, 即选中一个矩形区域内的字符。

4. 编辑操作

Visual模式下选中合适的区域,配合一些编辑命令进行编辑操作, 可以批量修改选中文本。常用的组合命令举例:

1
2
3
v + d : 删除选中文本
v + y : 复制选中文本
v + c : 修改选中文本

七、文件操作命令

1. 打开文件(e)

e可以在Vim中打开指定文件。

使用 :e 文件名

2. 保存文件(:w)

:w可以保存当前文件。

3. 退出(:q)

:q可以退出vim。

一般是和:w配合使用,先保存再退出,:wq可以合并为:x

内容很长很干,慢慢练吧兄弟。