Vim学习笔记 #1 基础操作与配置

本文最后更新于:2024年8月5日 晚上

Vim 常常因其极高的学习门槛劝退很多新手,但在在一些特殊的场景中,你可能不得不抛弃图形文本编辑器,例如:实验室的服务器、公司的安全域主机(物理隔绝网络)等。

本文将介绍 Vim 自带的基础操作,以及如何配置文件来实现更高级的操作。Vim 在大多数 Unix 系统下都可以使用,本文的版本为 vim8,使用 vim --version 即可查看。

速查表

Normal 模式下: - w:移动到下一个单词的开头 - b:移动到前一个单词的开头 - u:撤销上一步操作 - Ctrl + r:重做撤销的操作 - y:复制(yank) - yy:复制当前行 - yw:复制当前单词 - p:粘贴(put) - p:在光标后粘贴 - P:在光标前粘贴 - d:删除(delete) - dd:删除当前行 - dw:删除当前单词 - ggdG:删除全部内容 - x:删除(剪切)光标所在字符 - /pattern:向下搜索 pattern - ?pattern:向上搜索 pattern - n:跳到下一个匹配 - N:跳到上一个匹配

基础操作

打开与退出

输入 vim 即可进入 Vim 编辑器并打开空文件;输入 vim <文件名>,即可用 Vim 去编辑对应文件,如果文件不存在则会新建文件。

进入 Vim 之后是 Normal 模式,此时无法输入任何东西,使用 :q 可以退出 Vim 编辑器,使用 :w 可以保存文件,使用 :wq 可以保存文件并退出。

Insert 模式

要编辑文件,必须进入编辑模式,在 Normal 模式下输入 iao 即可进入:

  • i:在当前光标的位置插入(insert)
  • a:在当前光标的位置插入(append)
  • o:在当前光标的下一行插入(open a line below)

Vim 的开发人员为了提高编辑效率,大写字母 IAO 也可以进入编辑模式:

  • I:从该行最前面开始编辑
  • A:从从该行最后面开始编辑
  • O:从光标所在行的上面另起一行开始编辑

在编辑模式下,按 Esc 键即可退回到 Normal 模式,通常建议将 Esc 键映射到键盘的 CapsLock 键,下文将介绍如何映射。

光标移动

键盘自带的上、下、左、右方向键可以在任何模式使用。此外,在 Normal 模式下,还可以使用 hjkl 来代替方向键,分别代表左、下、上、右,这样就可以在手不离开键盘的情况下移动光标。

在 Normal 模式下,可以按 gi 键以跳动到从编辑模式退出时光标所在的位置,并进入编辑模式。

此外 Normal 模式还支持更多光标移动的快捷键:

  1. 以单词为单位移动,其中小写字母的表示以非字母为分割单位(标点符号、空白符都是分割单位),大写字母仅以空白符为分割的单位:

    • w/W:移动到下一个单词的开头

    • e/E:移动到下一个单词的结尾

    • b/B:移动到上一个单词的开头

  2. 行间单个字符搜索移动:

    • f<char>:快速移动到上面
    • F<char>:快速移动到上面,从行尾开始搜索
    • t<char>:快速移动到的前一个字符
    • T<char>:快速移动到的后一个字符,从行尾开始搜索
    • 如果一行中有多个:可以用 ; 继续搜索该行下一个,或用 , 继续搜索该行上一个
  3. 快速移动到一行的行首或行尾:

    • 0:快速移动到行首
    • $:快速移动到行尾
    • ^:快速移动到非空白字符行首
    • g_:快速移动到非空白字符行尾
  4. 快速垂直移动:

    • ():在句子间移动(粒度更细)
    • {}:在段落之间移动
  5. 快速页面移动:

    • gg:移动到文件第一行
    • G:移动到文件最后一行
    • H:移动到屏幕的开头
    • M:移动到屏幕的中间
    • L:移动到屏幕的结尾
    • zz:把当前行设置为屏幕中间
    • ctrl + u:上翻页
    • ctrl + f:下翻页

删除修改

在 Normal 模式下,按 x 可以快速剪切一个字符,剪切后可以粘贴,如果不粘贴即当删除使用。

同时,使用 d 配合文本对象可以快速剪切一个单词,比如:

  • dw:剪切光标后面的单词(delete word)
  • daw:剪切光标所在的单词及旁边的空格(delete around word)
  • diw:剪切光标所在的单词,但不包括单词旁边的空格

配合快速移动光标,可以:

  • d0:剪切当前光标到行首的内容
  • d$:剪切当前光标到行尾的内容
  • dd:剪切当前行
  • dt<char>:从光标位置剪切到之前的字符

