news 2026/4/3 4:12:28

2、《vi编辑器:功能、历史与使用指南》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2、《vi编辑器:功能、历史与使用指南》

《vi编辑器:功能、历史与使用指南》

1. 新版特性

本次新版具有以下全新特性:
- 再次修正了基础文本中的错误。
- 新增七个章节,全面涵盖了Vim的内容。
- 关于nvi、elvis和vile的材料已更新至最新。
- 上一版中关于ex和vi的两个参考附录已合并为一个,并且增加了关于Vim的部分精选材料。
- 其他附录也进行了更新。

2. 测试版本

为测试各种vi特性,使用了以下程序:
| 程序名称 | 版本 |
| ---- | ---- |
| Solaris版本的vi | - |
| Keith Bostic的nvi | 1.79 |
| Steve Kirkendall的elvis | 2.2 |
| Bram Moolenaar的Vim | 7.1 |
| Kevin Buettner、Tom Dickey和Paul Fox的vile | 9.6 |

3. 致谢

在第六版中:
首先,感谢作者的妻子Miriam,在他编写书籍期间照顾孩子,尤其是在饭前的“关键时刻”。作者欠她大量的安静时光和冰淇淋。
佐治亚理工学院计算机学院的Paul Manno在安抚打印软件方面提供了宝贵帮助。O’Reilly & Associates的Len Muellner和Erik Ray在SGML软件方面提供了协助。Jerry Peek的SGML的vi宏非常有用。
虽然在准备新的和修订的材料时使用了所有程序,但大部分编辑工作是在GNU/Linux(Red Hat 4.2)下使用Vim 4.5和5.0版本完成的。
感谢Keith Bostic、Steve Kirkendall、Bram Moolenaar、Paul Fox、Tom Dickey和Kevin Buettner对书籍进行了审阅。Steve Kirkendall、Bram Moolenaar、Paul Fox、Tom Dickey和Kevin Buettner还提供了第8至12章的重要内容。
O’Reilly的Gigi Estabrook是一位真正的瑰宝,与她合作很愉快,作者感激她所做的一切。
最后,非常感谢O’Reilly & Associates的制作团队。

在第七版中:
Arnold再次感谢他的妻子Miriam的爱和支持,他欠她的安静时光和冰淇淋债务越来越多。此外,感谢J.D. “Illiad” Frazer提供的精彩的《User Friendly》漫画。
Elbert感谢Anna、Cally、Bobby和他的父母在困难时期对他工作的持续热情,他们的热情很有感染力且令人感激。
感谢Keith Bostic和Steve Kirkendall为修订他们编辑器的章节提供的意见。Tom Dickey为修订关于vile的章节和附录B中的设置选项表提供了重要意见。Bram Moolenaar(Vim的作者)这次也对书籍进行了审阅。Robert P.J. Day、Matt Frye、Judith Myerson和Stephen Figgins在全文审阅中提供了重要意见。
Arnold和Elbert都感谢Andy Oram和Isabel Kunkle作为编辑所做的工作,以及O’Reilly Media的所有工具和制作人员。

4. vi编辑器简介

Unix系统中有多种编辑器可处理文本文件内容,包括行编辑器(如ed和ex,在屏幕上显示文件的一行)和屏幕编辑器(如vi和Emacs,在终端屏幕上显示文件的一部分)。基于X Window System的文本编辑器也很常见且越来越受欢迎。GNU Emacs及其衍生的XEmacs提供多个X窗口,贝尔实验室的sam和Acme编辑器也是有趣的选择,Vim也提供基于X的界面。

vi是系统中最有用的标准文本编辑器,它是“visual editor”的缩写,发音为“vee - eye”。与Emacs不同,它在几乎所有现代Unix系统上的形式几乎相同,提供了一种文本编辑的通用语言。虽然ed和ex也有类似特点,但屏幕编辑器通常更容易使用,行编辑器已基本不再使用。使用屏幕编辑器,你可以滚动页面、移动光标、删除行、插入字符等,同时能实时看到编辑结果,就像编辑纸质文档一样,而且速度更快。

对许多初学者来说,vi似乎不直观且繁琐,它使用常规键盘键来发出命令,而不是使用特殊控制键进行文字处理功能。当键盘键用于发出命令时,vi处于命令模式,必须进入特殊的插入模式才能在屏幕上输入实际文本,而且命令似乎很多。

然而,一旦开始学习,你会发现vi设计得很好,只需几个按键就能让vi执行复杂任务。随着学习的深入,你会掌握越来越多的快捷方式,将更多编辑工作交给计算机。

