帮助总览 ·
快速参考 ·
命令索引 ·
函数列表 ·
选项列表 ·
用户手册 ·
参考手册 ·
Vim 全称是 Vi IMproved (增强版 Vi)。它最初是 Vi IMitation (Vi 模仿版) 的缩写,
随着功能大幅迭代升级,有必要同时为它正名。Vim 几乎包含了 unix "Vi" 编辑器的全
部命令,同时新增大量指令。十分适用于代码编写和常规文本编辑。
所有操作命令均可通过键盘输入。这种设置使用户双手不离键盘,视线专注屏幕,全身心
投入编辑工作。当前,Vim 也支持鼠标操作,同时还提供带有滚动条和菜单栏的图形界面
版本 (见 gui.txt )。
完整手册总览可参见 help.txt 文档。在 Vim 中,按下 <help> 或 <F1> 键、或使用
:help 命令 (直接键入 ":help" 即可,无需竖线或引号) 都可访问主帮助页。
主帮助文档不在默认位置时,可用 'helpfile' 选项手动指定路径。借助标签跳转可查阅
帮助主题: 按下 CTRL-] 跳转到光标所在主题,CTRL-T 跳回。
如需了解 Vim 和 Vi 的差异,请参考 vi_diff.txt 。
本手册适用于全平台的 Vim。不同设备和终端在表现可能略有区别。除本文说明外,各平
台专属文档参见 sys-file-list 。
pronounce
Vim 读作一个词,发音类似 Jim,而不是 vi-ai-em。作为专用名称,首字母习惯大写,
也可参照作为人名的 Jim。Vim 的 GUI 版本写作 "gVim" (句首也可写作 "GVim")。
本文档是包含 Vim 全部命令和选项的参考手册。并非介绍 Vi 或 Vim 用法的入门教程,
内容相对繁杂。对于初学者,建议先上手实地演练教程 tutor 。要系统学习 Vim 用
法,请阅读用户手册 usr_toc.txt 。
book books
市面上有许多讲解 Vi 和 Vim 的书籍,多数都配有入门章节。也有部分书籍聚焦特定高
级功能。Vim 相关书籍汇总页面:
http://iccf-holland.org/vim_books.html
Vim 的主体代码由布拉姆·莫勒纳尔 (Bram Moolenaar <Bram@vim.org>) 开发
Bram-Moolenaar 。
本文档部分内容改编自多位作者编写的 Vi 官方插曲,原作者包括:
W.N. Joy
Alan P.W. Hewett
Mark Horton
Vim 编辑器基于 Stevie 开发 ,同时汲取了多款其他软件的设计思想。以下名单中的众
多开发者均参与了相关工作。此外,还有无数爱好者提交补丁、提出建议以及正反各种反
馈,助力 Vim 不断完善,这里恕无法一一提及。
如果没有这些人的付出,就不会有如今的 Vim!
Bram Moolenaar Vim 创始人,直至过世以前 (2023 年 8 月 3 日)
一直以仁慈独裁者身分领导项目开发
Ron Aaron Win32 图形界面版本相关修改
Mohsin Ahmed 加密功能开发
Zoltan Arpadffy VMS 系统移植工作
Tony Andrews 参与 Stevie 开发
Gert van Antwerpen 适配 MS-DOS 下 DJGPP 环境
Berkeley DB(3) 提供交换文件实现的想法
Keith Bostic Nvi 作者
Walter Briscoe Makefile 的更新和各种补丁
Ralf Brown 为 MS-DOS 提供 SPAWNO 库
Robert Colon 提供大量实用建议
Marcin Dalecki GTK+ 图形界面移植、工具栏图标、gettext() 支持
Kayhan Demirel 分享乌干达最新信息
Chris & John Downey xvi (提供多窗口实现思路)
Henk Elbers 最早 VMS 移植版本
Daniel Elstner GTK+ 2 移植版本
Eric Fischer Mac 系统移植版本、'cindent' 、及其他改进
Benji Fisher 解答大量用户问题
Bill Foster Athena 图形界面移植 (后来被移除)
Google 让 Bram 每周抽出一天时间专职开发 Vim
Loic Grenie xvim (提供多窗口实现思路)
Sven Guckes Vim 推广者、曾任官网维护者 Sven-Guckes
Darren Hiebert Exuberant ctags 作者
Jason Hildebrand GTK+ 2 移植版本
Bruce Hunsaker 优化 VMS 移植版本
Andy Kahn 提供 Cscope 支持,GTK+ 图形界面移植版本
Oezguer Kesim Vim 邮件列表维护者
Axel Kielhorn Macintosh 系统移植工作
Steve Kirkendall Elvis 作者
Roger Knobbe 最早 Windows NT 移植版本
Sergey Laskavy 来自莫斯科的 Vim 技术支持
Felix von Leitner 曾任 Vim 邮件列表维护者
David Leonard Python 扩展 Unix 移植版本
Avner Lottem 窗口从右向左编辑功能
Flemming Madsen X11 客户端-服务器,各类功能和补丁
Tony Mechelynck 解答大量用户问题
Paul Moore Python 接口扩展,大量补丁
Katsuhito Nagano 多字节字符版本开发
Sung-Hyun Nam 多字节字符版本开发
Vince Negri Win32 图形界面和控制台版本功能增强
Steve Oualline 首部 Vim 书籍作者 frombook
Dominique Pelle 借助 Valgrind 排查问题及诸多修正
A.Politz 诸多漏洞报告并修复部分问题
George V. Reilly 最先从事 Win32 及其图形界面版本的移植工作
Stephen Riehm 漏洞收集整理
Stefan Roemer 各类补丁、为用户提供帮助
Ralf Schandl IBM OS/390 移植版本
Olaf Seibert DICE 和 BeBox 版本、正则表达式增强
Mortaza Shiran 波斯语补丁
Peter da Silva 终端函数库 (termlib) 开发
Paul Slootman OS/2 移植版本
Henry Spencer 正则表达式
Dany St-Amant Macintosh 移植版本
Tim Thompson 参与 Stevie 开发
G. R. (Fred) Walter 参与 Stevie 开发
Sven Verdoolaege Perl 接口
Robert Webb 命令行补全、图形界面版本和众多补丁
Ingo Wilken Tcl 接口
Mike Williams PostScript 打印
Juergen Weigert Lattice 版本、AUX 改进、UNIX 和 MS-DOS 移植及
自动编译配置 (autoconf)
Stefan 'Sec' Zehl vim.org 官网维护者
Yasuhiro Matsumoto 大量 MS-Windows 改进
Ken Takata 漏洞修正和新功能开发
Kazunobu Kuriyama GTK 3 适配
Christian Brabandt 众多漏洞修正、功能开发、用户支持等
Yegappan Lakshmanan 众多快速修复功能、Vim9 脚本改进
Doug Kearns 运行时文件维护者
Foxe Chen Wayland 协议支持、新功能开发
glepnir 补全功能的改进和修正
Girish Palya 插入/命令行自动补全、全能补全函数 (omnifunc)
开发、搜索/替代补全等众多功能
Hirohito Higashi 众多补丁和修正
Yee Cheng Chin MacVim 维护者、比较功能改进
zeertzjq 众多修正和改进
在此感谢所有提交漏洞报告和功能建议的朋友,人数众多,无法一一列举。没有大家的想
法与反馈,就不会有如今的 Vim: 是你们让 Vim 不断焕发生机!
love peace friendship gross-national-happiness
本文档多次提及各类 Vi 衍生版本,相关说明如下:
Vi vi
Vi "原版"。如无额外说明,均指代 Sun OS 4.x 搭载的 Vi。执行 ":version" 会
显示版本号 "Version 3.7, 6/7/85"。文中偶尔也会提及其他 Vi 版本。原版
Vi 仅可在 Unix 下运行。如今其源码已基于 BSD 风格许可证开源。详见:
http://ex-vi.sourceforge.net/
Posix
Posix 来自 IEEE 1003.2 标准第 2 部分: 外壳与工具。通称 "Posix"。这份文档从文
本层面规定了 Vi 的标准行为。
参见 posix-compliance 。
Nvi
Nvi "新 (New)" vi 的缩写。这是 4.4 BSD 和 FreeBSD 系统搭载的 Vi 版本。高度
兼容原版 Vi,并附带少量扩展功能。主流版本为 1.79。执行 ":version" 会显
示版本号 "Version 1.79 (10/23/96)"。该项目近年来已无正式版本发布,仅存
在开发版 1.81。源代码自由发放。
Elvis
Elvis 另一款 Vi 克隆版本,由 Steve Kirkendall 开发。程序体量小巧,但灵活性不
及 Vim。目前项目已经停止开发。猫王已不在 (译者注: 原文是 Elvis has
left the building,意为表演结束了,Elvis 这里有双关意思)!源代码自由发
放。
Neovim
Neovim 2014 年从 Vim 衍生出的分支,发展路线与 Vim 截然不同。项目深度依托
GitHub,依赖组件更多,提升了开发复杂度,也削弱了跨平台能力。代码经过大
规模重构,补丁无法与 Vim 通用。支持远程 UI 界面,原生深度适配 Lua 脚
本。
阅读本文档时如果开启语法高亮功能,通常会用 Special 组高亮显示非本义输入文本,
包括 (),{} 和 <> 包围的项目,以及 CTRL-X 这类按键。
注意 Vim 命令会使用所有可用字符。有时 [],{} 和 <> 本身也是输入的一部分,具体
依上下文而定。
[] 方括号内的内容为可选项。
count [count]
[count] 可选数值前缀,用于指定命令执行次数。省略时假定计数为一 (特殊说
明除外)。注意,在本手册中,为便于查阅,[count] 不会在命令语法
中重复标注,仅在释义中说明。打开 'showcmd' 选项后,已输入的计
数部分会显示在窗口底部。按 <Del> 键会删除末位数位 ( N<Del> )。
[quotex]
["x] 可选寄存器标识,用于保存文本。参见 registers 。x 为单个字符,
可选值为 'a' 到 'z' 或 'A' 到 'Z' (大小写英文字母) 以及 '"'。
放置等命令中,还可额外使用 '0' 到 '9'、'%'、'#' 等字符。同一字
母的大小写指向同一个寄存器,小写字母覆盖原有内容,大写字母则追
加新内容。省略 "x 或使用 "" 则默认使用无名寄存器。
{}
{} 花括号表示必填内容,但有多种合法值可选。此外,Vim 与 Vi 的差异
也放在花括号内标明,结合上下文易区分两种用法。
{char1-char2}
{char1-char2} 取值范围在 char1 到 char2 之间的单个字符,如 {a-z} 代表任意小
写字母。可串接多个区间,如 {a-zA-Z0-9} 代表任一数位或字母。
{motion} movement
{motion} 光标移动命令,也称为动作。相关说明见 motion.txt 。例如:
w 跳至下一个单词开头
b 跳至当前单词开头
4j 下移四行
/The<CR> 跳至下一处 "The"
动作出现在操作符 operator 之后,指定操作的文本范围。规则是:
- 动作包含计数,且操作符也包含计数时,最终计数为两者乘积。如
2d3w 会删除共六个单词。
- 支持反向动作,如 db 反向删除至当前单词开头。
- 鼠标点击也是动作的一种。但并非所有终端都支持鼠标。
- 可通过 :omap 命令在等待操作符时映射按键。
- 可通过 Ex 命令移动光标。借此调用函数实现复杂动作。
此类动作 (无论具体哪条 ":" 命令) 总为字符级开 (exclusive) 动
作。这意味着除非设置 'virtualedit' ,要包含行末字符,必须同时
包含换行符。
如果 Ex 命令修改了操作起始位置之前的文本、或是跳转到其他缓冲
区,执行结果不可预测。允许修改操作范围之后的文本。当前缓冲区
保持加载状态时,也可跳转到其他缓冲区。
{Visual}
{visual} 表示可视选区。先用 v 、 V 或者 CTRL-V 命令进入可视模式并设置
开始位置,再配合任意光标移动命令选择结束位置,调整选区范围。
和 {motion} 不同,可视选区在操作符 operator 之前应用,高亮用
作操作符作用范围的文本。
参见 visual-mode 。
<character>
<character> 代表特殊字符,可额外搭配修饰符,也可指已带修饰符的单个 ASCII
字符。具体参考下方按键对照表。
'character'
'c' 单个 ASCII 字符。
CTRL-{char}
CTRL-{char} 控制键组合,具体操作是按住 CTRL 键的同时按下 {char}。
{char} 不区分大小写;CTRL-A 和 CTRL-a 效果相同。但部分终端中按
下 SHIFT 会生成不同键码,此时请勿按 SHIFT 键。
'option'
'option' 单引号括起来的是选项,也称为配置参数。可读可写。见 options 。
quotecommandquote
"command" 双引号括起来的是可手动输入的命令。
command 反引号括起来的新式命令标记,用于和其他引号括起的常规文本和字符
串做区分 (译者注: 反引号显示时被隐藏,注意识别)。
key-notation key-codes keycodes
文档中会提到以下按键名称。也可在 :map 命令里使用 (先按 CTRL-K 再按目标按键,
即可插入对应的按键名称)。
按键名称 含义 等效键 十进制值
备注: 带 Shift 的方向键,帮助键和撤销键仅在少数终端可用。在 Amiga 系统上,可用
Shift+F10 生成命令序列引入码 (CSI),但该键也可用于键序列。必需搭配后续按键才
能被正确识别为 CSI。
备注: 删除键对应两个键码。十进制编码 127 是标准 ASCII 删除码,总能被正确识别。
但部分设备的删除键会发送由 <t_kD> 定义的另一组编码。两类编码效果完全一致。另见
:fixdel 。
备注: 小键盘按键与对应 "普通" 按键缺省效果一致。例如 <kHome> 和 <Home> 等价。
小键盘按键发送的原始键码与对应 "普通" 按键相同时,Vim 会将其判定为 "普通" 按键
而不应用专用于小键盘按键的映射。例如,假定 <kHome> 发送与 <Home> 相同的编码,
按下 <kHome> 时,Vim 会作为 <Home> 处理。<kHome> 映射会失效。
<>
文档中常使用 <> 记法标注按键。有时代表实际输入键 (为清晰起见),多数场景下代表
按本义输入序列 (如在 :map 系列命令内可用)。使用规则是:
1. 除 '\' 和 '<' 外,其余可显示字符直接输入。
2. 要表示 '\',可用双反斜杠 "\\" 或 "<Bslash>"。
3. 要表示 '<',可用 "\<" 或 "<lt>"。无歧义时也可直接使用 '<'。
4. 用 <key> 标记输入的特殊键。对应上表的按键名称。示例:
<Esc> 转义键
<C-G> CTRL-G
<Up> 光标上移键
<C-LeftMouse> Control+鼠标左键点击
<S-F11> Shift+功能键 11
<M-a> Meta+a ('a' 但置位字符第 8 位)
<M-A> Meta+A ('A' 但置位字符第 8 位)
<t_kd> termcap 中 "kd" 项对应按键 (相当于光标下移键)
虽然可以为多字节字符 {char} 指定 <M-{char}> 记法,但 Vim 无法理解其代表的
字节序列,所以通常无法正常工作。
要在 Vim 里使用 <> 完整记法,必须确保 'cpoptions' 里不包含 '<' 标志位 cpo-<
(复位 'compatible' 时,这是缺省值)。否则,可手动设置:
:set cpo-=<
在 <> 记法里,<lt> 代表实际 '<' 键,抵消 <> 包围的键名序列的特殊含义。也可用反
斜杠转义,但后者要求 'cpoptions' 里排除 'B' 标志位 cpo-B (并非缺省)。
以下两种写法可将 CTRL-H 映射成六个字符 "<Home>":
:imap <C-H> \<Home>
:imap <C-H> <lt>Home>
第一种写法仅当 'cpoptions' 里排除 'B' 标志位时才可用。第二种总是可用。
要在映射中输出按本义出现的 "<lt>" 字符序列:
:map <c-l> <lt>lt>
此记法确保文档中映射,缩写和菜单命令示例均可直接复制-粘贴到 Vim 中执行。也可手
动键入包含 '<' 和 '>' 的序列。但在 :set 和 :autocmd 等命令中,该记法 不
适用!
此记法也可用于以 "\<" 开始的双引号字符串,如 "\<C-Space>"。解析结果是对应特殊
键码。要将键码转回可读文本,可用 keytrans() 函数。
Vim 有七种 基本 模式:
Normal Normal-mode command-mode
普通模式 可执行各类常规编辑命令。启动 Vim 后,缺省进入此模式
(开启 'insertmode' 选项除外,见下)。亦称为命令
(command) 模式。
可视模式 类似普通模式,但光标移动命令会扩展高亮区域。而执行非移
动类命令时,操作会作用于高亮区域。见 Visual-mode 。
置位 'showmode' 选项时,窗口底部会显示 "-- 可视 --"。
选择模式 外观类似 MS-Windows 的选区模式。输入可显示字符会清空选
区并进入插入模式。见 Select-mode 。
置位 'showmode' 选项时,窗口底部会显示 "-- 选择 --"。
插入模式 输入内容,直接写入缓冲区。见 Insert-mode 。
置位 'showmode' 选项时,窗口底部会显示 "-- 输入 --"。
命令行模式 也可缩写为 Cmdline 模式。可在窗口底部输入单行文本。用
于执行 Ex 命令 ( : ),正则模式搜索命令 ( ? 和 / ) 及
过滤命令 ( ! )。 Cmdline-mode
Ex 模式 类似命令行模式,但执行完命令后仍停留在 Ex 模式。命令行
编辑能力非常有限。 Ex-mode
终端作业模式 用于在终端窗口中与后台作业交互。按键输入会传递给作业,
作业输出会在终端窗口中显示。要切换到其他模式,可见
terminal 。
Vim 还有七种 衍生 模式,均由基本模式变化而来:
Operator-pending Operator-pending-mode
操作符等待模式 类似普通模式,但在操作符后,Vim 会等待输入光标移动指令
(动作) {motion},指定操作的文本范围。
替换模式 插入模式的特殊变体。操作逻辑和输入模式一致,但每输入一
个字符,就会覆盖原有文本一个字符。见 Replace-mode 。
置位 'showmode' 选项时,窗口底部会显示 "-- 置换 --"。
虚拟替换模式 类似替换模式,但替换的是屏幕显示位置,而非文件内实际字
符。见 Virtual-Replace-mode 。
置位 'showmode' 选项时,窗口底部会显示
"-- V-替换 --"。
插入普通模式 在插入模式下输入 CTRL-O (见 i_CTRL-O ) 即可进入。类似
普通模式,但执行单条命令后会自动返回插入模式。
置位 'showmode' 选项时,窗口底部会显示
"-- (插入) --"。
终端普通模式 在终端窗口中进入的普通模式。无法使用修改命令。 a 或
i 等插入命令可返回终端作业模式。
插入可视模式 在插入模式下开启可视选择时,即可进入,例如先按 CTRL-O
然后按 v 、 V 或 CTRL-V。结束选区操作后会自动返回插
入模式。
置位 'showmode' 选项时,窗口底部会显示
"-- (插入) 可视 --"。
插入选择模式 在插入模式下启动选择模式,如用鼠标拖拽或按 <S-Right>,
即可进入。退出选择模式后会自动返回插入模式。
置位 'showmode' 选项时,窗口底部会显示
"-- (插入) 选项 --"。
如果因为某种原因不能确定当前所处模式,总是可以通过连续按两次 <Esc> 即可返回普
通模式。唯一例外是 Ex 模式,需用 :visual 返回普通模式。
按下 <Esc> 后,如果发现屏幕闪烁或者响铃,就证明已经回到普通模式。
但在插入模式下按 CTRL-O 后再按 <Esc> 也会响铃,但仍停留在插入模式,需再按一次
<Esc> 才可返回普通模式。
i_esc
切换 目标模式
普通 可视 选择 插入 替换 命令行 Ex
当前模式
普通 v V ^V *4 *1 R gR : / ? ! Q
可视 *2 ^G c C -- : --
选择 *5 ^O ^G *6 -- -- --
插入 <Esc> -- -- <Insert> -- --
替换 <Esc> -- -- <Insert> -- --
命令行 *3 -- -- :start -- --
Ex :vi -- -- -- -- --
-- 无法切换
*1 i 、 I 、 a 、 A 、 o 、 O 、 c 、 C 、 s 或 S 命令可从普通模式切换到插
入模式。
*2 非移动类命令执行完毕后,会从可视模式切换到普通模式。也可用 <Esc>、 v 、 V
或 "CTRL-V" (见 v_v ) 命令退出可视模式而无副作用。
*3 从命令行模式切换到普通模式:
- 按下 <CR> 或 <NL>,执行键入命令完毕后结束命令行。
- 清空整行 (如用 CTRL-U)、再按一次 <BS> 后结束命令行。
- 按下 CTRL-C 或 <Esc>,退出命令行模式而不执行命令。
最后一种情况的特例,如果 'wildchar' 定义为 <Esc>,按 <Esc> 会开启命令行补
全。此时再按一下 <Esc> 即可忽略补全并结束命令行。
*4 从普通模式切换到选择模式,可用:
- 'selectmode' 里包含 "mouse" 时,用鼠标选中文本
- 'selectmode' 里包含 "key" 时,用 Shift + 光标移动特殊键 (ijkl 等可显示字
符不可用)
- 'selectmode' 里包含 "cmd" 时,用 v 、 V 或 "CTRL-V" 命令
- 用 gh 、 gH 或 "g CTRL-H" g_CTRL-H
*5 不按 Shift 的光标移动特殊键 (ijkl 等可显示字符不可用) 可从选择模式切换到普
通模式。
*6 输入任意可显示字符即可从选择模式切换到插入模式。插入该字符的同时清空选区。
打开 'insertmode' 选项后,开始编辑文件时会直接进入插入模式。
CTRL-\_CTRL-N i_CTRL-\_CTRL-N c_CTRL-\_CTRL-N v_CTRL-\_CTRL-N
另外,CTRL-\ CTRL-N 或 <C-\><C-N> 可从任意模式切换到普通模式。该方式不会像
<Esc> 那样产生响铃。然而和 <Esc> 一样,也不能用于 Ex 模式。在 f 、 m 等接受
单字符参数的命令后使用该组合时,等待超时由 'ttimeoutlen' 决定。
终端窗口获得焦点时,CTRL-\ CTRL-N 会临时切换到 (终端) 普通模式,执行完单个编辑
命令后返回原有状态,见 t_CTRL-\_CTRL-N 。
CTRL-\_CTRL-G i_CTRL-\_CTRL-G c_CTRL-\_CTRL-G v_CTRL-\_CTRL-G
CTRL-\ CTRL-G 或 <C-\><C-G> 在 'insertmode' 打开时切换到插入模式,否则切换到普
通模式。可从任意模式切换到 'insertmode' 指定的缺省模式 (译者注: 和 <Esc> 和
CTRL-\_CTRL-G 一样,也不能用于 Ex 模式)。
Q mode-Ex Ex-mode Ex EX E501
Q 进入 "Ex" 模式。该模式连续执行 Ex 命令,和逐条输入 :
命令类似,但有如下区别:
- 无需反复输入 ":"。
- 每条命令执行后不会自动刷新屏幕。
- 不支持常规命令行编辑功能。
- 映射和缩写均不生效。
仅可使用基础 "标准" 行编辑器功能: <Del> 或 <BS> 删除字
符,CTRL-U 清空整行。
在外壳命令行上使用 "ex" 命令名或使用启动参数 -e 时,
Vim 会缺省进入本模式。
执行 :vi 命令 (全名为 :visual ) 退出 "Ex" 模式。
注意: 旧版 Vim 中 "Q" 用于排版文本,现已改用 gq 。但
加载 vimrc_example.vim 或 defaults.vim 脚本时,"Q"
仍会被映射成 "gq" (选择模式除外,因为这是可显示字符)。
要恢复 Q 功能,可用:
unnmap Q
gQ
gQ 类似 Q ,进入 "Ex" 模式,但更接近逐条输入 : 命令。
完整支持命令行编辑、补全等功能。
执行 :vi 命令 (全名为 :visual ) 退出 "Ex" 模式。
在普通模式、插入模式和替换模式下,屏幕窗口显示缓冲区当前内容: 即所见即所得。但
有两个特例:
- 'cpoptions' 选项里包含 '$' ( cpo-$ ) 且执行修改命令 ( c 系列命令) 在单行内
修改文本时,被删除文本不会直接从窗口中消失,而是在被删内容的末字符上放 '$'。
- 在一个窗口插入文本时,同一缓冲区的其他窗口不会即时刷新,需等到插入操作结束。
'wrap' 选项未关闭时,超出窗口宽度的文本行会自动回绕 (见下)。置位 'linebreak'
选项后,会优先在空白等字符处回绕。
已到达缓冲区末行但窗口还有显示空间时,窗口剩余空行会在首列显示 '~',如下:
+-----------------------+
|某行内容 |
|末行内容 |
|~ |
|~ |
+-----------------------+
'~' 代表已到达缓冲区末尾。
如果窗口无法完整显示末行,该行 (包括可能回绕行) 会在首列显示 '@' 字符,如下:
+-----------------------+
|第一行内容 |
|第二行内容 |
|@ |
|@ |
+-----------------------+
'@' 代表该行无法容纳所有内容。
'display' 选项里包含 "lastline" 标志位时,不再在行首显示 '@' 字符。如果窗口无
法完整显示末行,仅展示可视部分,该行末尾三个字符会被替换为 "@@@" ,如下:
+-----------------------+
|第一行内容 |
|第二行内容 |
|这是内容非常长的一行文 |
本,无法在窗口中完整@@@
+-----------------------+
一个特例是窗口中只有一行文本且无法完整显示。Vim 会以光标位置为中心显示该行局部
内容,不会显示任何特殊标记,方便完整编辑该行。
选项 'showbreak' 定义回绕行的前缀标识。
可通过 'highlight' 选项里的 '@' 分组 (译者注: 或 hl-NonText 高亮组) 为 '@'
、'~' 和 'showbreak' 值设置专属高亮。以区分缓冲区里的真实字符。
wrap-off
关闭 'wrap' 选项后,长行不会自动回绕。仅显示窗口可见范围内的内容。移动光标到未
显示区域时,窗口会水平滚动。这种方式的优点是保持列布局不变,并能编辑走出窗口宽
度的长行。缺点是无法同时查看一整行内容。'sidescroll' 选项可设置水平滚动的最小
列数。
标准 ASCII 字符会直接显示。<Tab> 会按指定宽度替换为对应数量的空白。其余编码值
在 0 到 31 之间的不可显示字符会用 "^{char}" 代替。{char} 为字符编码值加 64。如
响铃字符 (7) 会显示为 "^G" 。编码值在 128 到 159 之间的字符会用 "~{char}" 代
替,{char} 为字符编码减 64 (译者注: 编码值在 160 到 254 之间的字符会用
"|{char}" 代替,{char} 为字符编码减 128,DEL (127) 会显示为 "^?",255 会显示为
"~?")。以上特殊字符会占用多个屏幕位置,光标仅能会定位在其中首个位置。
置位 'number' 选项后,所有行前都会显示行号。提示: 如果不喜欢回绕行文本和行号混
杂,可将 'showbreak' 选项设为八个空格:
:set showbreak=\ \ \ \ \ \ \ \
置位 'list' 选项时,<Tab> 字符不再显示为多个空白,而是展示为 "^I"。行尾会用
'$' 字符标识,便于查找行尾多余空白字符。
命令行模式下,仅确保命令行内容的正确显示。仅当返回普通模式后,缓冲区内容才会刷
新。
窗口最后一行用于显示状态和其他信息。相关状态信息由以下选项控制:
状态信息 选项 缺省 Unix 缺省
当前模式 'showmode' 开 开
命令字符 'showcmd' 开 关
光标位置 'ruler' 关 关
当前模式指 "-- 插入 --" 或 "-- 替换 --" 等提示,见 'showmode' 。命令字符则展示
已输入但尚未执行的按键。
使用慢速终端时,可关闭状态信息以提升编辑速度:
:set nosc noru nosm
如果出错,错误信息会以反转显示,停留至少一秒。
部分命令会显示受影响的行数。触发该提示的行数阈值由 'report' 选项控制 (缺省为
2,代表改动行数超过 2 行时,命令会报告)。
Amiga 系统上,Vim 会在 CLI 窗口里运行。标题栏会显示 Vim 程序名当和当前文件完整
路径。CLI 窗口大小改变时,Vim 会自动重绘内部窗口。窗口可随意缩小,但过小会导致
无法显示整行内容。建议宽度至少设为 40 个字符,保证大部分底部状态信息正常阅读。
大多数 Unix 系统上,Vim 可正确识别并自动适配窗口大小变化。
缓冲区 存放文本行,内容通常从文件读取。
屏幕 Vim 的整个工作区域。一般指终端模拟窗口。也称为 "Vim 主
窗口"。
窗口 缓冲区的一份视图。同一个缓冲区可有多个窗口同时查看。
一块屏幕可包含一个或多个窗口,窗口之间以状态行分隔,底部为命令行区域。
+-------------------------------+
屏幕 | 窗口 1 | 窗口 2 |
| | |
| | |
|=== 状态行 ===|==== 状态行 ===|
| 窗口 3 |
| |
| |
|========== 状态行 =============|
|命令行 |
+-------------------------------+
命令行区域同时用于输出消息。内容过长时屏幕会临时向上滚动,腾出空间显示内容。
Vim 区分四类不同的 "行":
缓冲行 缓冲区里的原始文本行。和读写文件的内容完全一致。单行可
容纳成千上万个字符。
逻辑行 应用折叠后的缓冲行。已关闭折叠里的缓冲行会合并为一条逻
辑行: 例如 "+--已折叠 99 行"。逻辑行一行也可容纳成千
上万个字符。
窗口行 窗口里实际显示的行: 由逻辑行经过回绕、断行等处理而得。
长度受窗口宽度限制,超长窝内会被回绕或截断。
屏幕行 Vim 屏幕使用的行。整合了所有窗口的窗口行、状态行以及
命令行。长度受屏幕宽度的限制。命令行内容溢出时也会自动
回绕并滚屏以腾出空间。
缓冲行 逻辑行 窗口行 屏幕行
1. 一 1. 一 1. +--已折叠 1. +--已折叠
2. 二 2. +--已折叠 2. 五 2. 五
3. 三 3. 五 3. 六 3. 六
4. 四 4. 六 4. 七 4. 七
5. 五 5. 七 5. === 状态行 ===
6. 六 6. aaa
7. 七 7. bbb
8. ccc ccc c
1. aaa 1. aaa 1. aaa 9. cc
2. bbb 2. bbb 2. bbb 10. ddd
3. ccc ccc ccc 3. ccc ccc ccc 3. ccc ccc c 11. ~
4. ddd 4. ddd 4. cc 12. === 状态行 ===
5. ddd 13. (命令行)
6. ~
vim:tw=78:ts=8:noet:ft=help:norl: