📺 视频分享: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。

Vim 对于每个服务端开发人员都不陌生,这可能是我们接触最多的 Linux 软件。所有类 Unix 的系统(Linux、Mac)都安装了 vim。当我们通过终端操作文本时,vim 或许是我们唯一的选择。

然而,vim 的使用方式和我们所熟悉的可视化编辑器完全不同,它的的快捷键是如此奇怪,不易上手。因此除非兴趣使然,我们很少会主动学习 vim。它的上限够高,下限也足够低,只需要掌握最基本的操作:↑↓←→i<ESC>:wq,就可以覆盖大部分使用场景。那为什么还需要再深入学习 vim 呢?

主要原因是:用较少的学习成本,换来较大的效率提升。Vim 常用的几个快捷键,可以在手指不离开键盘热区的情况下快速定位光标或编辑内容,这些内容的学习成本并不高。如果你开发运维的过程中和 vim 打交道的次数越来越多,掌握这些技巧可以极大的提升开发效率。即使现在没有需求,也可以提前上手这个强大的工具。

为什么要写这篇文章

现有的 vim 教程 / 文章大多直接罗列完整的 vim 快捷键列表,让人不知从何下手。我认为应当先掌握最重要的、最高频的快捷键,满足日常开发所需;其他低频使用的快捷键,可以作为一个速查表按需查看,vim 的进阶用法也可以之后再深入研究。

因此,我尝试作为一个 vim 初学者,总结 vim 主要和次要的快捷键,同时提供一些学习 vim 的资源。

注意:在阅读本文时,你随时可以在终端执行 vimtutor,打开一个教程文本文件,尝试某个快捷键或命令。

学习资源

这里顺便再推荐一些可视化学习资源:

术语说明

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)vim
  • ZZ:等同于 :wq,这个快捷键输入比 :wq 更快,注意是大写 Z

保存文件: :w / :w <filename>

  • :w:保存更改
  • :w <filename>:保存到一个新的文件

[M] 基本移动:h / j / k / l

使用 hjkl 而不是 ,这能够避免将手指移出键盘热区再移回来。如果有必要的话,甚至可以禁用方向键,来强制自己使用 hjkl

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 向左移动一个单词,将「空格」作为单词的分隔符(同 WE)。

[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 撤销前两步操作,等同于按两次 u2<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> 两种模式,比如 d2w2dw 都是删除后两个单词。但在语义上有区别:d2w 表示删除 2w 范围的内容,而 2dw 表示 dw 命令重复 2 次。

💡 d / c / y 等 verb,都支持上述模式。比如 c2w 修改后两个单词,y2j 复制下两行。

命令的小写和大写:d / D

不同的方向:

  • x 向右、X 向左
  • p 向下、P 向上
  • o 向下、O 向上
  • f 向右、F 向左

更严格的条件:

  • w 将特殊字符作为独立单词,W 只将空格作为单词分隔符
  • e / Eb / 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 + occ 也可以删除整行,并进入编辑模式。

[E] 从当前位置开始向右删除整行:D

D 等同于 d$

[E] 从当前位置开始向右删除整行,并进入编辑模式:C

C 等同于 c$,或者 d$ + a,或者 D + a

[V] 可视模式选择内容:v / V / <Ctrl> + v

按下 v 进入可视模式(visual mode),然后移动光标以选择文本。可以针对选中的文本执行任意操作 (verb),比如:

  • 按下 y 可以复制选中的文本,再移动到别的位置按下 p 粘贴这些文本
  • 按下 d 可以删除选中的文本

vim-visual-mode

按下 ctrl + v 可以进入 Visual Block Mode,选择一个矩形块里的内容:

image-20230315105320258

按下大写 V 可以选中整行。常见的使用技巧:

  1. V 选中整行,按 j 向下选中多行,然后 y 复制。
  2. V 选中整行,按 j 向下选中多行,按 < 向左缩进,按 . 继续缩进。
  3. V 选中整行,按 j 向下选中多行,按 = 格式化。

复制下一个单词:yw

y 取 yank(复制)的首字母。yw 复制下一个单词,p 可以将其粘贴(put)到指定位置。

事实上,ycd 一样,可以和任意光标移动的操作符结合,来复制一个范围的内容。比如 y$ 将复制当前位置到行末尾的全部内容,yh 将复制光标前面的字符,yG 复制光标所在行到最后一行的所有内容。

最后,yy 复制当前行,可以和 dd 一起理解 —— dd 删除一整行,快捷键重复表示操作的是一整行,不管光标位置在哪里。第二个 yd 并没有语义上的含义。

复制当前行: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 (insideinner) 和 a (around) 为后缀的命令,用于删除以当前光标所在的语法元素内部或周围的字符。比如:

  • diwdaw:前者删除当前光标所在的单词,后者会删除当前光标所在的单词与后面的空格。
  • di(da(:前者会删除括号内的内容,后者还会删除括号本身。类似的还有di[da[di{da{等。
  • dibdab:等价于 di(da)b 表示 bracket。
  • di"da":前者删除双引号内的内容,后者还会删除引号本身。
  • ditdat:修改 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 会查找 fooFoo 等。默认是大小写敏感,可以执行 :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 并替换为 barflag 说明了替换模式,如只替换首次出现、或全部替换。

作用范围 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 的宏提供了将一系列操作记录下来然后重复执行的机制。它可以大大提高重复性的操作效率。使用宏的步骤如下:

  1. 录制宏。按下 q 键,然后再按下一个字母 (如 a,这是宏的名字),开始录制宏。这时会在状态栏显示 recording a。在录制时,执行要重复的操作,包括移动、删除、插入等等。执行完操作后,按下 q 键结束录制。
  2. 执行宏。按下 @ 键,然后在输入框中输入之前记录宏的字母 (如 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 化

Chrome

Vimium,通过类似 vim 风格的命令操作浏览器窗口。

VS Code

Vim 插件,将 VS Code 的编辑器转为 vim 模式。最近高频使用,Vciwdi{ 等命令显著提升了编码效率。

编辑 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 软件中都可以使用,比如 manlesstmux(需要先进入滚动模式)

编辑

快捷键 作用
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 学习笔记