vi不是“所见即所得”的文字处理器,如果你想生成格式化文档,必须输入由另一个格式化程序使用的代码来控制打印副本的外观。例如,如果你想缩进几个段落,需要在缩进开始和结束的地方输入代码。格式化代码允许你试验或更改打印文件的外观,在很多方面,它们比文字处理器能让你对文档外观有更多的控制。Unix支持troff格式化包,TEX和LATEX格式化程序也是常用的替代方案。vi支持一些简单的格式化机制,如自动换行和自动缩进新行,Vim 7版本还提供自动拼写检查功能。

编辑的基本操作包括插入文本(如遗忘的单词、新句子或缺失的句子)、删除文本(如多余的字符或整个段落)、更改字母和单词(如纠正拼写错误或更改术语)、移动文本到文件的其他部分以及复制文本以在文件的其他部分重复使用。

与许多文字处理器不同,vi的命令模式是初始或“默认”模式,复杂的交互式编辑只需几个按键即可完成。要插入原始文本,只需给出几个“插入”命令之一,然后开始输入。基本命令通常使用一两个字符,例如:
-i:插入
-cw:更改单词

使用字母作为命令,可以快速编辑文件,无需记忆大量功能键或伸展手指去按复杂的组合键,也无需将手从键盘上移开或处理多级菜单。大多数命令可以通过执行它们的字母来记忆,而且几乎所有命令都遵循相似的模式并相互关联。

一般来说,vi命令具有以下特点:
- 区分大小写(大写和小写按键含义不同,如Ii)。
- 输入时不在屏幕上显示(或“回显”)。
- 命令后无需按ENTER键。

还有一组命令会在屏幕底行回显,底行命令前面有不同的符号。斜杠(/)和问号(?)用于开始搜索命令,冒号(:)用于开始所有ex命令,ex命令是ex行编辑器使用的命令,当使用vi时可以使用ex编辑器,因为ex是底层编辑器,vi实际上只是它的“可视化”模式。

5. vi的历史背景

在深入了解vi的细节之前,了解其历史背景有助于理解其对环境的看法,也能帮助你理解许多vi的晦涩错误消息,并欣赏vi克隆版是如何从原始vi发展而来的。

vi可以追溯到计算机用户通过串行线连接到中央小型计算机的终端上工作的时代。当时全球有数百种不同类型的终端在使用,每种终端都能执行相同的操作(如清屏、移动光标等),但执行这些操作所需的命令不同。此外,Unix系统允许用户选择用于退格、生成中断信号和其他在串行终端上有用的命令(如暂停和恢复输出)的字符,这些功能由stty命令管理。

原始的UCB版本的vi将终端控制信息从难以更改的代码中抽象出来,放入一个由termcap库管理的文本文件数据库中,该数据库包含终端功能信息。20世纪80年代初,System V引入了二进制终端信息数据库和terminfo库,这两个库在功能上基本等效。为了告诉vi你使用的终端类型,必须设置TERM环境变量,这通常在shell启动文件(如.profile.login)中完成。

如今,人们通常在图形环境中使用终端模拟器(如xterm),系统几乎总是会为你设置TERM变量。当然,你也可以在PC的非GUI控制台中使用vi,这在单用户模式下进行系统恢复工作时非常有用,但日常使用中,你可能更想使用vi的GUI版本,如Vim或其他克隆版。在Microsoft Windows或Mac OS X系统上,这可能是默认选择。然而,当在终端模拟器中运行vi(或其他同一时期的屏幕编辑器)时,它仍然使用TERM和termcap或terminfo,并会关注stty设置,在终端模拟器中使用它也是学习vi的一种简单方法。

另一个需要了解的重要事实是,vi是在Unix系统远不如现在稳定的时期开发的。过去的vi用户必须为系统随时可能崩溃做好准备,因此vi支持恢复在系统崩溃时正在编辑的文件。所以,当你学习vi并遇到各种可能出现的问题时,请记住这些历史发展。

6. 打开和关闭文件

你可以使用vi编辑任何文本文件。vi会将待编辑的文件复制到一个缓冲区(内存中临时预留的区域),显示该缓冲区(尽管一次只能看到一屏内容),并允许你添加、删除和更改文本。当你保存编辑内容时,vi会将编辑后的缓冲区复制回永久文件,替换同名的旧文件。请记住,你始终在缓冲区中对文件副本进行操作,直到保存缓冲区,你的编辑才会影响原始文件。保存编辑内容也称为“写入缓冲区”,更常见的说法是“写入文件”。

6.1 打开文件

vi是Unix命令,用于打开现有文件或创建新文件。vi命令的语法如下:

$ vi [filename]

上述命令行中的方括号表示文件名是可选的,不要输入方括号。$是Unix提示符。如果省略文件名,vi将打开一个未命名的缓冲区,你可以在将缓冲区写入文件时指定名称。目前,我们先在命令行上指定文件名。

