Vim 的历史记录主要分为以下几类:

- 命令行历史:你输入过的 命令。
- 搜索模式历史:你输入过的 (向下搜索) 和 (向上搜索) 模式。
- 表达式寄存器:存储你输入过的 命令中的表达式。
- 输入行历史:在对话框或命令行中输入过的文本。
下面我们逐一详细讲解。
命令行历史
这是最常用到的历史记录,指的是你在普通模式下按 进入命令行模式后,输入过的所有命令。
如何访问和使用
-
向上/向下翻查:
- 在命令行模式下,按
<Up>(↑) 或<Ctrl-P>可以向前(从旧到新)浏览历史命令。 - 按
<Down>(↓) 或<Ctrl-N>可以向后(从新到旧)浏览历史命令。
- 在命令行模式下,按
-
自动补全:
(图片来源网络,侵删)- 在输入命令的一部分后,按
<Tab>键可以尝试自动补全命令,如果存在多个匹配项,可以连续按<Tab>在它们之间循环切换。 - 示例:输入
b然后按<Tab>,可能会在bdelete,bnext,bprevious等之间切换。
- 在输入命令的一部分后,按
-
执行历史命令:
- 浏览到你想要的命令后,按
<Enter>执行它。 - 浏览过程中,按
<Esc>可以取消当前输入,返回普通模式。
- 浏览到你想要的命令后,按
管理命令行历史
Vim 将这些历史记录存储在内存中,当你退出 Vim 时,默认情况下它们不会被保存,如果你想跨会话使用历史记录,需要进行配置。
-
查看历史命令列表: 在命令行模式下输入
history,然后按<Enter>,它会显示所有类型的历史记录(命令、搜索等),并带有一个编号。1 11s/foo/bar/g 2 1,$s/foo/bar/g 3 w 4 %s/foo/bar/g 5 /foo 6 ?bar 7 :history开头的行是命令历史。
1 11s/foo/bar/g表示第 1 条历史记录是11s/foo/bar/g。
(图片来源网络,侵删) -
执行特定编号的命令: 使用
history {num}来查看某条记录的详细信息,然后使用 来执行最近一次的 命令。 更直接的方法是使用{num}来执行编号为{num}的命令。3会执行编号为 3 的命令,也就是w。 -
保存历史记录到文件: 使用
history {cmd} > {filename}可以将命令历史保存到文件。history : > my_cmd_history.txt -
配置自动保存: 在你的
.vimrc文件中添加以下配置,可以让 Vim 在退出时自动保存命令行和搜索历史到viminfo文件中。" 设置读取和写入 viminfo 文件 set viminfo+=! " ! 表示保存全局变量(包括命令历史) " 也可以更精确地控制 set viminfo='10,<50,s10,h " 保存10个命令行历史,50行行首标记等
默认情况下,Vim 会使用一个名为
viminfo的文件来存储这些信息,文件路径可以通过set viminfo?查看。
搜索模式历史
这指的是你使用 (向前搜索) 和 (向后搜索) 时输入过的模式。
如何访问和使用
-
访问 历史: 在普通模式下按 进入搜索模式后,按
<Up>(↑) 或<Ctrl-P>可以向前浏览你之前用 搜索过的模式。 -
访问 历史: 在普通模式下按 进入搜索模式后,按
<Up>(↑) 或<Ctrl-P>可以向前浏览你之前用 搜索过的模式。 -
自动补全: 和命令行类似,在输入搜索模式的一部分后,按
<Tab>可以自动补全。 -
在历史中切换:
- 历史和 历史是分开存储的。
- 在 模式下,按
<Down>(↓) 或<Ctrl-N>会向后浏览(更近的搜索)。 - 按
<Esc>可以取消搜索。
管理搜索模式历史
搜索模式历史也默认保存在 viminfo 文件中,所以配置 viminfo 的设置同样会影响它的持久化。
-
查看搜索历史: 使用
history /来查看所有 搜索历史。 使用history ?来查看所有 搜索历史。 -
执行特定编号的搜索: 和命令历史类似,你可以先查看编号,然后使用 来执行最近一次的 搜索,或者直接使用
{num}来执行编号对应的搜索命令。
表达式寄存器
这是一个稍微特殊但非常强大的“历史”,它存储了你上次在命令行中输入的表达式(即 命令中 后面的部分)。
如何访问和使用
-
触发表达式输入: 在命令行模式下,输入 然后按
<Enter>,Vim 会进入一个小的输入窗口,让你输入一个表达式,计算后会替换掉 。 -
访问表达式历史: 在输入 之后,窗口打开时,你可以使用
<Up>(↑) 和<Down>(↓) 来浏览你之前输入过的所有表达式。 -
执行表达式: 选择一个历史表达式后,按
<Enter>会计算它,并将结果粘贴回原始的命令行中。
示例:
- 在普通模式下,输入
echo <C-R>=<Up>(这里<Up>是为了演示,实际操作时你会看到历史)。 - 按下
<Enter>后,会弹出一个窗口,里面是你上次输入的表达式。 - 你可以用
<Up>/<Down>选择,然后按<Enter>确认,该表达式的结果会替换掉 ,最终执行类似echo 123的命令。
输入行历史
这个历史记录主要用于 Vim 的对话框或用户自定义的输入行,prompt 命令创建的输入环境,它的使用方法和命令行历史类似,用 <Up>/<Down> 浏览,但使用频率相对较低。
总结与最佳实践
| 历史类型 | 触发方式 | 浏览快捷键 | 持久化方式 | 主要用途 |
|---|---|---|---|---|
| 命令行历史 | <Up>, <Down>, <Ctrl-P>, <Ctrl-N> |
viminfo 文件 |
快速重复执行 w, q, set 等命令 |
|
| 搜索模式历史 | 或 | <Up>, <Down>, <Ctrl-P>, <Ctrl-N> |
viminfo 文件 |
快速重复搜索相同的字符串 |
| 表达式历史 | (在命令行中) | <Up>, <Down> |
viminfo 文件 |
快速重复使用复杂的计算表达式 |
| 输入行历史 | prompt 等 |
<Up>, <Down> |
viminfo 文件 |
在特定输入环境中重复输入 |
推荐的 .vimrc 配置
为了获得最佳体验,建议在你的 .vimrc 中添加以下配置:
" 启用 viminfo 文件,用于保存命令历史和搜索历史 " '10: 保存10个命令行历史 " <50: 保存50个行标记 " s10: 保存10个搜索模式 " h: 保存文件查找历史 set viminfo='10,<50,s10,h " (可选) 指定 viminfo 文件的路径 " set viminfo+=n~/.vim/viminfo " 让命令行历史更智能,忽略空命令和重复命令 " 需要较新版本的 Vim " set history=1000 " 默认值,可以增大 " set wildmenu " set wildmode=longest,list,full
实战技巧
-
快速修正上一个命令: 输入了一个错误的 命令并按了
<Enter>,不要慌!直接按 ,然后按<Up>找到上一个命令,用方向键移动光标修改即可。 -
模糊查找历史命令: 虽然没有直接的模糊搜索,但你可以利用命令补全,如果你记得命令的开头几个字母,输入后按
<Tab>是一个非常高效的方法。 -
结合 和 : 如果你刚用 搜索过某个单词,想用
s命令替换它,可以直接输入s//new_word/g,这里的 会自动使用上一次的搜索模式,非常方便。
掌握 Vim 的历史记录功能,能极大地减少你的重复输入,让你更专注于文本本身,从而真正实现“编辑器之神”所承诺的流畅高效。
