missing-semester(3)-vim

本文参考💻【Linux】Vim 入门笔记,仅供自己查阅使用

基本概念

模式

vim编辑器是一种多模态编辑器,其允许用户切换不同的模式来进行不同的编辑任务:

  • normal:最初始的模式,主要用于查询和移动
  • insert:i
  • replace:r
  • visual:v
  • visual line:shift-v
  • visual block:ctrl-v
  • command line::

buffer, window, tab

每一个buffer对应一个文件,一个window可以显示一个buffer(多个window可以对应同一个buffer),每一个tab可以打开多个window。

基本操作

执行命令

:后输入命令

退出vim

  • :q:quit:退出当前tab中所在window,直到最后一个window则退出tab
  • :q!:退出并丢弃已有操作
  • :wq:保存更改(write)并退出(quit)
  • ZZ:等价于:wq

保存文件

  • :w:保存更改
  • :w <filename>:将当前内容保存到新的文件中

[M]基本移动

使用hjkl而不是左下右上的方向键

[M]前进到第一行或最后一行

  • gg:前往第一行
  • 1G:同gg
  • G:前往最后一行

[M]前往第n行

  • nG:前往第n行,可以在标准模式下使用set number来显示行号
  • :n:同样前往第n行

[M]向右移动一个单词

  • w:向右移动一个单词,光标处于首字符
  • e:向右移动一个单词,光标落在当前单词的最后一个字符

注意此处单词的定义是连续的「数字+字母+下划线」,或者连续的「特殊字符」hello, world!!! 里包含 hello,world!!! 四个单词。

  • W:向右移动一个连续的「非空字符」,光标处于首字符
  • E:向右移动一个连续的「非空字符」,光标落在当前单词的最后一个字符

[M]向左移动一个单词

  • b:向左移动到前一个单词的首字符
  • ge:向左移动到前一个单词的末尾
  • B:向左移动一个连续的「非空字符」
  • gE:向左移动一个连续的「非空字符」,到末尾

[M]前往当前行的开头和末尾字符

  • 0:前往开头
  • $:前往末尾
  • _:前往第一个非空字符(编写python等缩进代码时很有用)
  • ^:与_等价

[E]删除字符

  • x:删除当前字符
  • X:删除前一个字符

[E]删除单词

  • dw:删除单词
  • dW:删除下一个空格前的单词

[E]删除当前行

  • dd

[E]在当前位置插入

  • i:在当前位置前面插入(insert)
  • a:在当前位置后面插入(append)

[E]在当前行开头或末尾插入

  • I:在当前行开头插入
  • A:在当前行末尾插入

[E]在当前行上或下插入新的行

  • o:在上面插入新的行
  • O:在下面插入新的行

[E]改变大小写

  • ~:将光标下的字母改变大小写
  • gu<motion>:指定范围的字母变成小写,比如 guw 是后一个单词全变成小写,guj 是当前整行改成小写
  • gU<motion>:指定范围的字母变成大写
  • guu:将当前行的字母改成小写
  • gUU:将当前行的字母改成大写
  • guiw:将光标所在的单词改成小写

[F]移动到写一个指定字符

  • f<target>:移动到下一个<target>出现的位置,比如ft就是移动到下一个t出现的位置
  • F<target>:移动到前一个<target>出现的位置
  • t<target>:类似于f,但是会移动到下一个指定字符之前
  • T<target>:类似于F,但是会移动到前一个指定字符之后

[E]撤销或重做

  • u:撤销(undo)
  • <ctrl>+r:重做(redo)

一些模式

重复n次操作

n<action>,重复n次<action>操作

操作任意范围

<verb><motion>,任意的操作<verb>都可以和范围<motion>拼接,使得指定一个范围进行操作。w 是跳到下一个单词的开头,那么 dw 就是删除到下一个单词的开头。

大部分命令都支持 <verb><n><motion><n><verb><motion> 两种模式,比如 d2w2dw 都是删除后两个单词。

命令大小写

不同的方向:

  • 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>

两个字母重复

两个 verb 字母重复,表示对当前整行操作:

  • dd:删除整行
  • cc:删除整行,并进入编辑模式
  • yy:复制整行
  • guu:当前整行变成小写
  • gUU:当前整行变成大写

重复上次操作

  • .:重复上次的编辑操作
  • ,;:重复当前行内的上一次 / 下一次 f 查找
  • nN:按 /bar<Enter> 搜索 bar 字符串后,按 n 可以查找下一个,按 N 查找上一个

进阶操作

[E]替换一个字符

r:再按下任意键,替换(replace)当前字符,等同于 x + i

[E]替换连续多个字符

R:替换连续的多个字符,按下 <Esc> 可以退出替换模式。

[E]更改一个范围的内容

c相当于将删除和进入编辑模式合二为一(change)。

  • cw:更改下一个单词,等同于dw+i

[E]删除当前字符并进入编辑模式

s等价于x+i