文件名在其目录中必须唯一,可以包含除斜杠(/,用作路径名中文件和目录的分隔符)和ASCII NUL(所有位都为零的字符)之外的任何8位字符。你甚至可以在文件名中包含空格,只需在空格前输入反斜杠(\)。但实际上,文件名通常由大写和小写字母、数字以及点(.)和下划线(_)组成。请记住,Unix区分大小写,小写字母与大写字母不同,并且必须按ENTER键告诉Unix你已完成命令输入。

当你想在目录中打开新文件时,使用vi命令并给出新文件名。例如,如果你想在当前目录中打开一个名为practice的新文件,应输入:

$ vi practice

由于这是一个新文件,缓冲区为空,屏幕显示如下:

~ ~ ~ "practice" [New file]

屏幕左侧列中的波浪号(~)表示文件中没有文本,甚至没有空行。屏幕底部的提示行(也称为状态行)会显示文件的名称和状态。

你也可以通过指定文件名来编辑目录中的现有文本文件。假设存在一个路径名为/home/john/letter的Unix文件,如果你已经在/home/john目录中,使用相对路径名,例如:

$ vi letter

这将把letter文件的副本显示在屏幕上。

如果你在其他目录中,使用完整路径名开始编辑:

$ vi /home/john/letter
6.2 打开文件时的问题
  • 当你调用vi时,出现[open mode]消息:你的终端类型可能被错误识别。立即通过输入:q退出编辑会话,检查环境变量$TERM,它应该设置为你的终端名称,或者请系统管理员提供合适的终端类型设置。
  • 你看到以下消息之一:
    • Visual needs addressable cursor or upline capability
    • Bad termcap entry
    • Termcap entry too long
    • terminal: Unknown terminal type
    • Block device required
    • Not a typewriter
      你的终端类型可能未定义,或者你的terminfo或termcap条目可能有问题。输入:q退出,检查$TERM环境变量,或者请系统管理员为你的环境选择合适的终端类型。
  • 当你认为文件已经存在时,出现[new file]消息:检查你在文件名中是否使用了正确的大小写(Unix文件名区分大小写)。如果是,你可能在错误的目录中。输入:q退出,然后检查你是否在该文件的正确目录中(在Unix提示符下输入pwd)。如果在正确的目录中,检查目录中的文件列表(使用ls),看文件是否以略有不同的名称存在。
  • 你调用vi,但得到一个冒号提示符(表示你处于ex行编辑模式):你可能在vi绘制屏幕之前输入了中断信号。在ex提示符(:)下输入vi进入vi。
  • 出现以下消息之一:
    • [Read only]
    • File is read only
    • Permission denied
      “只读”意味着你只能查看文件,不能保存所做的更改。你可能以查看模式(使用viewvi -R)调用了vi,或者你没有该文件的写入权限。
  • 出现以下消息之一:
    • Bad file number
    • Block special file
    • Character special file
    • Directory
    • Executable
6.3 解决文件打开问题的流程图
graph TD A[调用vi] --> B{出现[open mode]消息?} B -- 是 --> C[/输入:q 退出,检查$TERM或联系管理员/] B -- 否 --> D{出现特定错误消息?} D -- 是 --> E[/输入:q 退出,检查$TERM或联系管理员/] D -- 否 --> F{出现[new file]消息但认为文件已存在?} F -- 是 --> G[/输入:q 退出,检查文件名大小写、目录和文件列表/] F -- 否 --> H{得到冒号提示符?} H -- 是 --> I[/在: 提示符下输入vi/] H -- 否 --> J{出现只读相关消息?} J -- 是 --> K[/检查调用模式和文件写入权限/] J -- 否 --> L{出现其他错误消息?} L -- 是 --> M[/根据具体情况处理/] L -- 否 --> N[正常打开文件]
7. vi的命令模式与插入模式

vi有命令模式和插入模式两种主要模式,这两种模式的切换是使用vi进行高效编辑的基础。
-命令模式:这是vi的默认模式,在该模式下,你可以使用各种命令来执行编辑操作,如移动光标、删除文本、复制粘贴等。命令通常由单个字符或简短的字符组合构成,例如:
-hjkl:分别用于向左、向下、向上、向右移动光标一个字符。
-dd:删除当前行。
-yy:复制当前行。
-p:粘贴复制或删除的内容到光标所在行的下一行。
-插入模式:当你需要输入文本时,需要从命令模式切换到插入模式。可以使用以下命令进入插入模式:
-i:在光标当前位置之前插入文本。
-a:在光标当前位置之后插入文本。
-o:在当前行的下一行插入新行并进入插入模式。
-O:在当前行的上一行插入新行并进入插入模式。

要从插入模式返回到命令模式,只需按下Esc键。在命令模式下,可以继续使用各种编辑命令。

