简介
Vim是一个高度可配置的文本编辑器,主要用于编写和编辑文本和源代码。它最初由Bram Moolenaar在1991年发布,至今已经成为了许多程序员和系统管理员的首选工具。
Vim的特点包括:
高度可配置:Vim具有大量的命令和选项,可以根据用户的需求进行定制。
命令模式(COMMAND):Vim在默认情况下处于命令模式,用户需要通过键盘输入命令来进行文本编辑。
插入模式(INSERT):在插入模式下,用户可以输入文本内容。
普通模式(NORMAL):普通模式是Vim的默认模式,可以进行光标移动、删除字符等操作。
(补充)可视模式(VISUAL):允许用户以可视方式选择和操作文本。Visual 模式有三种类型:
- 字符模式(Visual mode):用于选择字符。
v
命令进入。 - 行模式(Visual Line mode):用于选择整行。
V
命令进入。 - 块模式(Visual Block mode):用于选择文本块(矩形区域)。
ctrl+v
命令进入。 - 可以与
p, y, d, c, r, <, >, ~, gU, gu
等命令组合使用。
- 字符模式(Visual mode):用于选择字符。
大量快捷键:Vim具有大量的快捷键,可以提高编辑效率。
宏记录:Vim支持宏记录,可以录制一系列键盘操作并重复执行。
插件支持:Vim支持大量的插件,可以扩展其功能。
在Linux和Unix系统中,Vim通常已经预装。Windows系统则需要手动安装。对于初次使用Vim的用户,建议先学习一些基础操作命令,并通过互联网上的资源来深入了解它的使用方法和高级功能。
提示:
阅读本文需要有一定的vim了解,还要拥有vim环境,并且你应该一边阅读,一边实操。
如果你觉得本教程啰嗦,你可以运行
vimtutor
学习官方提供的tutor教程。有的vim版本是中文教程。如果你的不是可以网上搜索。备用(1.7中文版)(下载之后用vim打开阅读)。当然强烈建议你学习完本教程之后去过一边
vimtutor
,它可以让你边学边练。
史上最好用的文本编辑器VIM
对于vi/vim只是点评一点:这是一个你不需要使用鼠标,不需使用小键盘,只需要使用大键盘就可以完成很多复杂功能文本编辑的编辑器。不然主流IDE也不会有vim插件,如:jetbrains全系列都支持的ideavim插件。
学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。
vim的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的。
下面的文章翻译自《Learn Vim Progressively》,我觉得这是给新手最好的VIM的升级教程了,没有列举所有的命令,只是列举了那些最有用的命令。非常不错。
警告:
- 学习vim在开始时是痛苦的。
- 需要时间
- 需要不断地练习,就像你学习一个乐器一样。
- 不要期望你能在3天内把vim练得比别的编辑器更有效率。
- 事实上,你需要2周时间的苦练,而不是3天。
将常用命令总结为四个步骤:
- 存活
- 感觉良好
- 觉得更好,更强,更快
- 使用VIM的超能力
当你走完这篇文章,你会成为一个vim的 superstar。
vim常用命令总结
第一级 – 存活
在Normal模式下【用vim正常打开的文件都会进入该普通模式】的常用命令:
|
|
注意:
块光标,所在的位置由头部决定。头部就是光标所在位置。
光标后是指隔一个字符,就是块光标的尾部。
删除命令都会将删除的存到剪切板里,但只有vim命令删除的,粘贴p命令才能粘贴(与vim版本有关)。
- 如果要粘贴系统的剪切板内容用
shift+insert
:将在光标处粘贴系统剪切板内容。- 其他可能终端需要进入INSERT模式。
- 注意不同的终端启动不同的vim版本,p粘贴命令效果可能不一样。删除命令有的会进剪切板,有的不会,但是p能粘贴。
- 我的环境:ideavim插件。
- 补充:(后面学习之后知道:粘贴效果是与默认寄存器有关系)
- 如果要粘贴系统的剪切板内容用
粘贴命令在粘贴一行内容时(ideavim):
- 如果光标所在位置是空行,将粘贴到该行。p与P效果一样
- 如果光标所以位置不为空行,p将粘贴到下一行,P将粘贴到上一行。
- 也就是以行为单位:p:在光标后粘贴,P:光标处粘贴。
Windows版本vim粘贴命令行,无论是不是空行,p会粘贴到下一行,P会粘贴到上一行。
你能在vim幸存下来只需要上述的那几个命令,你就可以编辑文本了,你一定要把这些命令练成一种下意识的状态。于是你就可以开始进阶到第二级了。
在命令模式【输入:
进入该模式,输入的命令都需要敲回车】下的常用命令(扩展):
|
|
第二级 – 感觉良好
vim常用命令(难度一下就上来了):
|
|
很好,花点时间熟悉一下上面的命令,一旦你掌握他们了,你就几乎可以干其它编辑器都能干的事了。但是到现在为止,你还是觉得使用vim还是有点笨拙,不过没关系,你可以进阶到第三级了。
注意:
c
命令是一个组合命令,与d命令类似,都是删除命令,区别是c命令使用之后会进入insert模式:C
与D
命令一样,从光标位置删除到行尾部,区别D不会进入insert模式。cc
清空光标所在行并进入insert,与dd
区别:不会删除该行,只是清空到剪切板。w
光标移动到不同类字符的头部(对空格字符会忽略,就是移动到下一个单词的开头),- 有大写命令,移动字符范围更广。就是对同类型字符判断更广。
cw
从光标处删除到不同类字符的头部(不会忽略空格字符)。dw
会忽略空格。- 推荐使用
de
。
- 推荐使用
ciw
删除光标所在的同类字符,并进入insert模式。diw
不会进入insert模式。caw
删除光标所在的同类字符,并删除后面的所以空格。- 这种类型,都是删除一个单词,但是不能与e组合。如cae。三个的不能与e组合,用w。
e
移动到不同类字符的尾部(忽略空格字符),如果自身不在同类字符的尾部会先移动到尾部,在往下跳转。- 注意:尾部是指光标在同类字符的最后一个单词前面。
ce
删除单词并进入insert模式。
c0
从光标位置删除到行头部。c$
从光标位置删除到行尾部。- 当然也可以组合
c^
,cg_
。
- 当然也可以组合
ct字符
删除光标到第一个指定字符之间的字符(删除到指定的字符),并进入insert模式。%
会在最近括号之间来回跳转。d%
光标在括号上,会删除括号及括号内的内容。
- 意味着d命令也可以和上面组合,区别就是不会进入insert模式。
- 前面加数字表示重复几次。
2w
光标移动两次不同类字符。注意w命令没有其他命令组合时会忽略空格。加数字也会忽略。2dd
类型删除两行。2cc
删除之后进入insert模式。
- 前面加数字表示重复几次。
y
命令也是一个组合命令,用于与复制相关的命令。需要配合其他命令使用,如::yy
复制光标所在行。3yy
表示连续复制三行。
yw
复制到不同类字符的前面,不会忽略空格。空格属于字符(就是复制一个单词)。yiw
复制所在的字符,就是复制完整单词。yaw
复制完整单词包括单词后面的空格,不包括前面的,不能与e组合。
y0
: 从光标位置复制到行头,y^
不包括空格。y$
: 从光标位置复制到行尾,yg_
不包括空格。v
进入可视模式之后移动光标,选择文本之后,y
命令可以复制选中的文本,自动返回normal。c
会进入insert模式。- 意味着前面的组合命令都可以与visual模式配合使用。
yt字符
从光标位置复制到指定字符之间的字符。y%
如果光标在括号上,将复制括号及括号内的内容。
u
命令相对于ctrl+z
撤销命令:u
命令会将光标移动到最近修改的地方,如果光标所在位置正是最近修改的地方,将执行撤销操作。(与vim版本有关,有的直接撤销)U
撤销对当前行的所有更改,以行为单位,撤销到insert之前的状态。部分vim版本不能使用。ctrl+u
:- normal模式下:光标向上移动半页。
- insert模式下:与Emacs模式一样。
- command模式下:与Emacs模式一样,但是不会删除
:
。
第三级 – 更好,更强,更快
先恭喜你!你干的很不错。我们可以开始一些更为有趣的事了。
这里你将会学到以下常用vim常用命令:
|
|
补充(这部分可以最后在看,或看vimtutor在来):
r字符
:替换光标后的字符为指定字符。R
连续替换光标后的字符。esc退出。:r 输入流
可以提取文件(指定路径),或者输入流的内容到光标位置后面,如::r !ls
:将在光标后插入ls
命令的输出。- 用于提取文件内容到光标后
输入 :s/old/new/g 可以替换光标所在行的old字符串为new字符串。g表示替换区全部,没有只替换第一个
要替换两行之间出现的每个匹配串,请 输入 :#,#s/old/new/g 其中 #,# 代表的是替换操作的若干行中首尾两行的行号。 输入 :%s/old/new/g 则是替换整个文件中的每个匹配串。 输入 :%s/old/new/gc 会找到整个文件中的每个匹配串,并且对每个匹配串提示是否进行替换。
:!外部命令
执行外部命令,如:!ls
,支持所有的外部命令。vim支持保存一个文件的部分内容:
- 进入可视模式之后,选中要保存的部分,然后按 : 字符。将看到屏幕底部会出现 :’<,’> 。在后面输入另存为文件命令即可
w 文件名
。
- 进入可视模式之后,选中要保存的部分,然后按 : 字符。将看到屏幕底部会出现 :’<,’> 。在后面输入另存为文件命令即可
在命令模式下,可以使用
tab
键补全命令,ctrl+d
显示能补全的命令。ctrl+u
清空光标前的字符,除了:
。
f字符
光标向前移动到指定字符前。F字符
反向。t字符
光标向前移动到指定字符的前一个字符前。T字符
反向。- 在使用这个两个命令之后
;
光标跳转到下一个相同字符,,
上一个。
gf
将光标所在行文本内容作为文件打开,会自动光标当前文件(前提已经保存)。H
光标移动到光标去过的屏幕最高行,L
屏幕的最低行。(与版本有关)J
删除末尾的换行符,ctrl-j
换行、回车的意思,(重要)寄存器中用^J
表示。K
查看光标所在单词的man
页面。(ideavim不支持)
b
与w
命令反向。B
范围更广。ge
与e
命令反向。
ctrl+u
normal模式下光标向上移动半页。ctrl+b
光标向上移动差不多一页。ctrl+f
向下移动一页。ctrl+d
向下移动半页。M
光标移动到屏幕中间。(
向上移动到句子的开头)
向下移动到句子的开头
{
向上移动到段落的开头。}
向下移动到段落的开头。
da(
删除括号及括号内的内容。括号可以换成", ', (, ), {, }, [, ].
中的一个,删除对应的括号。di(
删除不包括括号。括号可以换成", ', (, ), {, }, [, ].
中的一个,删除对应的括号内容。i不包括括号,a包括括号。
>>
向后缩进光标所在行。<<
反向缩进.
命令重复上一次命令。(部分命令不可重复:如2j
)
gU移动光标命令
选中的字符转大写。gu移动光标命令
选中的字符转小写~
将光标后的字符大小写互转,可以选中多个互转。
在insert模式下
ctrl-o
会临时进入Normal模式,执行别的命令之后会,自动返回insert模式。- 可用于删除光标后的单词继续编辑:如:
ctrl-o de
- vi模式中不可以使用。
- 可用于删除光标后的单词继续编辑:如:
在insert模式下:
ctrl-w
向光标前删除到同类字符。忽略空格,就是删除一个单词。ctrl-u
全部删除。
ctrl-h
等同于退格键。vim在insert模式下没有提供向后删除字符的命令
第四级 – Vim 超能力
你只需要掌握前面的命令,你就可以很舒服的使用VIM了。但是,现在,我们向你介绍的是VIM杀手级的功能。下面这些功能是我只用vim的原因。
其实是对上面的命令再次复习😂(不在解释其作用,如果你还看不懂,证明练得还不够。):
|
|
补充:
<motion>i<option>
、<motion>a<object>
根据动作(motion)、范围(i、a)操作对象(object)。motion动作:常用:d, c, v, y,
i与a的区别:
- 对于空格i会忽略,a会保留后面的使用空格。
- 其他字符:i不包括,a包括。
object:操作对象,常用:
- w:一个单词。
- s:一个句子(不包括缩进、前后空白)。
- p:一个段落(包括缩进,前后空白)。
- 其他字符:
", ', (, ), {, }, [, ].
注意:是向后搜索包裹光标的对象。没有,只有
"
对象会向内查找。
示例:假设你有一个字符串
(map (+) ("foo"))
.而光标键在第一个
o
的位置:vi"
→ 会选择foo
.va"
→ 会选择"foo"
.
vi)
→ 会选择"foo"
.va(
→ 会选择("foo")
.
v2i)
→ 会选择map (+) ("foo")
.v2a)
→ 会选择(map (+) ("foo"))
.
光标在
a
位置:vi"
→ 会选择foo
.va"
→ 会选择"foo"
.vi)
→ 会选择map (+) ("foo")
.va(
→ 会选择(map (+) ("foo"))
.v2i)
、v2a)
两个无法选中,不会向内查找。- 只有
"
会。并不考虑数量。v2i"
→ 会选择foo
, 与vi"
等效。
- 只有
可视(VISUAL)模式操作:
ctrl+v
进入可视模式的块模式(Windows占用,用ctrl+q
代替)。v
字符模式,V
行模式。- 以上模式可以配合其他移动动作使用,如
0
,ctrl+f
,$
方便选择。如:- 选择多行,
J
命令批量移除选择行的换行符。 - 向后缩进
>
选中的文本,<
向前。- 选中之后
=
自动给缩进。
- 选中之后
- 选择多行,
- 块模式还可以批量修改多行。典型的操作,如:
- 添加注释:
0 ctrl+v ctrl+d 选中要注释的 I # ESC
- 注释只能用行首插入。
- 末尾添加分号:
$ ctrl+v ctrl+d 选择要修改的 A ; esc
- 添加注释:
- 注意:只有块模式可以批量修改。并且只有在块头或者块尾可以修改。
自动补全:
- 在insert模式下,输入一个词的开头,然后按
ctrl+n
orctrl+p
自动补全就出现了。 - 如果有多个,n是下一个,p是上一个。
- 在ideavim中是代码提示。
- 选中之后,继续输入,不用回车确定。ideavim代码中需要回车确定。
- 具体看情况。
- 在insert模式下,输入一个词的开头,然后按
标记
在 Vim 中,m
命令用于设置标记(mark)。标记是 Vim 提供的一种功能,用于在文件中记住特定的位置,以便以后快速跳转到这些位置。标记可以是局部标记(仅在当前文件中有效)或全局标记(在所有文件中有效)。以下是 m
命令的详细使用方法:
设置标记:
- 设置局部标记:
- 操作:在普通模式下,按
m
然后按一个小写字母(例如a
)。 - 例子:按
ma
在当前光标位置设置标记a
。
- 操作:在普通模式下,按
- 设置全局标记:
- 操作:在普通模式下,按
m
然后按一个大写字母(例如A
)。 - 例子:按
mA
在当前光标位置设置全局标记A
。 - 在ideavim中会有高亮。
- 0-9字符也表示全局标记。
- 操作:在普通模式下,按
m
命令是:mark 标记字符
的快捷键。- 区别是
m
会记录光标的列位置,:mark
不会,它的列号始终为0。 - 所以
:mark
跳转只会到标记行的头部。不会跳转到标记行光标的位置。 - 一般使用
m
。
- 区别是
- 注意:
- 标记字符只有一个。
- 标记字符常用的字母、数字。其他的部分能用。不用考虑。
- 标记信息包括标记字符、光标的行号、列号以及行的文本内容。
- 后续设置存在的标记会覆盖。
- 标记字符只有一个。
跳转到标记:
' 标记字符
:自动跳转到标记行的行头。`` 标记字符`:自动跳转到标记行的光标位置。
'a
:跳转到局部标记a的行头。``A`跳转到全局标记A所在行光标的位置。
跳转标记的开头如何有空格,都会忽略。
查看标记:
:marks
:显示所有已设置的标记及其光标位置、行文本内容。- 使用
:mark
标记的行,光标的列号为0。所以`` `也只能跳到标记行头。
删除标记:
删除指定标记:
:delmarks ...标记字符
- 后面可以跟多个标记字符,用不用空格隔开都行。如:
:delmarks ab
删除标记a
和b
。 - 还可以删除范围内标记:如:
:delmarks a-d
删除标记a
到d
。
- 后面可以跟多个标记字符,用不用空格隔开都行。如:
删除所有标记:
:delmarks!
注意该命令只能删除用户设置的所有本地标记,并且内置的特殊标记、全局标记不能删除。如
', <, >
。(我快崩溃了😭)上面的三个内置特殊标记,不建议用来做标记。他们具有特殊的含义。
他们是动态生成的内置特殊标记,无法删除。
含义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
'< # 可表示上次visual模式选择的行头。还可表示标记的行头。 '> # 可表示上次visual模式选择的末尾的行头。还可以表示标记的行头。 `< # 可表示上次visual模式选择开始的位置。还可表示标记行鼠标的位置。 `> # 可表示上次visual模式选择的末尾。还可表示标记行鼠标的位置。 不用他们做标记。通常用在visual模式中,会动态自动生成。 例子: :'<,'>y 复制上次选择的内容。 :'<,'>d 删除上次选择的内容。 '' # 跳到光标上次所在的行头。 配合标记可以实现来回两个标记行头之间跳转 `` # 跳转到光标上次所在的确切位置(行和列)。 配合标记可以实现来回两个标记光标确切位置之间跳转 意味着:` ' 做的标记会随时改变。不用他们做标记,会动态自动生成。
类似命令:
Ctrl-o
:跳转到上一个位置。Ctrl-i
:跳转到下一个位置。
全局标记需要指定标记字符才能删除。
Vim 内置的特殊标记是 Vim 自动管理的,用于记录特定的编辑位置和选择范围。这些标记不能手动删除,因为它们是为特定功能设计的,并且在相应操作时会动态更新。用户可以删除自己设置的标记,但不能删除这些内置特殊标记。
寄存器
在 Vim 中,寄存器(register)是一个临时存储位置,用于存储和检索文本、命令、宏等。寄存器的使用可以大大提高编辑效率。以下是对寄存器的详细介绍和使用方法:
寄存器的分类:
Vim 中有多种类型的寄存器,每种类型都有特定的用途:
- 无名寄存器(
"
)Unnamed Register:- 默认寄存器,所有的删除(
d
)、复制(y
)、粘贴(p
)操作都与此寄存器关联。缓存最后一次操作内容。
- 默认寄存器,所有的删除(
- 具名寄存器(
a
到z
和A
到Z
)Named Register:- 用于存储用户指定的文本或宏。
- 小写字母(
a
到z
):覆盖存储。 - 大写字母(
A
到Z
):追加存储。
- 剪贴板寄存器(
*
或+
)selection and drop:- 用于与系统剪贴板交互。二者可以画等号,区别:
*
:与选择剪贴板(primary selection)交互(在 X Window 系统中)。+
:与系统剪贴板(clipboard)交互。
- 数字寄存器(
0
到9
)numbered:- 自动存储最近的删除文本。
0
:最近的复制(yank
)操作。1
到9
:最近的删除(delete
)操作,1
是最新的,9
是最旧的。
- 读取(命令)寄存器(
:
):- 存储最近的命令行输入。
- 搜索寄存器(
/
)last search pattern:- 存储最近的搜索模式。
- 小删除寄存器(
-
)small delete:- 用于存储小于一行的删除操作。
- 黑洞寄存器(
_
)black hole:- 丢弃写入其中的任何内容,不对其进行存储。
- 表达式寄存器(
=
)expression:- 允许你输入数学运算进行计算。
- 只能在Insert和Command模式使用,且部分版本不支持。
- 如:insert模式下:
ctrl-r =2+2 enter
结果为4。
- 只读寄存器read only:
- 命令寄存器
:
- 点寄存器
.
:上次insert模式插入的文本内容。 - 搜索寄存器
/
- 当前文件名寄存器
%
- 上一个文件名寄存器
#
- 这些寄存器都只能读。
- 命令寄存器
使用寄存器:
查看寄存器内容:
:reg
或:registers
:查看所有寄存器的内容。- 例子:输入
:reg
查看所有寄存器的内容。
- 例子:输入
:reg {register}
:查看指定寄存器的内容。- 寄存器可以有多个,用不用空格隔开都行。
:reg 01 2
查看寄存器0, 1, 2的内容。 - 例子:输入
:reg a
查看寄存器a
的内容。
- 寄存器可以有多个,用不用空格隔开都行。
引用寄存器:
- 在Nomal模式下寄存器可以通过在名字前加双引号来引用。例如,我们可以通过
"a
来访问在a
寄存器中的内容。 - 在Command或Insert模式下寄存器可以通过
ctrl-r 名字
来引用。- 注意在这两个模式下引用的寄存器会立即输出其存储的内容。
- 在Nomal模式下寄存器可以通过在名字前加双引号来引用。例如,我们可以通过
复制到寄存器:
"{register}y{motion}
:复制文本到指定寄存器。- 例子:输入
"ayiw
将当前单词复制到寄存器a
中。
- 例子:输入
粘贴寄存器内容:
"{register}p
或"{register}P
:粘贴寄存器内容。p
在光标后粘贴,P
在光标前粘贴。- 例子:输入
"ap
将寄存器a
的内容粘贴到光标后。
删除到寄存器:
"{register}d{motion}
:删除文本并存储到指定寄存器。- 例子:输入
"adiw
删除当前单词并将其存储到寄存器a
中。
- 例子:输入
录制宏。
注意事项:
无名寄存器:是默认的寄存器。d、c、s、x,y,p这些操作的文本,都在
""
无名寄存器中(存储最后一次操作内容)。除非修改默认寄存器。- 意味着删除的可以使用p命令粘贴,因为默认从无名寄存器取值。
- 默认寄存器如果是无名寄存器,p粘贴命令不能粘贴剪切板内容。要引用剪切板寄存器
*
或+
才能粘贴。 - 自然在vim中复制、删除的也就不能进剪切板。需要指定剪切板寄存器。
数字寄存器:用于存储最近复制、删除的内容,删除的要以行为单位才会存储,否则删除的存储到
-
寄存器。复制的不影响。复制用0存储。复制的只有0和无名寄存器存储。后者很快失效。
删除用1-9存储。数字越大,删除的时间越久。
- 意味着指定寄存器,可以访问删除的内容:
1
"2p # 粘贴第二条删除的内容。
数字寄存器不可以被自定义的具名也就是字母寄存器替代。
具名也就是字母寄存器存在的意义是固化需要频繁剪切的内容,不会因为操作频繁被覆盖。
我们一般操作具名寄存器:复制,粘贴,删除。
寄存器只可以覆盖,不可以删除,由vim自身管理生命周期。不是永久存在。
可跨文件使用。
寄存器的意义:
首先,寄存器是可以跨文本文件使用的,只有有删除动作都会自动记录到1-9数字寄存器,0存储复制动作,而这些寄存器是动态的,会变化的,如果操作动作很多,有一些操作是需要频繁使用的,那么,使用自定义具名寄存器会大大的提高我们的效率,因为字母寄存器是不会改变的,除非你删除了这个寄存器。
再次,我们如果有某些文件误修改了,或者有非法入侵,如果恶意闯入者没有删除所有寄存器的内容,我们有可能追踪到它的修改轨迹。
最后,多说一句,寄存器的生命周期是很长的,即使服务器重启什么的,只要能正常进入系统,寄存器里的内容都是一直存在的。
Vim 的寄存器功能强大而灵活,通过熟练掌握寄存器的使用,可以极大地提升编辑效率。寄存器不仅可以用于基本的复制和粘贴,还可以存储宏、命令等,更好地管理和重用编辑内容。
宏录制
在 Vim 中,宏是一组记录的按键序列,可以重复执行以自动化重复性的任务。以下是使用宏的详细步骤和相关命令:
宏录制其实就是记录宏到寄存器(都是在普通模式下开始、结束):
q{register}
:在Normal模式下,开始录制宏到指定寄存器。- 例子:按
qa
开始录制宏到寄存器a
中。
- 例子:按
开始录制之后可以任意执行vim命令。进行你希望录制的所有按键操作。Vim 会记录这些按键。
- 例子:输入一系列编辑命令,如插入文本、删除文本、移动光标等。
q
:结束录制宏。@{register}
:执行存储在寄存器中的宏。- 例子:按
@a
执行寄存器a
中的宏。 - (ideavim目前不支持执行宏)
- 例子:按
@@
:重复执行上一次执行的宏。多次执行宏:
- 操作:在普通模式下,输入一个数字,然后按
@
和寄存器字母键。10@@
执行10上次执行的宏。
- 例子:按
10@a
将宏a
执行 10 次。
- 操作:在普通模式下,输入一个数字,然后按
编辑和查看宏
- 查看宏内容:
- 操作:在普通模式下,输入
:reg
查看所有寄存器的内容,包括宏。 - 例子:输入
:reg a
查看寄存器a
的内容。
- 操作:在普通模式下,输入
- 编辑宏内容:
- 操作:将宏内容复制到一个缓冲区进行编辑,然后将其粘贴回寄存器。
- 例子:
- 输入
:let @a='your edited macro'
,将'your edited macro'
替换为编辑后的宏内容。 - 或者,先用
:put a
将寄存器内容粘贴到缓冲区,编辑后用:let @a=join(getline(1, "$"), "\n")
保存修改。
- 输入
实例1:
假设你想录制一个宏,用于在每行的末尾添加一个分号:
- 开始录制:
- 按
qa
开始录制宏到寄存器a
。
- 按
- 进行操作:
- 按
$
移动到行尾。 - 按
a;
在行尾插入分号。 - 按
Esc
退出插入模式。 - 按
j
移动到下一行。
- 按
- 结束录制:
- 按
q
结束宏录制。
- 按
- 执行宏:
- 按
@a
执行宏,在当前行末尾添加分号并移动到下一行。
- 按
- 多次执行宏:
- 按
10@a
执行宏 10 次,每次在行末尾添加分号并移动到下一行。
- 按
ctrl-a
会对光标所在数字加1.
示例2:
在一个只有一行且这一行只有“1”的文本中,键入如下命令:
qaYp<C-a>q
解释:
qa
开始录制。Yp
复制行并粘贴。<C-a>
增加1。q
停止录制。
@a
→ 在1下面写下 2
@@
→ 在2 正面写下3
现在做 100@@
会创建新的100行,并把数据增加到 103.
通过使用宏,你可以在 Vim 中有效地自动化重复性任务,提高编辑效率。录制、执行和编辑宏的灵活性使得它们成为强大的工具,适用于各种编辑场景。
分屏
在 Vim 中,分屏(split screen)功能非常强大,允许你在同一个 Vim 会话中同时查看和编辑多个文件或同一个文件的不同部分。以下是 Vim 分屏操作的详细介绍:
分类:
- 水平分屏:命令:
:sp [file]
or:split [file]
:- 指定文件水平分屏,没有指定为当前文件。
- 快捷键:
ctrl+w s
- 垂直分屏:命令:
:vsp [file]
or:vsplit [file]
:- 指定文件重置分屏,没有指定默认为当前文件。
- 快捷键:
ctrl+w v
操作(最后一个快捷键可以分开按):
- 分屏窗口跟普通窗口一模一样,可以执行vim的所有的命令。
- 分屏的窗口还可以继续分屏。
- 切换到其他窗口
ctrl+w w
不同分屏窗口之间来回切换。Ctrl-w h
:切换到左边的窗口。Ctrl-w j
:切换到下面的窗口。Ctrl-w k
:切换到上面的窗口。Ctrl-w l
:切换到右边的窗口。
- 调整窗口高度(部分vim版本不起作用):
Ctrl-w +
:增加当前窗口高度。Ctrl-w -
:减少当前窗口高度。Ctrl-w =
:使所有窗口等高。ctrl-w _
:最大化当前水平窗口。ctrl-w |
:最大化当前垂直窗口。
- 调整窗口宽度:
Ctrl-w >
:增加当前窗口宽度。Ctrl-w <
:减少当前窗口宽度。
- 关闭当前窗口:
:q
或:quit
:关闭当前窗口。- 快捷键:
Ctrl-w c
或Ctrl-w q
。
- 关闭其他窗口:
:only
:关闭除了当前窗口之外的所有窗口。- 快捷键:
Ctrl-w o
。
- 交换窗口位置:
Ctrl-w r
:旋转窗口布局。
- 拆分到标签页:
:tab split
:在新标签页中水平分屏当前文件。:tab vsplit
:在新标签页中垂直分屏当前文件。- 我测试二者效果一样,就是将指定文件,默认当前文件拆分到标签页中。跟浏览器标签页类似。
- vim打开多个文件,默认不会分屏,是以多窗口的方式打开,可以使用
bn, bp
切换。-o[n]
选项:指定打开的分屏窗口数量,默认n为1个,默认水平分屏。- 可以不用指定n,根据后面的文件数来确定分屏。
- 如果n与文件数不等,n有几个就分几屏,多出的文件到分别一个完整的窗口中。
-O
垂直分屏。后面有几个文件,就几个垂直分屏。(n与文件数相等的情况)。不等分屏数由n决定,多的文件分别单独一个窗口。
结束语
上面是作者最常用的90%的命令。
我建议你每天都学1到2个新的命令。
在两到三周后,你会感到vim的强大的。
有时候,学习VIM就像是在死背一些东西。
- 官方建议:要在使用中学习,而不是在记忆中学习。
幸运的是,vim有很多很不错的工具和优秀的文档。
运行vimtutor直到你熟悉了那些基本命令。
其实在线帮助文档中你应该要仔细阅读的是
:help usr_02.txt
.你会学习到诸如
!,
目录,寄存器,插件等很多其它的功能。
学习vim就像学弹钢琴一样,一旦学会,受益无穷。
扩展
更多内容参考vim-introduction。
目录操作
Vim 自带的 netrw
插件提供了文件浏览器功能,可以用来浏览、操作目录和文件。
打开目录浏览:
1 2 3
:Explore :Ex # 简写
- 会关闭当前文件。
- 用vim移动命令移动,回车打开文件或命令。
:q
退出浏览。
在垂直分屏窗口中打开目录浏览器:
1 2 3
:Vexplore :Vex # 简写
- 分屏命令都可以用。
在水平分屏窗口中打开目录浏览器:
1 2 3
:Sexplore :Sex # 简写
浏览指定目录:
1 2 3
:Explore /path/to/directory :Vex /path/to/directory
部分vim版本不带该目录浏览插件。