2.Vim 的键描述体例 + Vim 的选项和配置 + 光标移动 + 文本修改

Posted by chanweiyan on August 17, 2025

vim-command-quick-reference

Vim 的键描述体例

  • <Esc> 表示 Esc 键;显示为“⎋”
  • <CR 表示回车键;显示为“↩”
  • <Space> 表示空格键;显示为“␣”
  • <Tab> 表示 Tab 键;显示为“⇥”
  • <BS 表示退格键;显示为“⌫”
  • <Del> 表示删除键;显示为“⌦”
  • <lt> 表示 < 键;显示为“<”
  • <Up> 表示光标上移键;显示为“⇡”
  • <Down> 表示光标下移键;显示为“⇣”
  • <Left> 表示光标左移键;显示为“⇠”
  • <Right> 表示光标右移键;显示为“⇢”
  • <PageUp> 表示 Page Up 键;显示为“⇞”
  • <PageDown> 表示 Page Down 键;显示为“⇟”
  • <Home> 表示 Home 键;显示为“↖”
  • <End> 表示 End 键;显示为“↘”
  • <F1> - <F12> 表示功能键 1 到 12;显示为“F1”到“F12”
  • <S-…> Shift 组合键;显示为“⇧” (较少使用,因为我们需要写 ! 而不是 ;和特殊键组合时仍然有用)
  • <C-…> Control 组合键;显示为“⌃”
  • <M-…> Alt 组合键;显示为“⌥” 对于大部分用户,它的原始键名 Meta 应该只具有历史意义)
  • <D-…> Command 组合键;显示为“⌘”(Mac 键盘)

  • 显示当前编辑文件的文件类型 :set ft?

文本修改 *

  • 可以认为 c(修改)的功能就是执行 d(删除)然后 i(插入)
  • d 加动作来进行删除(dd 删除整行);D 则相当于 d$,删除到行尾。
  • c 加动作来进行修改(cc 修改整行);C 则相当于 c$,删除到行尾然后进入插入模式。
  • s 相当于 cl,删除一个字符然后进入插入模式;S 相当于 cc,替换整行的内容。
  • i 在当前字符前面进入插入模式;I 则相当于 ^i,把光标移到行首非空白字符上然后进入插入模式。 -a 在当前字符后面进入插入模式;A 相当于 $a,把光标移到行尾然后进入插入模式。
  • o 在当前行下方插入一个新行,然后在这行进入插入模式;O 在当前行上方插入一个新行,然后在这行进入插入模式。
  • r 替换光标下的字符;R 则进入替换模式,每次按键(直到 )替换一个字符。
  • u 撤销最近的一个修改动作;U 撤销当前行上的所有修改。

文本对象选择 *

还有几个动作只能在 c、d、v、y 这样命令之后用

  • dw - delete word
  • diw - delete inside word
  • daw - delete a word
  • diW
  • daW
  • di"
  • di(di)
  • da(da)

上面演示了 a、i 和 w、双引号、圆括号搭配使用,这些对于任何语言的代码编辑都是非常有用的

  • 搭配 s(sentence)对句子进行操作——适合西文文本编辑
  • 搭配 p(paragraph) 对段落进行操作——适合西文文本编辑,及带空行的代码编辑
  • 搭配 t(tag)对 HTML/XML 标签进行操作——适合 HTML、XML 等语言的代码编辑
  • 搭配 `` 和 ' 对这两种引号里的内容进行操作——适合使用这些引号的代码,如 shell 和 Python
  • 搭配方括号(“[”和“]”)对方括号里的内容进行操作——适合各种语言(大部分都会用到方括号吧)
  • 搭配花括号(“{”和“}”)对花括号里的内容进行操作——适合类 C 的语言
  • 搭配角括号(“<”和“>”)对角括号里的内容进行操作——适合 C++ 的模板代码

