💻【Linux】Vim 入门笔记
- 📺 视频分享:VS Code × Vim
- 为什么要学习 vim
- 为什么要写这篇文章
- 学习资源
- 术语说明
- 符号说明
- 入门
- 标准模式 / 插入模式
- 执行命令:
:<command>
- 退出 vim:
:q
/ZZ
- 保存文件:
:w
/:w <filename>
- [M] 基本移动:
h
/j
/k
/l
- [M] 前往第一行 / 最后一行:
gg
/G
- [M] 前往第 n 行:
nG
、:n
- [M] 向右移动一个单词:
w
/e
- [M] 向左移动一个单词:
b
- [M] 移动到前一个单词的末尾:
ge
- [M] 前往当前行第一个 / 最后一个字符:
0
/$
/_
/^
- [E] 删除字符:
x
/X
- [E] 删除单词:
dw
- [E] 删除当前行:
dd
- [E] 在当前位置后面插入:
a
- [E] 在当前行开始 / 末尾插入:
I
/A
- [E] 在当前行下面 / 上面插入新行:
o
/O
- [E] 改变大小写:
~
/gu
/gU
- [F] 移动到下一个指定字符:
f<target>
- [E] 撤销 / 重做:
u
/<Ctrl> + r
- 中场休息:vim 的一些模式
- 进阶
- 高级
- 其他工具 Vim 化
- 总结
- 附录 1:速查表
- 附录 2:vim 命令
📺 视频分享:VS Code × Vim
最近,我在 VS Code 中深度使用了 Vim 插件。Vim 快捷键基本代替了所有的鼠标操作,极大提升了我的编码效率。因此,我做了一期视频分享。
在下面的视频中,我分享了 VS Code 和 Vim 的快捷键、如何在实际编码场景中使用 Vim、以及如何配置 Vim 的快捷键映射。欢迎大家一起交流!
查看目录和时间戳
- 00:00 为什么不用 Vim 编辑器,而是要在 VS Code 中使用 Vim 插件?
- 03:00 VS Code 的常用快捷键
- 08:19 Vim - 移动 / Normal Mode
- 20:15 Vim - 编辑 / Insert Mode
- 28:29 Vim - 复制粘贴
- 31:10 Vim - 选择 / Visual Mode
- 36:08 Vim - 其他 / Inside & Around
- 41:43 VSCode × Vim 实际编码过程演示
查看思维导图
为什么要学习 vim
最近遇到在服务端编辑代码文件、查日志的场景比较多,所以想要系统学习一下 vim。
Vim 对于每个服务端开发人员都不陌生,这可能是我们接触最多的 Linux 软件。所有类 Unix 的系统(Linux、Mac)都安装了 vim。当我们通过终端操作文本时,vim 或许是我们唯一的选择。
然而,vim 的使用方式和我们所熟悉的可视化编辑器完全不同,它的的快捷键是如此奇怪,不易上手。因此除非兴趣使然,我们很少会主动学习 vim。它的上限够高,下限也足够低,只需要掌握最基本的操作:↑↓←→
、i
、<ESC>
、:wq
,就可以覆盖大部分使用场景。那为什么还需要再深入学习 vim 呢?
主要原因是:用较少的学习成本,换来较大的效率提升。Vim 常用的几个快捷键,可以在手指不离开键盘热区的情况下快速定位光标或编辑内容,这些内容的学习成本并不高。如果你开发运维的过程中和 vim 打交道的次数越来越多,掌握这些技巧可以极大的提升开发效率。即使现在没有需求,也可以提前上手这个强大的工具。
为什么要写这篇文章
现有的 vim 教程 / 文章大多直接罗列完整的 vim 快捷键列表,让人不知从何下手。我认为应当先掌握最重要的、最高频的快捷键,满足日常开发所需;其他低频使用的快捷键,可以作为一个速查表按需查看,vim 的进阶用法也可以之后再深入研究。
因此,我尝试作为一个 vim 初学者,总结 vim 主要和次要的快捷键,同时提供一些学习 vim 的资源。
注意:在阅读本文时,你随时可以在终端执行 vimtutor
,打开一个教程文本文件,尝试某个快捷键或命令。
学习资源
- Missing Semester - 3. Vim 编辑器:非常推荐的课程,所有内容都很有帮助
- Mastering Vim:讲解 vim 里的“编程语言范式”,整体理解 vim
- The Vim Tutorial Part One - Youtube, Part Two:看英文字幕比较吃力的话,可以直接看本文
- vimtutor:安装 vim 后自带的教程,在终端执行
vimtutor
即可打开,mac 系统下是中文文档
- Vim Adventure:以游戏的方式学习 vim
这里顺便再推荐一些可视化学习资源:
- 数据结构与算法:Data Structure Visualization、Visualgo
- 正则表达式:regexper
- Git:Learn Git Branching(强烈推荐)、Visualizing Git
术语说明
vim 中有一些术语:
- mode:标准模式 normal、插入模式 insert、可视模式 visual 等。
- verb:vim 里执行的操作,比如删除
d
、修改c
、拷贝y
、查找f
等。verb 后面需要跟一个 motion,表示该操作生效的范围。 - motion:vim 里移动的范围,比如向右一个字母
l
、向下一行j
、向右一个单词w
等。本文中有时候也称其为 “range”。
💡 如果你对 vim 的语法感兴趣,可以阅读这一篇文章:https://learnvim.irian.to/basics/vim_grammar
符号说明
标题的前缀:
[M]
:移动类,move[E]
:编辑类,edit[F]
:查找类,find
入门
标准模式 / 插入模式
- 标准模式(Normal Mode):进入 vim 的默认模式,这个模式下按下任何键不会实际输入到文本中,按下
:
可以执行命令 - 插入模式(Insert Mode):在标准模式按下
i
进入插入模式,此时可以输入文本;按下<ESC>
退出插入模式
💡 除了以上两个模式,vim 还有 visual mode,用来选择一个范围的文本。
建议配置 jj
退出插入模式,这样左手不需要移动到最左上角去按下 <ESC>
。在标准模式下执行:
imap jj <Esc>
可以将这条命令写到 vim 的配置文件中。我实际上是把 jj
/ kk
/ jk
/ kj
都配成了退出插入模式。
执行命令::<command>
按下 :
后输入命令,按回车执行。如 :set number
会显示行号。
退出 vim::q
/ ZZ
:q
/:quit
:退出 vim,不作任何改动:q!
:退出 vim,丢弃已有的改动:wq
:保存更改(write)并退出(quit)vimZZ
:等同于:wq
,这个快捷键输入比:wq
更快,注意是大写Z
保存文件: :w
/ :w <filename>
:w
:保存更改:w <filename>
:保存到一个新的文件
[M] 基本移动:h
/ j
/ k
/ l
使用 h
、j
、k
、l
而不是 ←
、↓
、→
、↑
,这能够避免将手指移出键盘热区再移回来。如果有必要的话,甚至可以禁用方向键,来强制自己使用 h
、j
、k
、l
:
map <Left> <Nop>
map <Right> <Nop>
map <Up> <Nop>
map <Down> <Nop>
[M] 前往第一行 / 最后一行:gg
/ G
gg
:前往第一行1G
:同gg
G
:前往最后一行
[M] 前往第 n 行:nG
、:n
nG
:前往第 n 行。1G
可以前往第一行。如果希望在 vim 中显示行号,可以在标准模式下执行set number
命令,也可以将这条命令写到 vim 的配置文件中。:n
也可以前往第 n 行,比如:123
前往第 123 行。
[M] 向右移动一个单词:w
/ e
w
:向右移动一个单词,光标将落在下一个单词的首字符e
:向右移动一个单词,光标将落在当前一个单词的最后一个字符
在这里,一个单词
的定义是连续的「数字+字母+下划线」,或者连续的「特殊字符」。比如 hello, world!!!
里包含 hello
、,
、world
和 !!!
四个单词。按 w
跳转时,会跳过单词后面的所有空白字符,落在下一个单词的开头。示例:
↓ 光标在这里
Hello, world!
↑ 按下 w
↑ 按下 e
Hello, world!
↑ 按两下 w
↑ 按两下 e
类似的还有 W
/ E
,区别在于这两个快捷键对单词
的定义是连续的「非空字符」,即以空格作为单词的分界线。比如 hello, world!!!
里,包含 hello,
和 world!!!
两个单词。
[M] 向左移动一个单词:b
b
向左移动到前一个单词的首字符,相当于是 w
的逆操作。b
取 backwards 首字母,「单词」的定义同 w
。
2b
向左移动两个单词,nb
向左移动 n 个单词。
B
向左移动一个单词,将「空格」作为单词的分隔符(同 W
、E
)。
[M] 移动到前一个单词的末尾:ge
ge
移动到前一个单词的末尾,gE
将空格作为单词的分隔符。
[M] 前往当前行第一个 / 最后一个字符:0
/ $
/ _
/ ^
0
:前往第一个字符,可以理解成是第 0 列$
:前往最后一个字符_
:前往第一个非空字符,这在编写 python 等有缩进的代码时很有用。^
等价。
[E] 删除字符:x
/ X
x
:删除当前字符,等同于<Delete>
X
:删除前一个字符
[E] 删除单词:dw
「单词」的定义同 w
,单词后面的任意多个空格将被删除。
类似的还有 dW
,删除下一个空格前的单词。
[E] 删除当前行:dd
略。
[E] 在当前位置后面插入:a
i
在当前位置前面插入(insert),a
在当前位置后面插入(append)。
[E] 在当前行开始 / 末尾插入:I
/ A
略。
[E] 在当前行下面 / 上面插入新行:o
/ O
插入新的空白行。
[E] 改变大小写:~
/ gu
/ gU
-
~
:将光标下的字母改变大小写。3~
是将光标开始的 3 个字母改变大小写。 gu<motion>
:指定范围的字母变成小写。比如guw
是后一个单词全变成小写,guj
是当前整行改成小写。gU
则是改成大写。guu
:将当前行的字母改成小写。gUU
是改成大写。guiw
:将光标所在的单词改成小写。详见下文 inside / around。
[F] 移动到下一个指定字符:f<target>
ft
移动到下一个 t
出现的位置,f2
移动到下一个 2
出现的位置。f
取 forward 的首字母。
F
类似于 f
,向前移动到前一个指定字符。
t
类似于 f
,只不过光标会移动到下一个指定字符之前;T
类似于 F
,只不过光标会移动到前一个指定字符之后。t
取 until 的含义。
示例:
↓ 光标在这里
Hello, world!
↑ fo
↑ fr
↑ Fh
↑ to
↑ Th
[E] 撤销 / 重做:u
/ <Ctrl> + r
u
:撤销(undo)<Ctrl> + r
:重做(redo)
中场休息:vim 的一些模式
重复 n 次操作:n<action>
Vim 中几乎所有操作都可以通过一个 n
前缀来重复 n 次:
5h
向左移动 5 个字符。5j
向下移动 5 行。2w
向右移动两个单词,等同于按两次w
。2x
删除两个字符,2X
向左删除两个字符。3fa
在当前行查找第 3 次出现的a
,等同于按 3 次fa
。2u
撤销前两步操作,等同于按两次u
。2<Ctrl> + r
重做被撤销的两步操作,等同于按两次<Ctrl> + r
。
💡 移动类命令 (motion) 如 h
/ w
,和操作类命令 (verb) 如 d
/ x
/ f
都支持在前面加 n
来重复多次。
操作任意范围:<verb><motion>
我们以 d
命令为例。d
可以和任意光标移动的操作结合,来删除一个范围的内容。
比如:w
是跳到下一个单词的开头,那么 dw
就是删除到下一个单词的开头;b
是跳转到前一个单词的开头,那么 db
就是删除到前一个单词的开头。以此类推,d0
是删除当前位置到行开头的所有内容,dG
是删除当前行到文件末尾的所有内容,dgg
是删除当前行到文件开头的所有内容。
大部分命令都支持 <verb><n><motion>
和 <n><verb><motion>
两种模式,比如 d2w
和 2dw
都是删除后两个单词。但在语义上有区别:d2w
表示删除 2w
范围的内容,而 2dw
表示 dw
命令重复 2 次。
💡 d
/ c
/ y
等 verb,都支持上述模式。比如 c2w
修改后两个单词,y2j
复制下两行。
命令的小写和大写:d
/ D
等
不同的方向:
x
向右、X
向左p
向下、P
向上o
向下、O
向上f
向右、F
向左
更严格的条件:
w
将特殊字符作为独立单词,W
只将空格作为单词分隔符e
/E
、b
/B
同理
更大的范围:
a
在当前位置后面插入、A
在当前行末尾插入i
在当前位置前插入、I
在当前行开始插入d
删除一个范围、D
删除到行末尾c
删除一个范围、C
删除到行末尾,并进入编辑模式s
删除当前字符,并进入编辑模式;S
删除当前整行,并进入编辑模式
连续操作:
r
替换一个字符、R
连续替换多个字符直到按下<Esc>
两个字母重复:dd
/ cc
/ yy
/ guu
两个 verb 字母重复,表示对当前整行操作:
dd
:删除整行cc
:删除整行,并进入编辑模式yy
:复制整行guu
:当前整行变成小写gUU
:当前整行变成大写
重复上次操作:.
/ ,
/ ;
.
:重复上次的编辑操作。比如执行了A123<Esc>
在当前行尾插入123
后,可以移动到下一行,按.
在该行末尾插入123
。,
/;
:重复当前行内的上一次 / 下一次f
查找。比如在当前行按fa
找到第一个a
字符后,按;
可以查找下一个,等价于再按fa
。按,
是查找上一个,等价于Fa
。n
/N
:按/bar<Enter>
搜索bar
字符串后,按n
可以查找下一个,按N
查找上一个。
进阶
[E] 替换一个字符:r
r
:再按下任意键,替换(replace)当前字符,等同于 x
+ i
。示例:
↓ 光标在这里
Helle, world!
# 先按 r,再按 o
Hello, world!
↑ 光标在这里
[E] 替换连续多个字符:R
R
:替换连续的多个字符,按下 <Esc>
可以退出替换模式。
[E] 更改一个范围的内容:c
c
取 change 的首字母,这个命令的便捷之处在于将「删除操作」和「进入编辑模式」合二为一,可以少按一个键。
cw
:更改下一个单词,等同于dw
+i
c2w
:更改后两个单词,等同于d2w
+i
c$
:更改从当前位置到行结束的所有内容,等同于d$
+i
和 d
一样,c
也可以和任意光标移动的操作符结合,来更改一个范围的内容。
[E] 删除当前字符,并进入编辑模式:s
s
等同于 x
+ i
。
[E] 删除当前整行,并进入编辑模式:S
/ cc
S
等同于 dd
+ o
。cc
也可以删除整行,并进入编辑模式。
[E] 从当前位置开始向右删除整行:D
D
等同于 d$
。
[E] 从当前位置开始向右删除整行,并进入编辑模式:C
C
等同于 c$
,或者 d$
+ a
,或者 D
+ a
。
[V] 可视模式选择内容:v
/ V
/ <Ctrl> + v
按下 v
进入可视模式(visual mode),然后移动光标以选择文本。可以针对选中的文本执行任意操作 (verb),比如:
- 按下
y
可以复制选中的文本,再移动到别的位置按下p
粘贴这些文本 - 按下
d
可以删除选中的文本
按下 ctrl + v
可以进入 Visual Block Mode,选择一个矩形块里的内容:
按下大写 V
可以选中整行。常见的使用技巧:
- 按
V
选中整行,按j
向下选中多行,然后y
复制。 - 按
V
选中整行,按j
向下选中多行,按<
向左缩进,按.
继续缩进。 - 按
V
选中整行,按j
向下选中多行,按=
格式化。
复制下一个单词:yw
y
取 yank(复制)的首字母。yw
复制下一个单词,p
可以将其粘贴(put)到指定位置。
事实上,y
和 c
、d
一样,可以和任意光标移动的操作符结合,来复制一个范围的内容。比如 y$
将复制当前位置到行末尾的全部内容,yh
将复制光标前面的字符,yG
复制光标所在行到最后一行的所有内容。
最后,yy
复制当前行,可以和 dd
一起理解 —— dd
删除一整行,快捷键重复表示操作的是一整行,不管光标位置在哪里。第二个 y
和 d
并没有语义上的含义。
复制当前行:yy
/ 2yy
/ y2j
yy
复制当前行,p
粘贴到目标位置。
nyy
复制当前行往下的 n 行,包括当前行。
ynj
也是复制当前行往下的 n 行。比如 y2j
会复制当前行和下一行。
粘贴到下一行 / 上一行:p
/ P
如上所述,p
粘贴到目标位置。
通过 dd
删除某一行后,也可以按下 p
,将删除掉的内容放置到当前光标位置下一行。注意这里是「放置」而不是「粘贴」,因为 dd
将被删除的行保存到了缓冲区,而 p
其实是将缓冲区的内容放置到当前位置,所以 p
取 put 的首字母,而非 paste。
同理,yy
将当前行保存到缓冲区,但不删除。这样 yy
+ p
就可以实现“复制-粘贴”的操作。
大写 P
粘贴到上一行。
当前行置顶:zt
/ zb
/ zz
zt
把当前行置于屏幕顶端。z
字取其象形意义,模拟一张纸的折叠变形。t
取 top 的首字母。
zz
将当前行置于屏幕中央。zb
将当前行置于屏幕底端,b
取 bottom 的首字母。
缩进:<
/ >
选中文本后,<
是向左缩进,>
是向右缩进。
格式化:=
按 =
可以将选中的文本格式化。这个命令可以配合 V
使用 —— 通过 V
选中多行,然后按 =
格式化选中的文本。
高级
[E] inside 和 around:di*
/ da*
对于 Vim 的删除命令 d
,还有一类比较常用的操作是以 i
(inside
或 inner
) 和 a
(around
) 为后缀的命令,用于删除以当前光标所在的语法元素内部或周围的字符。比如:
diw
和daw
:前者删除当前光标所在的单词,后者会删除当前光标所在的单词与后面的空格。di(
和da(
:前者会删除括号内的内容,后者还会删除括号本身。类似的还有di[
、da[
、di{
、da{
等。dib
和dab
:等价于di(
和da)
。b
表示 bracket。di"
和da"
:前者删除双引号内的内容,后者还会删除引号本身。dit
和dat
:修改 tag 包围的内容。vim 会自动将<tag>
和</tag>
识别为一对 tag。这在前端开发场景中很有用。dip
:删除当前整段 (paragraph) 的内容。
除了 d
命令,c
/ v
/ gu
等命令也可以和 inside、around 组合。比如 ciw
是修改当前单词,viw
是选中当前单词。
inside、around 也可以和上面的 重复 n 次 结合使用。比如光标位于 (a * (b + c))
的字符 c
时,按 di(
将删除内层括号里的 b + c
,按 d2i(
将删除外层括号里的全部内容。
inside 和 around 命令可以大大提高操作效率,尤其是在编辑代码时。
[F] 查找文档中的关键字:/<pattern>
/
从光标所在位置向后查找关键字,n
/ N
查找下一个 / 上一个匹配的位置。
?
向前查找,不过很少使用。如果想向前查找的话,使用 /
+ N
就可以了。
q/
、q?
可以列出 /
、?
的查找历史,上下选择,按 i
编辑,回车执行,:q
退出。
<pattern>
可以是正则表达式,比如 /vim$
查找位于行尾的 vim
。查找特殊字符时需要转义,比如 /vim\$
查找 vim$
。
在查找模式中加入 \c
表示大小写不敏感查找,\C
表示大小写敏感,比如 /foo\c
会查找 foo
、Foo
等。默认是大小写敏感,可以执行 :set ignorecase
或写入配置文件设置大小写不敏感为默认的查找模式。
查找相关命令:
set ic // 等价于 set ignorecase
set hls is // 高亮匹配项
nohlsearch // 移除匹配项的高亮显示
[F] 查找当前光标对应的完整单词:*
/ #
示例:
↓ 光标在这里
Hello, world!
此时按下*
,将向后查找 Hello
这个单词。按下 #
是向前查找。
[F] 在代码块匹配的括号之间跳转:%
%
在匹配的括号之间跳转。需要将光标放在 {}[]()
上,然后按 %
。 如果光标所在的位置不是 {}[]()
,那么会向右查找第一个 {}[]()
。
[F] 光标跳转到前一个位置 / 后一个位置:<Ctrl> + o
/ <Ctrl> + i
在标准模式下,<Ctrl> + o
将光标跳转到前一个位置,<Ctrl> + i
跳转到后一个位置。
注意这里使用的是“跳转”。h
/ j
/ k
/ l
/ w
等移动将不会记录在「跳转表」中,只有通过 gg
/ nG
/ 查找时的 n
/ N
等命令执行的跳转操作,才可以通过 <Ctrl> + o
/ <Ctrl> + i
来回跳转。
补充:
- 在 VS Code 中,向前一个 / 后一个位置跳转的快捷键是
<Ctrl> + [
/<Ctrl> + ]
。- 在 Intellij 等 Jetbrains 系列软件中,向前一个 / 后一个位置跳转的快捷键是
<Command> + [
/<Command> + ]
。如果不是,可以在Preferences
中搜索back
,然后在KeyMap -> Main menu -> Navigate -> Back
中设置。
[F][E] 替换文本::{range}s/{old}/{new}/{flag}
:s
(substitute)命令用来查找和替换文本。语法如下:
:{range}s/{old}/{new}/{flag}
表示在指定范围 range
内查找字符串 old
并替换为 bar
,flag
说明了替换模式,如只替换首次出现、或全部替换。
作用范围 range
作用范围分为当前行、全文、行范围、选区等:
- 当前行:空白,默认,如
:s/foo/bar/g
- 全文:
%
,如:%s/foo/bar/g
- n~m 行:
n,m
,如:5,12s/foo/bar/g
表示 5~12 行 - 当前行与之后 n 行:
.,+n
,如:.,+2s/foo/bar/g
表示当前行与之后 2 行 - 选区:略
替换模式 flag
替换模式:
- 空白:默认,只替换光标位置之后的首次出现,如
:%s/foo/bar
g
:全局替换,替换每次出现(global),如:%s/foo/bar/g
i
:忽略大小写c
:交互式替换,每次替换前需要用户确认(confirm),如:%s/foo/bar/gc
表示查找全文的所有foo
并替换为bar
,每次替换前都需要确认:- 按下回车执行后,提示
replace with bar (y/n/a/q/l/^E/^Y)?
y
表示替换n
表示不替换a
表示替换后续所有q
表示退出查找模式l
表示替换当前位置并退出查找模式^E
、^Y
用于向上、向下滚动屏幕,^
表示<Ctrl>
键
- 按下回车执行后,提示
配合 v
可视模式选择替换区域
首先按 v
进入可视模式,选择要替换的文本范围。
然后按下:
进入命令行模式,Vim 将自动插入:'<,'>
,表示选择的范围。
接下来,输入替换命令:
:'<,'>s/old_text/new_text/g
这将在选择的区域内替换所有匹配到的 old_text
。
录制宏:q
、@
Vim 的宏提供了将一系列操作记录下来然后重复执行的机制。它可以大大提高重复性的操作效率。使用宏的步骤如下:
- 录制宏。按下
q
键,然后再按下一个字母 (如a
,这是宏的名字),开始录制宏。这时会在状态栏显示recording a
。在录制时,执行要重复的操作,包括移动、删除、插入等等。执行完操作后,按下q
键结束录制。 - 执行宏。按下
@
键,然后在输入框中输入之前记录宏的字母 (如a
),按下回车键即可执行宏。也可以连续执行多次,比如执行 10 次,只需在@a
后面加上10
即可。
另外,按下 v
键进入 visual mode 选中多行,可以批量针对多行文本执行宏。使用 :reg
命令可以查看所有已经保存的宏。如果在执行宏时出现错误,可以通过使用 :debug
命令进入调试模式。
在 vim 中执行 shell 命令::!<command>
比如通过 vim 编辑文本的时候,希望打印当前目录,但是又不想退出 vim,那么就可以直接在 vim 中执行::!pwd
,这等同于在 shell 中执行 pwd
。
获得命令提示:
-
在 vim 中输入
:
,再按下<Ctrl> + d
,将展示所有可以在 vim 中使用的命令。 -
输入
:w
,再按下<Ctrl> + d
,将展示所有可以在 vim 中使用的、以w
开头的命令。
配置文件
配置文件位于 ~/.vimrc
,其内容是若干行可在 vim 中执行的命令,会在每次打开 vim 时自动执行。示例:
set number # 显示行号
set releativenumber # 显示相对行号
set ignorecase # 大小写不敏感查找
set ic # 等价于 set ignorecase
set smartcase # 如果有一个大写字母,则切换到大小写敏感查找
set hls is # 高亮匹配项
Github 有很多开箱即用的 vimrc 文件,比如 amix/vimrc。
💡 vim 可以修改键位映射。这里建议把高频使用的命令放在触手可及的键位上,比如 ^
(跳到当前行第一个非空字符) 就很常用,但这个键很难按。像 W
/ E
/ R
/ S
这些键位并不经常用,就可以配成其他操作。
配置插件
- Vim 插件推荐
- vim-surround 是一个很好用的插件,功能和上面的 inside / around 相反
其他工具 Vim 化
Chrome
Vimium,通过类似 vim 风格的命令操作浏览器窗口。
VS Code
Vim 插件,将 VS Code 的编辑器转为 vim 模式。最近高频使用,V
、ciw
、di{
等命令显著提升了编码效率。
编辑 settings.json
文件,配置 jj
替换 ESC:
"vim.insertModeKeyBindings": [
{
"before": ["j", "j"],
"after": ["<Esc>"]
}
]
终端 / Bash / zsh
在终端输入 set -o vi
可以切换到 vim 模式,按下 ESC
就能进入 vim 的 normal mode,修改终端命令的时候很好用。推荐将其写入 .bashrc
或 .zshrc
等配置文件。
在 zsh 中,也可以通过快捷键 Ctrl + x, Ctrl + e
打开 vim 编辑当前命令。
总结
掌握「入门」一节中的快捷键,基本可以满足大部分使用场景。如果想进一步提升效率,那么「进阶」一节中的快捷键也值得学习。「高级」一节的内容,由于我还没有将 vim 作为主力开发工具,尚未深入研究,所以等以后有机会再补充。
可以在其他编辑器中配合 vim 插件,来培养 vim 的使用习惯。将 Chrome vim 化,也能体验到 vim 带来的酷炫与极客感。
最后,在实践中学习命令!如果只是阅读而不尝试,那么很快就会遗忘。
希望本文对你有帮助。
附录 1:速查表
仅作为正文的补充,记录一些可能有用的快捷键。
光标移动
快捷键 | 作用 |
---|---|
^ |
移动到当前行第一个非空字符 |
<Space> |
向右移动一个字符,等同于 l |
<Alt> + ← , <Alt> + → |
向左 / 向右移动一个单词,等同于 w / b |
:n<enter> |
跳到指定行,等同于 nG |
ngg |
跳到指定行,等同于 nG |
H |
光标移动到屏幕最上方(head) |
M |
光标移动到屏幕中央(middle) |
L |
光标移动到屏幕最下方(last) |
/{keyword} |
向后搜索,回车定位 |
?{keyword} |
向前搜索,回车定位 |
💡 Tips:如果想快速跳转到某个函数名,更建议用搜索。例如,如果你想将光标移动到某个函数的开头,可以使用 /{函数名}
命令来查找该函数名,然后再使用 b
命令将光标移动到函数名前的空格上。原因:如果目标位置距离较远,数需要跳转几行或几个单词很低效,而搜索可以直接跨行定位关键词。/
是向后搜索,?
是向前搜索。
屏幕滚动
快捷键 | 作用 |
---|---|
向上 / 向下滚动一行 | <Ctrl> + y / <Ctrl> + e |
向上 / 向下滚动一页 | <Ctrl> + f / <Ctrl> + b (forward,backward) |
向上 / 向下滚动半页 | <Ctrl> + d / <Ctrl> + u |
这些命令在大部分 Unix 软件中都可以使用,比如
man
、less
、tmux
(需要先进入滚动模式)
编辑
快捷键 | 作用 |
---|---|
J |
将当前行和下一行用空格连成一行 |
Jx |
将当前行和下一行直接连成一行,相当于在下一行的行首按 <Backspace> |
di( |
删除括号内的内容 |
da( |
删除括号内的内容,包括括号本身 |
ci( |
删除括号内的内容,同时进入编辑模式 |
ddp |
上下两行交换,实际上就是 dd + p |
其他
快捷键 | 作用 |
---|---|
:help |
查看帮助文档 |
:help :{command} |
查看一个具体命令的帮助文档,如 :help :q 查看 :q 的帮助文档 |
^y$ |
复制一行 |
ggyG |
复制整个文件 |
q: |
查看历史命令,上下选择,按 i 编辑,回车执行,:q 退出 |
附录 2:vim 命令
可以在 vim 标准模式下输入 :<command>
执行,也可以写入配置文件。
set number # 显示行号
set ignorecase # 大小写不敏感查找
set smartcase # 如果有一个大写字母,则切换到大小写敏感查找
imap ii <Esc> # 在插入模式下,映射 ii 到 <Esc>
# 在标准模式下,禁用方向键
map <Left> <Nop>
map <Right> <Nop>
map <Up> <Nop>
map <Down> <Nop>
set paste # 进入粘贴模式,这可以避免粘贴多行代码时被自动缩进
set nopaste # 粘贴完之后,执行这条命令退出粘贴模式
📒 相关文章:💻【Linux】GDB 学习笔记
- 版权声明:本文采用知识共享 3.0 许可证 (保持署名-自由转载-非商用-非衍生)
- 发表于 2023-01-05,更新于 2023-06-22