[E]删除当前整行并进入编辑模式

S等价于dd+o。也可以用cc

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

D等价于d$

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

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

[V]可视模式选择内容

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

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

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

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

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

复制单词

y可以进行复制(yank)。

  • yw:复制下一个单词

ycd一样可以和光标移动操作符相结合。

复制当前行

  • yy:复制当前行
  • nyy:复制当前行向下的n行,包括当前行
  • ynj:同nyy

粘贴到下一行或上一行

  • p:粘贴复制内容到目标位置,使用dd删除某一行后,也可以按下p,将删除掉的内容放置到当前光标位置下一行(但是此时是放置(put)而不是粘贴)
  • P:粘贴到上一行

当前行置顶

  • zt:把当前行置于屏幕顶端,z 字取其象形意义,模拟一张纸的折叠变形,t 取 top 的首字母
  • zz:将当前行至于屏幕中央
  • zb:将当前行至于屏幕底端

缩进

  • <:选中文本后,向左缩进
  • >:选中文本后,向右缩进】

格式化

  • =:通过 V 选中多行,然后按 = 格式化选中的文本

高级

[E]inside和around

对于 Vim 的删除命令 d,还有一类比较常用的操作是以 i (inside或 inner) 和 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( 将删除外层括号里的全部内容。

[F]查找文档中的关键字

/ 从光标所在位置向后查找关键字,n / N 查找下一个 / 上一个匹配的位置。

? 向前查找,不过很少使用。如果想向前查找的话,使用 / + N 就可以了。

q/q? 可以列出 /? 的查找历史,上下选择,按 i 编辑,回车执行,:q退出。

<pattern> 可以是正则表达式,比如 /vim$ 查找位于行尾的 vim。查找特殊字符时需要转义,比如 /vim\$ 查找 vim$

在查找模式中加入 \c 表示大小写不敏感查找,\C 表示大小写敏感,比如 /foo\c 会查找 fooFoo 等。默认是大小写敏感,可以执行 :set ignorecase 或写入配置文件设置大小写不敏感为默认的查找模式。

[F]查找当前光标对应的完整单词

按下*,将向后查找,按下#是向前查找。

[F]在代码块匹配的括号之间跳转

% 在匹配的括号之间跳转。需要将光标放在 {}[]() 上,然后按 %。 如果光标所在的位置不是 {}[](),那么会向右查找第一个 {}[]()

[F]光标跳转到前一个位置/后一个位置

在标准模式下,<Ctrl> + o 将光标跳转到前一个位置,<Ctrl> + i 跳转到后一个位置。h / j/ k / l / w 等移动将不会记录在「跳转表」中,只有通过 gg / nG / 查找时的 n / N 等命令执行的跳转操作,才可以通过 <Ctrl> + o / <Ctrl> + i 来回跳转。

  • 在 VS Code 中,向前一个 / 后一个位置跳转的快捷键是 <Ctrl> + [ / <Ctrl> + ]

[F][E]替换文本

:s(substitute)命令用来查找和替换文本。语法如下:

:{range}s/{old}/{new}/{flag}

表示在指定范围 range 内查找字符串 old 并替换为 newflag 说明了替换模式,如只替换首次出现、或全部替换。

作用范围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 进入可视模式,选择要替换的文本范围。接下来,输入替换命令:

:'<,'>s/old_text/new_text/g

这将在选择的区域内替换所有匹配到的 old_text

录制宏

Vim 的宏提供了将一系列操作记录下来然后重复执行的机制。它可以大大提高重复性的操作效率。使用宏的步骤如下:

  1. 录制宏。按下 q 键,然后再按下一个字母 (如 a,这是宏的名字),开始录制宏。这时会在状态栏显示 recording a。在录制时,执行要重复的操作,包括移动、删除、插入等等。执行完操作后,按下 q 键结束录制。
  2. 执行宏。按下 @ 键,然后在输入框中输入之前记录宏的字母 (如 a),按下回车键即可执行宏。也可以连续执行多次,比如执行 10 次,只需在 @a 后面加上 10 即可。

另外,按下 v 键进入 visual mode 选中多行,可以批量针对多行文本执行宏。使用 :reg 命令可以查看所有已经保存的宏。如果在执行宏时出现错误,可以通过使用 :debug 命令进入调试模式。

在vim中执行shell命令

比如通过 vim 编辑文本的时候,希望打印当前目录,但是又不想退出 vim,那么就可以直接在 vim 中执行::!pwd,这等同于在 shell 中执行 pwd

获得命令提示:

  • 在 vim 中输入 :,再按下 <Ctrl> + d,将展示所有可以在 vim 中使用的命令。
  • 输入 :w,再按下 <Ctrl> + d,将展示所有可以在 vim 中使用的、以 w 开头的命令。

配置文件

配置文件位于 ~/.vimrc,其内容是若干行可在 vim 中执行的命令,会在每次打开 vim 时自动执行。