Vim 从何而来?

Vim 编辑器的创造者、维护者和终身领导者 Bram Moolenaar

为了纪念这位杰出的荷兰程序员,我们今天来聊一聊 Vim 的历史。

Vim 无处不在。它被很多人使用。同时 Vim 可能是世界上 “最难用的软件之一” ,但是又多次被程序员们评价为 最受欢迎的 代码编辑器。

Vim 预装在 Mac OS 上,并且在 Linux 领域拥有大量支持者。即使对于那些讨厌它的人来说,它也很熟悉,因为足够流行的命令行工具会默认将用户带入 Vim。

有一些主要网站,包括 Facebook,当你按 j 键时会向下滚动,当你按 k 键时会向上滚动 — 这就是通过 Vim 的广泛传播而形成的文化。

然而 Vim 也是一个谜。

例如,与众所周知的由 Facebook 开发和维护的 React 不同,Vim 没有明显的赞助商。

尽管它无处不在且很重要,但似乎没有任何类型的委员会或组织对 Vim 做出决策。

你可能会花几分钟浏览 Vim 网站(https://www.vim.org),但无法更好地了解谁创建了 Vim 或为什么创建。

如果你启动 Vim 时没有给它提供文件参数,那么你将看到 Vim 的启动消息,其中显示 Vim 是由“Bram Moolenaar 等人”开发的。但这并不能告诉你太多。布拉姆·穆勒纳尔 (Bram Moolenaar) 是谁?他的合作者又是谁?

在这里插入图片描述
也许更重要的是,为什么退出 Vim 需要输入 :wq ?

当然,这是一个“写入”操作,然后是一个“退出”操作,但这并不是一个特别直观的约定。谁决定复制文本应该被称为“yanking”?为什么 :%s/foo/bar/gc 是“查找和替换”的缩写?Vim 的特性似乎太随意了,不可能是虚构的,但它们是从哪里来的呢?

正如通常的情况一样,答案始于古老——贝尔实验室。从某种意义上说,Vim 只是一个软件的最新版本——称之为“wq 文本编辑器”——自 Unix 时代开始以来一直在不断开发和改进。

en Thompson 编写了一个行编辑器
1966 年,贝尔实验室聘请了 Ken Thompson。汤普森刚刚在加州大学伯克利分校获得了电气工程和计算机科学硕士学位。在那里,他使用了一个名为 QED 的文本编辑器,该编辑器是在 1965 年至 1966 年间为伯克利分时系统编写的。

汤普森到达贝尔实验室后做的第一件事就是为麻省理工学院兼容时间重写 QED - 共享系统。后来他为 Multics 项目编写了 QED 的另一个版本。在此过程中,他扩展了该程序,以便用户可以搜索文件中的行并使用正则表达式进行替换。

Multics 项目与伯克利分时系统一样,旨在创建一个商业上可行的分时操作系统,该项目是麻省理工学院、通用电气和贝尔实验室之间的合作项目。AT&T 最终认为该项目毫无进展并退出。

汤普森和贝尔实验室研究员丹尼斯·里奇现在无法访问分时系统,他们开始创建自己的版本,最终被称为 Unix。1969 年 8 月,当他的妻子和年幼的儿子去加利福尼亚度假时,Thompson 组装了新系统的基本组件,“为操作系统、shell、编辑器各分配了一周的时间”。

编辑器将被称为 ed 。它基于 QED,但并不是精确的重新实现。Thompson 决定放弃某些 QED 功能。正则表达式支持被削减,以便只能理解相对简单的正则表达式。QED 允许用户通过打开多个缓冲区来一次编辑多个文件,但 ed 一次只能使用一个缓冲区。尽管 QED 可以执行包含命令的缓冲区,但 ed 不会执行此类操作。可能需要进行这些简化。Dennis Ritchie 表示,没有 QED 的高级正则表达式“并没有多大损失”

ed 现在是 POSIX 规范的一部分,因此如果你有兼容 POSIX 的系统,则可以将其安装在你的计算机上。它值得一试,因为许多 ed 命令如今已成为 Vim 的一部分。例如,为了将缓冲区写入磁盘,你必须使用 w 命令。为了退出编辑器,你必须使用 q 命令。这两个命令可以同时在同一行指定 - wq 。

与 Vim 一样, ed 是一个模式编辑器;要从命令模式进入输入模式,你可以使用插入命令( i )、附加命令( a )或更改命令( c ),取决于你如何转换文本。ed 还引入了用于查找和替换(或“替换”)文本的 s/foo/bar/g 语法。

鉴于所有这些相似之处,你可能认为普通 Vim 用户使用 ed 不会遇到任何问题。但 ed 在另一个重要方面与 Vim 完全不同。ed 是一个真正的行编辑器。它是在电传打字机时代编写并广泛使用的。当 Ken Thompson 和 Dennis Ritchie 攻克 Unix 时,他们看起来像这样:

在这里插入图片描述

ed 不允许你在打开缓冲区的其他行之间编辑行,或移动光标,因为 ed 每次都必须重新打印整个文件对其进行了更改。1969 年的时候, ed 还没有“清除”屏幕内容的机制,因为屏幕只是一张纸,已经输出的所有内容都是用墨水输出的。必要时,你可以要求 ed 使用列表命令 ( l ) 为您打印出一系列行。因此,使用 ed 有点像试图用功率不足的手电筒在黑暗的房子里寻找出路。你一次只能看到这么多,所以你必须尽力记住所有东西在哪里。

这是 ed 会话的示例。我添加了注释(在 # 字符之后)来解释每行的用途

[tt 09:49 ~]$ ed
i                           # Enter input mode
Hello world!Isn't it a nice day?
.                           # Finish input
1,2l                        # List lines 1 to 2
Hello world!$
$
2d                          # Delete line 2
,l                          # List entire buffer
Hello world!$
Isn't it a nice day?$
s/nice/terrible/g           # Substitute globally
,l
Hello world!$
Isn't it a terrible day?$
w foo.txt                   # Write to foo.txt
38                          # (bytes written)
q                           # Quit
[sinclairtarget 10:50 ~]$ cat foo.txt
Hello world!
Isn't it a terrible day?

Bill Joy 编写了一个文本编辑器
ed 对于 Thompson 和 Ritchie 来说工作得足够好。但其他人发现它很难使用,并且它被认为是 Unix 对新手特别不友好的一个例子。

1975 年,一位名叫 George Coulouris 的人在伦敦玛丽女王学院安装的 Unix 系统上开发了 ed 的改进版本。

与 ed 不同,Coulouris 的程序允许用户在屏幕上编辑一行,逐个按键地浏览该行。Coulouris 称他的程序为 em ,或“凡人的编辑器”

1976 年,Coulouris 带着 em 来到加州大学伯克利分校,并以客座教授的身份在加州大学伯克利分校度过了一个夏天。此时距离肯·汤普森离开伯克利去贝尔实验室工作整整十年了。在伯克利,Coulouris 遇到了 Bill Joy,他是一名从事 Berkeley Software Distribution (BSD) 工作的研究生。Coulouris 向 Joy 展示了 em ,Joy 从 Coulouris 的源代码开始构建了 ed 的改进版本,称为 ex ,用于“扩展 ed 的 1.1 版本与 1978 年 BSD Unix 的第一个版本捆绑在一起。ex 很大程度上与 ed 兼容,但它增加了两种模式:“open”模式,它启用了单行编辑,就像 em 一样,以及“视觉”模式,它接管整个屏幕并启用整个文件的实时编辑,就像我们今天习惯的那样。

1979 年的第二个 BSD 版本,引入了一个名为 vi 的可执行文件,它的作用只不过是在可视模式下打开 ex 。

ex / vi (此后称为 vi )建立了我们现在与 Vim 关联的大部分约定,这些约定尚未成为 ed 的一部分。Joy 使用的视频终端是 Lear Siegler ADM-3A,其键盘没有光标键。相反,箭头被绘制在 h 、 j 、 k 和 l 键上,这就是 Joy 使用这些键作为光标的原因 vi 中的移动。ADM-3A 键盘上的退出键也是今天我们可以找到 Tab 键的地方。

命令前缀的:字符也来自 vi ,在常规模式下(即通过运行 ex 输入的模式)使用 : 作为提示。这解决了长期以来对 ed 的抱怨。在可视模式下,保存和退出现在需要输入经典的 :wq 。“Yanking”和“putting”、标记以及用于设置选项的 set 命令都是原始 vi 的一部分。我们今天在 Vim 中进行基本文本编辑过程中使用的功能主要是 vi 功能。

vi 是除 ed 之外唯一与 BSD Unix 捆绑在一起的文本编辑器。当时,Emacs 可能要花费数百美元(这是在 GNU Emacs 之前),因此 vi 变得非常流行。但 vi 是 ed 的直接后代,这意味着如果没有 AT&T 源许可证,则无法修改源代码。这促使一些人创建 vi 的开源版本。STEVIE(VI 爱好者的 ST 编辑器)出现于 1987 年,Elvis 出现于 1990 年, nvi 出现于 1994 年。其中一些克隆添加了额外的功能,如语法突出显示和分割窗口。尤其是 Elvis,它的许多功能都被纳入了 Vim,因为许多 Elvis 用户都在推动将其纳入其中。

Bram Moolenaar 撰写 Vim
“Vim” 现在缩写为“Vi Improve”,最初代表“Vi Imitation”。与许多其他 vi 克隆一样,Vim 最初是尝试在不可用的平台上复制 vi 。Bram Moolenaar 是一位荷兰软件工程师,在荷兰 Venlo 的一家复印机公司工作,他想要为他全新的 Amiga 2000 使用类似 vi 的东西。在 1988 年,Moolenaar 以现有的 STEVIE vi 克隆为起点,开始研究 Vim。

Moolenaar 可以访问 STEVIE,因为 STEVIE 之前曾出现在名为 Fred Fish 磁盘的东西上。Fred Fish 是一位美国程序员,他每个月都会寄出一张软盘,其中包含精选的适用于 Amiga 平台的最佳开源软件。任何人都可以索取磁盘,只需支付邮费即可。Fred Fish 磁盘上发布了 STEVIE 的多个版本。Moolenaar 使用的版本已在 Fred Fish 磁盘 256 上发布。

Moolenaar 喜欢 STEVIE,但很快注意到缺少许多 vi 命令。因此,对于 Vim 的第一个版本,Moolenaar 将 vi 兼容性作为他的首要任务。其他人编写了一系列 vi 宏,Moolenaar 能够让这些宏在 Vim 中运行。1991 年,Vim 首次在 Fred Fish 磁盘 591 上发布,名称为“Vi Imitation”。Moolenaar 添加了一些功能(包括多级撤消和针对编译器错误的“快速修复”模式),这意味着 Vim 已经超越了 vi 。但 Vim 一直是“Vi Imitation(模仿)”,直到 1993 年通过 FTP 发布 Vim 2.0。

Moolenaar 在各种互联网合作者的偶尔帮助下,稳定地为 Vim 添加了功能。Vim 2.0 引入了对 wrap 选项和水平滚动长行文本的支持。Vim 3.0 添加了对分割窗口和缓冲区的支持,该功能受到 vi 克隆 nvi 的启发。Vim 现在还将每个缓冲区保存到交换文件中,以便编辑后的文本可以在崩溃时幸存下来。Vimscript 首次出现在 Vim 5.0 中,并支持语法突出显示。与此同时,Vim 的受欢迎程度与日俱增。它被移植到 MS-DOS、Windows、Mac,甚至 Unix,与原始的 vi 竞争。

2006 年,Vim 被评选为最受 Linux Journal 读者欢迎的编辑器。如今,根据 Stack Overflow 的 2018 年开发者调查,Vim 是最流行的文本模式(即终端仿真器)编辑器,25.8% 的软件开发人员(以及 40% 的系统管理员/DevOps 人员)使用它。有一段时间,在 20 世纪 80 年代末和整个 90 年代,程序员发动了“编辑器战争”,使 Emacs 用户与 vi (最终是 Vim)用户对立。虽然 Emacs 当然仍然有一些追随者,但有些人认为编辑器之战已经结束,Vim 获胜了。2018 年 Stack Overflow 开发者调查表明这是事实;只有 4.1% 的受访者使用 Emacs。

Vim 是如何变得如此成功的?显然人们喜欢 Vim 提供的功能。但我认为,Vim 背后的悠久历史表明,它拥有的优势不仅仅是其功能集。Vim 的代码库可以追溯到 1988 年,当时 Moolenaar 开始研究它。“wq 文本编辑器”有几种不同的具体表达方式,但部分归功于 Bill Joy 和 Bram Moolenaar 对向后兼容性的不同寻常的关注,随着时间的推移,好的想法逐渐积累起来。从这个意义上说,“wq 文本编辑器”是运行时间最长、最成功的开源项目之一,得到了计算世界中一些最伟大思想家的贡献。我不认为“初创公司抛弃所有先例并创造颠覆性新软件”的开发方法一定是坏事,但 Vim 提醒我们,协作和增量方法也可以产生奇迹。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/193688.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vite动态配置svg图标及其他方式集合

文章目录 前言使用vite-plugin-svg-icons动态配置安装插件引入图标下载新建组件svg-icon.vue使用 使用vue组件动态配置总结如有启发,可点赞收藏哟~ 前言 在配置化的情况下,图标配置也显得极为重要的 使用vite-plugin-svg-icons动态配置 参考vite-plugin…

软件系统集成指南

软件产品集成是将各种软件组件、模块和代码组装成最终可执行、可应用的软件产品的过程。这个过程涉及到将工作产品转化为产品的组装过程。在软件工程中,产品集成是一个重要的环节,通过持续性集成,将产品集成的过程常态化、自动化。做好产品集…

2023 年 数维杯(B题)国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2021年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看数维杯(B题)! …

阿里云的99元服务器和腾讯云的88元云服务器选择哪个?怎么选?

近日,阿里云宣布在2023年双十一优惠活动中推出了一系列降价措施,使得同配置的云服务器比腾讯云更具竞争力。这一消息不仅在云计算领域引起了轰动,更为广大互联网用户提供了更为实惠的选择。 阿里云推出99元一年的服务器,续费价格…

[云原生2.] Kurbernetes资源管理 ---- (陈述式资源管理方式)

1. K8s管理资源的方法类别 1.1 陈述式资源管理方式 主要依赖命令行工具kubectl进行管理 可理解为使用一条命令和参数选项来实现资源的管理操作 1.2 声明式资源管理方式 主要依赖统一资源配置清单进行管理 可以理解为使用yaml配置文件的定义来实现资源的管理操作 1.3 GUI式…

算法-双指针-简单-移动零

记录一下算法题的学习2 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0] 示例 2…

【分享】Excel“只读方式”的两种模式

查阅Excel表格的时候,担心不小心修改了内容,可以给Excel设置以“只读方式”打开,这样就算修改了内容也不能直接保存表格。Excel表格可以设置两种“只读方式”,一起来看看吧! “只读方式” 1: 打开Excel表…

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日,日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解,揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示,该手机的国产零部件比例达到了47%,相较于三年前的 Mate 40 Pro,提高…

S25FL256S介绍及FPGA实现思路

本文介绍 S25FL256S 这款 FLASH 芯片,并进行 FPGA 读写控制的实现(编程思路及注意事项)。 文章目录 S25FL-S 介绍管脚功能说明SPI 时钟模式SDRDDR 工作模式FLASH存储阵列(地址空间映射)常用寄存器及相关指令Status Reg…

Android 14 Beta 1

Android 14的第一个 Beta 版,围绕隐私、安全、性能、开发人员生产力和用户定制等核心主题构建,同时继续改进平板电脑、可折叠设备等大屏幕设备的体验。我们一直在完善 Android 14 的功能和稳定性方面取得稳步进展,现在是时候向开发者和早期采…

mysql之搭建MHA架构实现高可用

1、定义 全称是masterhigh avaliabulity。基于主库的高可用环境下可以实现主从复制及故障切换(基于主从复制才能故障切换) MHA最少要求一主两从,半同步复制模式 2、作用 解决mysql的单点故障问题。一旦主库崩溃,MHA可以在0-30…

Elasticsearch:检索增强生成 (Retrieval Augmented Generation -RAG)

作者:JOE MCELROY 什么是检索增强生成 (RAG) 以及该技术如何通过提供相关源知识作为上下文来帮助提高 LLMs 生成的响应的质量。 生成式人工智能最近取得了巨大的成功和令人兴奋的成果,其模型可以生成流畅的文本、逼真的图像,甚至视频。 就语…

二叉树的创建与遍历

目录 前言: 二叉树的概念与结构 二叉树的链式存储 二叉树的创建 二叉树的销毁 二叉树结点个数计算 二叉树叶子结点个数计算 二叉树第k层节点个数的计算 二叉树高度的计算 二叉树查找值为x的结点 二叉树的遍历 二叉树的前序遍历 二叉树的中序遍历 二叉树…

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结

代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结 文章链接:两个字符串的删除操作、编辑距离、编辑距离总结 视频链接:两个字符串的删除操作、编辑距离 1. LeetCode 583. 两个字符串的删除操作 1.1 思…

计算机编程入门软件,计算机编程初学入门什么语言

计算机编程入门软件,计算机编程初学入门什么语言 给大家分享一款中文编程工具,零基础轻松学编程,不需英语基础,编程工具可下载。 这款工具不但可以连接部分硬件,而且可以开发大型的软件,象如图这个实例就是…

科研学习|研究方法——逻辑回归系数的显著性检验(python实现)

1. 背景 回归方程与回归系数的显著性检验 2. statsmodels 库 statsmodels库可以用来做逻辑回归、线性回归。并且会在summary中给出显著性检验的结果。最终我们想要的就是如下图的报告。 3. 计算过程 如果我们使用的sklearn构建的逻辑回归就没有办法直接输出这个报告&#xff0c…

swiper垂直方向全屏实现鼠标滚轮滚动一下切换一屏

效果 20231116092014 添加mousewheelControl: true,这个属性即可 <div class"swiper-container"><div class"swiper-wrapper"><div class"swiper-slide" > <div class"" style"height: 100%; background-…

如何使用iPhone15在办公室观看家里电脑上的4k电影?

如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f; 文章目录 如何使用iPhone15在办公室观看家里电脑上的4k电影&#xff1f;1.使用环境要求&#xff1a;2.下载群晖videostation&#xff1a;3.公网访问本地群晖videostation中的电影&#xff1a;4.公网条件下使用电脑…

jenkins+centos7上传发布net6+gitlab

工作中实践了一下jenkins的操作&#xff0c;所以记录一下这次经验&#xff0c;没有使用到docker 先看下成果&#xff1a; 选择发布项目 选择要发布的分支 构建中 发布成功 开始 首先安装好jenkins并注册自己的jenkins账号 因为我们的项目代码管理使用的是gitlab&#xff0c…

使用python电脑轻量级控制手机—adb命令和手机投屏

文章目录 一、通过无线连接手机和电脑二、使用adb命令轻量级控制手机二、使用scrcpy控制手机 通过电脑控制手机有多种方式如appnium等&#xff0c;本文介绍的是两种轻量级的方案&#xff0c;使用adb命令刚和手机投屏。 一、通过无线连接手机和电脑 1、手机设置 开发者选项—us…