8. vi的搜索与替换

在编辑较长的文件时,搜索和替换功能非常实用。vi提供了强大的搜索和替换机制。
-搜索:使用斜杠(/)或问号(?)开始搜索命令。
-/keyword:从当前光标位置开始向下搜索关键字keyword
-?keyword:从当前光标位置开始向上搜索关键字keyword
搜索到关键字后,可以使用n键继续向下搜索下一个匹配项,使用N键向上搜索上一个匹配项。
-替换:使用冒号(:)开始的ex命令进行替换操作。基本的替换命令格式如下:

:%s/old/new/g
- `%`:表示对整个文件进行操作。如果只想对某几行进行操作,可以指定行号范围,如`10,20s/old/new/g`表示对第10行到第20行进行替换。 - `s`:表示替换命令。 - `old`:要被替换的旧文本。 - `new`:替换后的新文本。 - `g`:表示全局替换,即替换每一行中所有匹配的旧文本。如果不加`g`,则只替换每行中第一个匹配的旧文本。
9. vi的高级编辑技巧

除了基本的编辑操作外,vi还有一些高级编辑技巧可以提高编辑效率。
-宏录制:可以录制一系列的操作,然后重复执行这些操作。录制宏的步骤如下:
1. 在命令模式下,按下qaa可以是任意字母,用于指定宏的名称)开始录制宏。
2. 执行你需要的一系列操作。
3. 按下q结束录制。
4. 要重复执行宏,可以使用@aa是你录制宏时指定的名称)。如果要重复执行多次,可以在@a前加上数字,如10@a表示重复执行宏10次。
-多窗口编辑:vi支持同时打开多个窗口进行编辑。可以使用以下命令打开多个窗口:
-:split:水平分割当前窗口,打开一个新的窗口显示同一个文件。
-:vsplit:垂直分割当前窗口。
- 在多个窗口之间切换可以使用Ctrl + w组合键,例如Ctrl + w w在窗口之间循环切换,Ctrl + w hCtrl + w jCtrl + w kCtrl + w l分别切换到左、下、上、右的窗口。

10. 总结

vi是一款功能强大且历史悠久的文本编辑器,虽然对于初学者来说可能有一定的学习曲线,但一旦掌握了其基本操作和高级技巧,将大大提高文本编辑的效率。从其历史背景可以了解到它是为适应当时复杂的终端环境和不稳定的系统而设计的,这也使得它具有很强的适应性和可靠性。

在使用vi时,要熟悉其命令模式和插入模式的切换,掌握基本的编辑命令、搜索和替换功能,以及高级的编辑技巧,如宏录制和多窗口编辑等。同时,在打开和关闭文件时,要注意可能出现的问题,并能够根据错误提示进行相应的处理。通过不断的练习和实践,相信你会逐渐成为vi的高手,在文本编辑领域游刃有余。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 8:30:38

5个顶级Flutter示例项目,从零基础到架构师实战指南

还在为Flutter项目结构混乱而头痛?作为Google推出的跨平台UI框架,Flutter的官方示例分散在不同仓库中,让开发者难以快速定位学习资源。本文精选5个核心示例项目,从基础组件到企业级架构全覆盖,附带详细代码分析和应用场…

作者头像 李华
网站建设 2026/3/12 9:11:22

3招搞定API测试难题:告别请求体解析困扰的实战指南

3招搞定API测试难题:告别请求体解析困扰的实战指南 【免费下载链接】bruno 开源的API探索与测试集成开发环境(作为Postman/Insomnia的轻量级替代方案) 项目地址: https://gitcode.com/GitHub_Trending/br/bruno 还在为API测试中请求体…

作者头像 李华
网站建设 2026/3/14 1:08:53

MeshCentral实战部署:5分钟快速搭建企业级远程管理平台

MeshCentral实战部署:5分钟快速搭建企业级远程管理平台 【免费下载链接】MeshCentral A complete web-based remote monitoring and management web site. Once setup you can install agents and perform remote desktop session to devices on the local network …

作者头像 李华
网站建设 2026/3/31 12:58:19

COLMAP技术演进:从几何重建到多传感器融合的算法突破

引言:三维重建的技术挑战 【免费下载链接】colmap COLMAP - Structure-from-Motion and Multi-View Stereo 项目地址: https://gitcode.com/GitHub_Trending/co/colmap 多视图三维重建技术长期以来面临着精度、效率和鲁棒性之间的平衡难题。传统方法在处理大…

作者头像 李华
网站建设 2026/4/1 23:41:21

FanControl崩溃修复全攻略:ADLXWrapper组件故障诊断与解决方案

FanControl崩溃修复全攻略:ADLXWrapper组件故障诊断与解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…

作者头像 李华