Vim与nvi编辑器的使用指南
1. Vim的基本操作与资源
在Vim的命令编辑窗口中,你可以轻松找到最近使用过的命令,必要时对其进行修改,然后按回车键执行。你还能将缓冲区内容写入自定义文件名的文件,记录命令历史以便日后参考。
这里有个小幽默,你可以尝试输入命令 :help sure ,看看Vim的回复。
以下是两个获取Vim内置帮助的HTML版本的链接,分别对应最近两个主要版本:
- Vim 6.2: http://www.vim.org/htmldoc/help.html
- Vim 7: http://vimdoc.sourceforge.net/htmldoc/usr_toc.html
此外, http://vimdoc.sourceforge.net/vimfaq.html 是Vim常见问题列表,虽然它没有将问题与答案关联起来,但所有内容都在同一页面,建议滚动到答案部分进行浏览。
由于垃圾邮件问题,Vim官方页面上的技巧已迁移到一个更易于管理垃圾邮件的维基页面: http://vim.wikia.com/wiki/Category:Integration 。
2. nvi编辑器概述
nvi即“new vi”,最初由加州大学伯克利分校(UCB)开发,这里也是著名的伯克利软件发行版(BSD)Unix的发源地。nvi是“官方”的伯克利版本的vi,是4.4BSD - Lite II的一部分,也被用于NetBSD和FreeBSD等流行的BSD变体系统。
2.1 作者与历史
最初的vi由当时还是计算机科学研究生的Bill Joy于20世纪70年代末在UCB开发,他后来成为了Sun Microsystems的创始人兼副总裁。在nvi之前,Bill Joy从第六版ed编辑器开始,大幅改进并构建了ex编辑器,第一个改进是与Chuck Haley一起完成的开放模式。1976年至1979年间,ex演变成了vi。随后Mark Horton来到伯克利,添加了宏和其他功能,并做了大量工作使vi能在众多终端和Unix系统上运行。到1981年的4.1BSD时,vi编辑器基本具备了我们在前面提到的所有功能。
然而,vi的核心是原始的Unix ed编辑器,其代码不能自由分发。到20世纪90年代初,BSD开发者在开发4.4BSD时,希望有一个可以自由分发源代码的vi版本。UCB的Keith Bostic从可自由分发的vi克隆版elvis 1.8开始,将其改造成一个与vi“逐错误兼容”的克隆版,并且在合理的情况下,nvi也符合POSIX命令语言和实用程序标准(IEEE P1003.1)。目前,Keith Bostic仍在分发nvi,撰写本文时的当前版本是nvi 1.79。
2.2 重要的命令行参数
在纯BSD环境中,nvi以ex、vi和view的名称安装,通常它们都是指向同一可执行文件的链接,nvi会根据调用方式来确定其行为(Unix vi也是如此)。它允许在vi模式下使用Q命令切换到ex模式,view变体与vi类似,但初始设置为只读模式。
nvi有许多命令行选项,以下是一些最有用的选项:
| 选项 | 功能 |
| ---- | ---- |
| -c command | 启动时执行指定命令,这是历史上 +command 语法的POSIX版本,nvi不限于定位命令(旧语法也被接受) |
| -F | 开始编辑时不复制整个文件,这样可能更快,但可能会有人在你编辑时修改文件 |
| -r | 恢复指定文件,若命令行未列出文件,则列出所有可恢复的文件 |
| -R | 以只读模式启动,设置只读选项 |
| -s | 进入批处理(脚本)模式,仅适用于ex,用于运行编辑脚本,禁用提示和非错误消息,这是历史上 “-” 参数的POSIX版本,nvi两者都支持 |
| -S | 以安全选项运行,禁止访问外部程序 |
| -t tag | 从指定标签处开始编辑 |
| -w size | 将初始窗口大小设置为指定的行数 |
2.3 在线帮助和其他文档
nvi附带了相当全面的可打印文档,包括以下文档的troff源文件、格式化的ASCII文件和格式化的PostScript文件:
- vi参考手册:描述了nvi的所有命令行选项、命令、选项和ex命令。
- vi手册页:nvi的手册页。
- vi教程:这是一个使用vi编辑的入门教程。
- ex参考手册:ex的参考手册,相对于nvi的功能来说有点过时。
此外,还包含一些记录nvi内部信息的ASCII文件,以及一个应实现的功能列表,还有可作为vi在线教程的文件。
nvi内置的在线帮助很有限,只有两个命令: :exusage 和 :viusage ,它们提供每个ex和vi命令的单行摘要,通常足以提醒你某个命令的用法,但对于学习nvi的新特性或不常用特性不太有用。你可以将命令作为参数传递给这两个命令,nvi将仅显示该命令的帮助信息,包括一行解释命令功能的说明和一行命令用法摘要。
2.4 初始化
如果指定了 -s 或 “-” 选项,nvi将跳过所有初始化步骤。否则,nvi会按以下步骤进行初始化:
1. 读取并执行文件 /etc/vi.exrc ,该文件必须由root或你自己拥有。
2. 如果存在 NEXINIT 环境变量,则执行其值;否则,如果存在 EXINIT 变量,则使用它,两者只会使用一个,跳过执行 $HOME/.nexrc 或 $HOME/.exrc 。
3. 如果 $HOME/.nexrc 存在,则读取并执行它;否则,如果 $HOME/.exrc 存在,则读取并执行它,两者只会使用一个。
4. 如果设置了 exrc 选项,则查找并执行 .nexrc (如果存在)或 .exrc ,两者只会使用一个。
nvi不会执行任何可被文件所有者以外的人写入的文件。nvi文档建议将常见的初始化操作放在 .exrc 文件中(即Unix vi的选项和命令),并让 .nexrc 文件在nvi特定的初始化之前或之后执行 :source .exrc 。
2.5 多窗口编辑
在nvi中创建新窗口,你可以使用ex编辑命令的大写版本,如 Edit 、 Fg 、 Next 、 Previous 、 Tag 或 Visual (这些命令通常可以缩写)。如果光标在屏幕上半部分,新窗口将在屏幕下半部分创建,反之亦然。你可以使用 CTRL - W 切换窗口。
以下是nvi窗口管理命令及其功能的表格:
| 命令 | 功能 |
| ---- | ---- |
| bg | 隐藏当前窗口,可使用 fg 和 Fg 命令恢复 |
| di[splay] b[uffers] | 显示所有缓冲区,包括命名、未命名和数字缓冲区 |
| di[splay] s[creens] | 显示所有后台窗口的文件名 |
| Edit filename | 在新窗口中编辑指定文件 |
| Edit /tmp | 创建一个新窗口编辑一个空缓冲区, /tmp 会被特殊处理以创建一个新的临时文件 |
| fg filename | 将指定文件显示在当前窗口,前一个文件移到后台 |
| Fg filename | 在新窗口中显示指定文件,当前窗口会被分割,而不是重新分配所有打开窗口的屏幕空间 |
| Next | 在新窗口中编辑参数列表中的下一个文件 |
| Previous | 在新窗口中编辑参数列表中的上一个文件(Unix vi中没有对应的返回上一个文件的命令) |
| resize ±nrows | 增加或减少当前窗口的行数 |
| Tag tagstring | 在新窗口中编辑包含指定标签的文件 |
CTRL - W 命令可按从上到下的顺序在窗口之间循环切换, :q 和 ZZ 命令用于退出当前窗口。你可以在同一文件上打开多个窗口,一个窗口中的更改会反映在其他窗口中,但在nvi插入模式下的更改直到你按 ESC 键完成更改后才会在其他窗口中显示。直到你发出一个会使nvi离开文件的最后一个打开窗口的命令时,才会提示你保存更改。
以下是一个简单的mermaid流程图,展示了nvi多窗口编辑的基本流程:
graph LR
A[开始编辑] --> B{是否需要新窗口}
B -- 是 --> C[使用大写ex命令创建新窗口]
C --> D[使用CTRL - W切换窗口]
B -- 否 --> E[继续当前窗口编辑]
D --> E
E --> F{是否退出}
F -- 是 --> G[使用:q或ZZ退出]
F -- 否 --> B
2.6 扩展正则表达式
nvi支持扩展正则表达式,你可以使用 :set extended 来启用扩展正则表达式匹配。以下是nvi提供的元字符及其功能:
| 元字符 | 功能 |
| ---- | ---- |
| | | 表示交替,左右两边不必是单个字符 |
| (…) | 用于分组,以便应用额外的正则表达式运算符。当 extended 选项设置时,用括号分组的文本就像普通vi中用 \(...\) 分组的文本一样,实际匹配的文本可以在替换命令的替换部分用 \1 、 \2 等获取,此时 \( 表示一个字面左括号 |
| + | 匹配一个或多个前面的正则表达式,可以是单个字符或括号内的一组字符 |
|? | 匹配前面的正则表达式零次或一次 |
| {…} | 定义一个区间表达式,用于描述重复次数。其中 {n} 表示精确匹配n次, {n,} 表示匹配n次或更多次, {n,m} 表示匹配n到m次。当 extended 未设置时,nvi使用 \{ 和 \} 提供相同的功能。当 extended 设置时,你需要在元字符前加反斜杠来进行字面匹配 |
2.7 编辑改进
2.7.1 命令行历史和补全
nvi会保存你的ex命令行,并允许你编辑后重新提交。这个功能由 cedit 选项控制,其值是一个字符串。当你在冒号命令行上输入该字符串的第一个字符时,nvi会打开一个新窗口显示命令历史,你可以进行编辑,按回车键执行该行命令。 ESC 是这个选项的一个不错选择(使用 ^V ^[ 输入)。由于回车键会执行命令,所以要使用 j 或 ↓ 键在行之间移动。
除了编辑命令行,你还可以进行文件名扩展,这个功能由 filec 选项控制。当你在冒号命令行上输入该字符串的第一个字符时,nvi会将光标前的以空格分隔的单词视为后面加了 * ,并进行shell风格的文件名扩展。 ESC 也是这个选项的一个好选择(使用 ^V ^[ 输入)。当这个字符与 cedit 选项的字符相同时,只有在冒号命令行的第一个字符输入时才会进行命令行编辑。nvi文档指出, TAB 也是 filec 选项的常见选择,你需要输入 :set filec=\TAB 来使其生效。实际上,在 .nexrc 文件中设置这两个选项为 ESC 效果很好:
set cedit=^[
set filec=^[
2.7.2 标签栈
nvi的标签栈是四个克隆版中最简单的。以下是nvi标签命令及其功能的表格:
| 命令 | 功能 |
| ---- | ---- |
| di[splay] t[ags] | 显示标签栈 |
| ta[g][!] tagstring | 编辑标签文件中定义的包含指定标签的文件, ! 强制nvi在当前缓冲区已修改但未保存时切换到新文件 |
| Ta[g][!] tagstring | 与 :tag 类似,但在新窗口中编辑文件 |
| tagp[op][!] tagloc | 跳转到指定标签,若未指定标签位置,则跳转到最近使用的标签。标签位置可以是标签所在的文件名或栈中的位置编号 |
| tagt[op][!] | 跳转到栈中最旧的标签,并清空栈 |
以下是nvi命令模式下的标签命令及其功能的表格:
| 命令 | 功能 |
| ---- | ---- |
| ^] | 在标签文件中查找光标下标识符的位置,并移动到该位置,当前位置会自动压入标签栈 |
| ^T | 返回标签栈中的上一个位置,即弹出一个元素 |
你可以使用 tags 选项设置nvi查找标签的文件名列表,提供一个简单的搜索路径机制。默认值是 "tags /var/db/libc.tags /sys/kern/tags" ,在4.4BSD系统中,它会先在当前目录查找,然后在C库和操作系统源代码文件中查找。 taglength 选项控制标签字符串中有效字符的数量,默认值为0表示使用所有字符。
nvi的行为与vi类似,它从当前光标位置开始使用光标下的“单词”。如果光标在 main 中的 i 上,nvi会搜索标识符 in 而不是 main 。nvi依赖传统的标签文件格式,这种格式有局限性,特别是没有编程语言作用域的概念,在C++中函数名重载的情况下问题会更严重。nvi通过使用cscope程序来解决标签文件的局限性,cscope曾经是专有程序,现在是一个开源程序,可从贝尔实验室的World - Wide Exptools项目获取( http://www.bell - labs.com/project/wwexptools/ )。它读取C源文件并构建一个描述程序的数据库,nvi提供了查询该数据库并处理结果的命令。由于cscope并非普遍可用,这里不介绍其使用方法,nvi文档中提供了相关命令的详细信息。Exuberant ctags生成的扩展标签文件格式在nvi 1.79中不会产生错误,但nvi也没有利用这种格式。
2.7.3 无限撤销
在vi中,点(.)命令通常作为“重复”命令,重复你执行的最后一个编辑操作,如删除、插入或替换。nvi将点命令扩展为完整的“重做”命令,即使最后一个命令是 u (撤销)也适用。
要开始一系列“撤销”命令,先按 u ,然后每次按 . ,nvi会继续撤销更改,使文件逐渐恢复到原始状态。当达到文件的初始状态时,按 . 会响铃(或闪烁屏幕)。此时,你可以按 u 来“撤销撤销操作”,然后使用 . 重新应用后续更改。nvi不允许为 u 或 . 命令提供计数。
2.7.4 任意长度的行和二进制数据
nvi可以编辑任意长度的行和任意数量的行的文件,并且能自动处理二进制数据,无需特殊的命令行选项或ex选项。你可以使用 ^X 后跟一到两个十六进制数字来输入任何8位字符到文件中。
2.8 总结
nvi作为“官方”的伯克利版本的vi,具有丰富的功能和特性,在BSD系统中有着广泛的应用。以下是对nvi主要特点的总结:
| 特点 | 描述 |
| ---- | ---- |
| 历史悠久 | 源于UCB开发的vi,经过多年发展和改进 |
| 兼容性强 | 与vi“逐错误兼容”,符合POSIX标准 |
| 命令行选项丰富 | 提供多种命令行选项,满足不同编辑需求 |
| 文档全面 | 附带详细的参考手册、教程等文档 |
| 多窗口编辑 | 支持多窗口编辑,方便同时处理多个文件 |
| 扩展正则表达式 | 支持扩展正则表达式,增强搜索和替换能力 |
| 编辑功能改进 | 具备命令行历史和补全、标签栈、无限撤销等功能 |
| 处理能力强大 | 可编辑任意长度的行和二进制数据 |
2.9 使用建议
在使用nvi时,以下是一些建议可以帮助你更高效地进行编辑:
- 初始化设置 :将常用的初始化操作放在 .exrc 文件中,并在 .nexrc 文件中引用,以确保每次启动nvi时都能应用这些设置。
- 多窗口编辑 :合理使用多窗口编辑功能,提高编辑效率。例如,同时打开多个文件进行对比编辑。
- 命令行历史和补全 :设置 cedit 和 filec 选项为 ESC ,方便进行命令行编辑和文件名扩展。
- 标签栈使用 :利用标签栈功能快速定位到代码中的特定位置,提高代码浏览和编辑的效率。
- 无限撤销 :灵活运用无限撤销功能,避免因误操作而丢失重要的编辑内容。
2.10 与其他编辑器的比较
与其他常见的编辑器相比,nvi具有以下优势和劣势:
| 编辑器 | 优势 | 劣势 |
| ---- | ---- | ---- |
| nvi | 与vi兼容性好,适合熟悉vi的用户;支持多窗口编辑和扩展正则表达式;可处理任意长度的行和二进制数据 | 内置在线帮助有限;依赖传统标签文件格式,有一定局限性 |
| Vim | 功能强大,插件丰富;支持多种编程语言;有完善的在线帮助系统 | 对于初学者来说,学习曲线较陡 |
| Emacs | 高度可定制,适合进行复杂的文本处理和编程;有丰富的插件和扩展 | 学习成本高,界面不够直观 |
2.11 未来发展趋势
随着技术的不断发展,nvi可能会在以下方面进行改进和发展:
- 功能增强 :进一步完善标签栈功能,支持更复杂的标签文件格式,提高代码导航的准确性和效率。
- 兼容性提升 :加强与现代操作系统和编程语言的兼容性,支持更多的文件类型和编码格式。
- 用户体验优化 :改进内置在线帮助系统,提供更详细的帮助信息和教程,降低初学者的学习门槛。
- 性能优化 :优化编辑性能,特别是在处理大型文件和复杂项目时,提高响应速度和稳定性。
2.12 结语
nvi作为一款经典的文本编辑器,在BSD系统中有着重要的地位。它继承了vi的强大功能,并在此基础上进行了许多改进和扩展。通过合理使用nvi的各种功能和特性,你可以更高效地进行文本编辑和代码开发。希望本文能帮助你更好地了解和使用nvi编辑器。
以下是一个mermaid流程图,展示了使用nvi进行编辑的整体流程:
graph LR
A[启动nvi] --> B{选择编辑模式}
B -- 命令模式 --> C[执行命令操作]
B -- 插入模式 --> D[输入文本内容]
C --> E{是否需要多窗口编辑}
E -- 是 --> F[使用大写ex命令创建新窗口]
E -- 否 --> G[继续当前窗口编辑]
F --> G
G --> H{是否需要搜索或替换}
H -- 是 --> I[使用正则表达式进行搜索和替换]
H -- 否 --> J{是否需要撤销或重做}
I --> J
J -- 是 --> K[使用u和.命令进行撤销和重做]
J -- 否 --> L{是否完成编辑}
K --> L
L -- 是 --> M[保存并退出]
L -- 否 --> C
通过以上的介绍和分析,相信你对nvi编辑器有了更深入的了解。在实际使用中,你可以根据自己的需求和习惯,灵活运用nvi的各种功能,提高编辑效率和质量。
超级会员免费看
2

被折叠的 条评论
为什么被折叠?