搭配数字可以多次执行

  • 5dd:剪切当前开始的 5 行
  • 5x:剪切 5 个字符

在 Normal 模式下,支持多种快速修改方式:

  • r:替换一个字符,直接输入需要替换的字符即可
  • R:持续替换,后续的输入都会替换光标所在字符
  • s:删除当前字符并且进入编辑模式
  • S:删除当前行并且进入编辑模式
  • c:快速删除一个单词并且进入编辑模式,也支持三种文本对象:cwcawciw
  • C:删除当前光标到行尾的内容并且进入编辑模式

撤销还原

在 Normal 模式下:

  • u:撤销上次操作
  • ctrl + r:还原上次撤销(撤销上一个 u

高级操作

View 模式

Vim 有三种视图模式,在此模式下,用命令移动光标,光标起始位置和当前位置之间的文本将会以高亮显示。这时就可以对这些高亮显示的文本进行整体的操作。

在此模式下也支持 hjkl 移动光标,推荐配合数字键快速移动。移动的单位分为字符、行、列:

  • v:激活面向字符的视图模式
  • V:激活面向的视图模式
  • ctrl + v:激活面向列块的视图模式
  • gv:重选上次的高亮选区
  • o:切换到高亮选区的起始段,从而选择另一侧
  • O:在块模式下,切换到当前行的另一侧

针对高亮显示的文本块,我们可以用命令 ~ 进行大小写转换。用命令 > 增加缩进,或用命令 < 减少缩进。用命令 d 删除全部,或用命令 y 复制全部。

当我们想要退出可视化模式时,可以按 ESC 键或 Ctrl + c 键。

多文件操作

Vim 中有以下概念:

  • buffer:指打开的一个文件的内存缓冲区,每个打开的文件对应一个 buffer,之后的修改都是针对内存中的缓冲区,并不会直接保存到文件中。你可以在不同 buffer 之间切换,从而在多个文件之间操作。当我们在命令行输入 :w 的时候,才会将缓冲区中的内容写到文件中。
  • window:是 buffer 的可视化的分割区域。一个 window 可以显示一个 buffer 的内容,通过分割窗口可以同时查看和编辑多个文件
  • tab:多个 window 组成的一个工作区。一个 tab 页面可以包含多个分割窗口,每个窗口可以显示不同的 buffer,从而提供一个更加灵活的多文件编辑环境。

管理 Buffer:

  • :e filename:打开文件 filename,并将其加载到新的 buffer 中。
  • :ls:buffers:列出所有已加载的 buffer。
  • :bnext:bn:切换到下一个 buffer。
  • :bprev:bp:切换到上一个 buffer。
  • :b #:切换到上一个使用的 buffer。
  • :bd:关闭当前 buffer。
  • :bd [n]:关闭编号为 [n] 的 buffer。

注意:直接关闭一个 buffer (:bd:bd [n]) 时,其内容不会自动保存。如果 buffer 有未保存的更改,Vim 会提示保存更改。你可以选择保存 (:w),放弃更改 (:bd!),或者取消关闭操作。

管理 Window:

  • :split:sp:水平分割窗口,并打开当前 buffer,默认显示同一个文件
  • :vsplit:vsp:垂直分割窗口,并打开当前 buffer,默认显示同一个文件
  • Ctrl + w, w:切换窗口焦点,循环。
  • Ctrl + w, q:关闭当前窗口。
  • Ctrl + w, s:水平分割窗口。
  • Ctrl + w, v:垂直分割窗口。
  • Ctrl + w, h:移动到左边的窗口。
  • Ctrl + w, j:移动到下边的窗口。
  • Ctrl + w, k:移动到上边的窗口。
  • Ctrl + w, l:移动到右边的窗口。

分割窗口:使用 :sp:vsp 命令分割窗口后,两个界面默认显示相同的 buffer 的内容。可以可以使用 :e:bn 等操作切换窗口内的 buffer。窗口的大小可以用鼠标进行拖拽。

管理 Tab:

  • :tabnew:tabnew filename:打开新的 tab 页,并在其中打开文件 filename
  • :tabc:tabclose:关闭当前 tab 页。
  • :tabo:tabonly:关闭所有其他 tab 页,只保留当前 tab 页。
  • :tabn:tabnext:切换到下一个 tab 页。
  • :tabp:tabprevious:切换到上一个 tab 页。
  • :tabs:列出所有 tab 页及其编号。

查找替换

查询(Normal 模式下):

  • /<内容> 向下查找内容
  • ?<内容> 向上查找内容
  • n 查找之后,按 n 跳转到下一个匹配
  • N 查找之后,按 N 跳转到上一个匹配
  • * 查找之后,再对当前光标所在单词进行向下查找
  • # 查找之后,再对当前光标所在单词进行向上查找

替换(Normal 模式下)则相对比较复杂,整体格式为:[range]s/{string1}/{string2}/[flags],其中:

  • range:要替换的范围,比如 10,20: 10-20 行,%:全部
  • string1:要替换的字符串,string2:替换成为的字符串
  • flags:标志,常用的有 g(表示全局范围内执行),没有 g 的话,每一行只会替换该行中第一个匹配成功的c:确认,在进行替换时可以选择是否进行替换。n:匹配的次数,但不进行替换

例如:

  • s/s1/s2:替换当前行第一个 s1 为 s2
  • s/s1/s2/g:替换当前行中所有 s1 为 s2
  • %s/s1/s2/g:替换文件中所有 s1 为 s2
  • %s/\<num\>/digit/g:支持正则,只匹配 num 并替换为 digit

复制粘贴

在 Normal 模式下,复制(称为 yank)和剪贴(称为 delete)的基本命令分别是 yd,而粘贴命令是 p这些命令都可以配合文本对象使用,以实现更灵活的操作。

  1. 复制操作(yank)

    • yy:复制当前行。

    • yw:复制当前单词。

    • y$:复制从光标位置到行尾的内容。

    • y0:复制从光标位置到行首的内容。

  2. 剪切操作(delete)

    • dd:剪切当前行。

    • dw:剪切当前单词。

    • d$:剪切从光标位置到行尾的内容。

    • d0:剪切从光标位置到行首的内容。

  3. 粘贴操作(put)

    • p:在光标后粘贴。

    • P:在光标前粘贴。

进入 Visual 模式后,可以选择要复制的部分,然后使用相应命令进行复制或剪切:

  • v:进入 Visual 模式,选择字符。
  • V:进入 Visual Line 模式,选择整行。
  • Ctrl + v:进入 Visual Block 模式,选择矩形块。

在选择文本后,可以使用以下命令:

  • y:复制选中的文本。
  • d:剪切选中的文本。
  • p:粘贴文本。

Vim 的复制粘贴功能非常复杂且强大,但随着时间的推移,一些功能更强大、更加方便的插件已经取代了内置的复制粘贴功能。这些插件提供了更直观和高级的文本操作方式,使得用户可以更加高效地处理文本。

由于插件的多样性和功能强大,本文不再深入探讨 Vim 内置的复杂复制粘贴功能。推荐使用插件来增强 Vim 的复制粘贴体验,例如 vim-easymotionvim-surround 等。

代码补全

现在 Vim 的补全功能已经由插件实现了,Vim 自带的补全功能基本不再使用了,这个将在插件篇进行详解。

配置文件

基础配置

在 Vim 中有非常多的设置,例如 set number 用于显示行号。但是,每次打开 Vim 都要手动进行这些操作非常麻烦。我们可以将这些设置写在 Vim 的配置文件中,每次启动 Vim 时,它会自动读取配置文件中的内容。这个配置文件位于 ~/.vimrc

以下是一些常用的基础配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
" 显示行号
set nu

" 设置主题
colorscheme hybrid

" 开启语法高亮
syntax on

" 保持上一行的缩进
set autoindent

" 设置缩进单位为 4 个空格
set shiftwidth=4

" 设置 Tab 键的宽度为 4 个空格
set tabstop=4

" 将 Tab 键自动转换为空格
set expandtab

按键映射

Vim 的按键映射是将一个操作映射到另一个操作上,常用于设置一些方便的快捷键。按键映射可以分为几种模式:Normal 模式、Visual 模式和 Insert 模式。在不同模式下定义映射的方法:

  • nmap:只在 Normal 模式下有效。
  • vmap:只在 Visual 模式下有效。
  • imap:只在 Insert 模式下有效。

以下是一些用法举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
" 在 Normal 模式下,按下空格选择整个单词
nmap <space> viw

" 在 Normal 模式下,使用 Ctrl + d 执行 `dd` 删除一行
nmap <c-d> dd

" 在 Normal 模式下,按 `<leader>o`(通常 `<leader>` 键默认为 `\`)在当前行下插入一行,并返回 Normal 模式。
nmap <leader>o o<Esc>k

" 在 Visual 模式下,按 `<leader>y` 将选中的文本复制到系统剪贴板。
vmap <leader>y "+y

" 在 Insert 模式下,按 `jk` 返回 Normal 模式。
imap jk <Esc>

小技巧

  1. 不小心按了 Ctrl + S 后编辑器假死,其实只是 Vim 停止向终端输出了,只要按下 Ctrl + Q 就可以恢复。

Vim学习笔记 #1 基础操作与配置
https://hwcoder.top/Vim-Note-1
作者
Wei He
发布于
2023年4月11日
许可协议