再进一步,在 a 和 i 前可以加上数字,对多个(层)文本对象进行操作 c2i{

重复功能 *

  • ; 重复最近的字符查找(f、t 等)操作
  • , 重复最近的字符查找操作,反方向
  • n 重复最近的字符串查找操作(/ 和 ?)
  • N 重复最近的字符串查找操作(/ 和 ?)
  • 反方向. 重复执行最近的修改操作
  • . 重复执行最近的修改操作

光标移动

  • w - 跳到下一个词的开始
  • e - 跳到词的结尾
  • f - find
  • t - tail
  • () 移到上一句和下一句
  • {} 移到上一段和下一段
  • gg 文件开头
  • G 文件结尾
  • zz 将光标所在的行居中

更快地移动

  • 可以使用 <PageUp><PageDown> 来翻页,但 Vim 更传统的用法是 <C-B><C-F>,分别代表 Backward 和 Forward。

control + b 后退一页

control + f 前进一页

  • 除了翻页,Vim 里还能翻半页,有时也许这种方式更方便,需要的键是 <C-U><C-D>,Up 和 Down。

  • 数字 + G 跳转到指定行
  • 数字 + | 跳转到指定列
用 vim -c ‘normal 5G36 ’ 来执行跳转到出错位置第 5 行第 36 列
  • 快速移动光标到屏幕的顶部、中间和底部:用 H(High)、M(Middle)和 L(Low)就可以做到

6H 将光标移动到屏幕顶部第6行 和 6L将光标移动到屏幕底部第6行

  • 把当前行“滚动”到屏幕的顶部、中部或底部。Vim 里的对应按键是 ztzzzb

Vim 的选项和配置

cat ~/.vimrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 设置编辑文件的内码是 UTF-8(非所有平台缺省,但为编辑多语言文件所必需)
set enc=utf-8
# 设置 Vim 不需要和 vi 兼容(仅为万一起见,目前大部分情况下这是缺省情况)
set nocompatible
# 导入 Vim 的示例配置(这会打开一些有用的选项,如语法加亮、搜索加亮、命令历史、记住上次的文件位置,等等)
source $VIMRUNTIME/vimrc_example.vim


# 备份和撤销文件
set backup # 每次编辑会保留上一次的备份文件
set undofile # 使得 Vim 在重新打开一个文件时,仍然能够撤销之前的编辑(undo),这就会产生一个保留编辑历史的“撤销文件”(undofile)了



  • zz 在 vim 中,输入 zz 可以将当前行滚动到屏幕中央

  • :set undodir? 查看把撤销文件放在用户个人的哪个特定目录下。既保证了安全,又免去了其他目录下出现不必要文件的麻烦
  • :set nobackup? 查看是否设置了不备份

undodir=~/.vim_runtime/temp_dirs/undodir

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 这段代码是 Vim 或 Neovim 配置脚本中的一部分,用于自动创建撤销文件(undo file)的存储目录。它的作用是确保撤销历史能够持久化保存,即使关闭 Vim 后重新打开文件,仍然可以撤销之前的操作。

# 1. if !isdirectory(&undodir)
#    &undodir
#    这是 Vim 的一个选项(option),表示撤销文件的存储目录(通常通过 set undodir=... 设置)。
#    isdirectory()
#    Vim 内置函数,检查给定的路径是否存在且是一个目录。
#    !
#    逻辑非运算符,表示“如果目录不存在”。
# 作用:
# 检查 undodir 设置的目录是否存在。如果不存在,则执行 mkdir 创建它。


# 2. call mkdir(&undodir, 'p', 0700)
#    mkdir()
#    Vim 内置函数,用于创建目录。
#    参数说明:
#    &undodir:要创建的目录路径。
#    'p':
#    表示递归创建父目录(类似 mkdir -p 命令),如果路径中的上级目录不存在,会自动创建。
#    0700:
#    设置目录权限(八进制格式):
#    7 = 用户可读、可写、可执行(rwx)。
#    0 = 组和其他用户无权限。
# 作用:
# 以安全的方式创建 undodir 目录,并确保只有当前用户有权限访问。

if !isdirectory(&undodir)
  call mkdir(&undodir, 'p', 0700)
endif

  • :help isdirectory()
  • :help mkdir()
  • :help call
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 这段代码是 Vim/Neovim 的鼠标支持配置,它会根据不同的运行环境(终端或 GUI)智能启用鼠标功能。下面是对代码的详细解析:
# 代码功能
#   检测系统是否支持鼠标 (has('mouse'))
#     如果支持,则继续判断运行环境。
#   根据环境设置鼠标模式:
#     GUI 或 xterm 终端:启用全功能鼠标 (mouse=a)
#     其他终端(如 macOS 终端):启用有限鼠标支持 (mouse=nvi)

# 逐行解析
# 1. if has('mouse')
#    作用:检查当前 Vim 是否编译了鼠标支持。
#    说明:
#    如果 Vim 是在没有鼠标支持的情况下编译的(比如某些精简版),则跳过整个配置。
# 2. if has('gui_running') || (&term =~ 'xterm' && !has('mac'))
#    条件 1: has('gui_running')
#    判断是否在 GUI 版本的 Vim(如 gvim、MacVim)中运行。
#    条件 2: &term =~ 'xterm' && !has('mac')
#    &term =~ 'xterm':检查当前终端类型是否是 xterm 或兼容终端(如 Linux 下的 GNOME Terminal)。
#    !has('mac'):排除 macOS 原生终端(通常对鼠标支持较差)。
#    效果:在 Linux/Unix 的 xterm 终端中启用鼠标,但跳过 macOS 终端。
# 3. set mouse=a
#    作用:
#    在 GUI 或 xterm 终端 中启用全功能鼠标支持:
#    点击移动光标
#    滚轮滚动
#    拖拽选择文本
#    调整窗口大小
# 4. else
#    作用:
#    如果不在 GUI 或 xterm 中(比如 macOS 原生终端、SSH 连接等),则进入保守模式。
# 5. set mouse=nvi
#    作用:
#    启用有限鼠标支持,仅允许:
#    Normal 模式 (n):用鼠标移动光标
#    Visual 模式 (v):用鼠标选择文本
#    Insert 模式 (i):点击移动光标
# 6. endif
#    结束条件判断块。

if has('mouse')
  if has('gui_running') || (&term =~ 'xterm' && !has('mac'))
    set mouse=a
  else
    set mouse=nvi
  endif
endif

  • set guifont?

guifont=Hack_Nerd_Font_Mono:h16