oeasy教您玩转vim - 48 - # ed由来
范围控制
回忆上节课内容
我们这次研究了
mark
的定义和使用mb
定义'b
跳转- 可以对
marks
,查询删除
三种
marks
- 小写 本文件内
- 大写 跨文件
- 数字 配置文件中
甚至可以在行编辑中,使用标记
'a,'by
从标记a的行复制到标记b的行'a,'bt.
把从a到b的行复制到当前位置'a,'bm$
把从a到b的行移动到文档最后
- 行编辑模式可真是太方便了!
- 可是,你知道吗?
- 行编辑模式来自于ed
- 是当时的无奈之举?
- 怎么回事?
原始状态
- 我们从时间线捋回去,会发现vi进化过程沿着
- ed->ex->vi->vim
- 最早来自于贝尔实验室的
Ken Tompson
QED
- 1966 年,贝尔实验室聘用了
Ken Thompson
Thompson
刚刚在加州大学伯克利分校完成了电气工程和计算机科学的硕士学位在伯克利他使用一个名为QED
的文本编辑器- 该编辑器在 1965 到 1966 年间被开发用于伯克利分时系统
Thompson
到达贝尔实验室后做的第一件事就是为麻省理工学院兼容分时系统重写QED
- 他后来又为
Multics
项目写了另一个版本的QED
- 在重写过程中,他对程序进行了扩展
- 以便用户可以在文件中搜索某一行,并使用正则表达式进行替换。
开始
与伯克利的分时系统一样,由麻省理工学院、通用电气和贝尔实验室合作的 Multics
项目试图创建一个可行的商业分时操作系统。最终,AT&T
认为这个项目毫无进展并退出。在没有分时系统的情况下,Thompson
和贝尔实验室资深研究员 Dennis Ritchie
,开始怀念分时系统所提供的“交互式计算的感觉”,并着手创建他们自己的版本,该版本最终发展成为 Unix
。1969 年 8 月,在妻子和幼子外出去加州度假时,Thompson
“给操作系统、shell、编辑器和汇编程序分别分配了一个星期”,将新系统的基本组件组合在一起。
这个编辑器被称为 ed
。它是基于 QED
的,但并不完全是 QED
的复现。 Thompson
决定放弃某些 QED
的功能,弱化了对常规的表达式的支持,因此 ed 只能理解相对简单的正则表达式。QED
允许用户打开多个缓冲区同时编辑多个文件,但是 ed
一次只使用一个缓冲区。QED
可以执行包含命令的缓冲区,而 ed
则不能。这些简化可能是必要的。Dennis Ritchie
曾说过,去掉 QED
的高级正则表达式是“并不大的损失”。
ed
ed
现在是 POSIX
规范的一部分,所以如果你有一个符合 POSIX
的系统,你的电脑上就安装了 ed
。现在,许多 ed
命令都是 Vim
的一部分,因此,这就值得摆弄一番了。例如,你必须使用 w
命令来写入磁盘缓冲区,必须使用 q
命令来退出编辑器。
这两个命令可以写在同一行命令中,也就是 wq
。ed
与 Vim
一样,是一个模态编辑器;若要从命令模式进入输入模式,取决于你试图如何转换文本,需使用 insert 命令(i)、append 命令(a)或 change 命令(c)
。ed
还引入了 s/foo/bar/g
语法来查找和替换文本。
名字由来
ed
名字来自于 editor
编辑器
ed
不允许你编辑开放缓冲区中那些被其他行围绕的行,也不允许移动光标,因为 ed
在每次修改的时候都必须重新打印整个文件。在 1969 年, ed
没有任何机制来“清除”屏幕上的内容,因为”屏幕“就是一张纸,所有已经输出的东西都像是已经用墨水打印出来了。在必要的时候,你可以使用列表命令(l)要求 ed
打印出一系列的行,但是大多数时候,你都是在你看不到的文本上操作。因此,使用 ed
就像是尝试用一个低电量的手电筒在黑暗房间中摸索。每次你只能看到那么一点儿,所以必须尽最大努力去记住每件东西的位置。
来试试 ed
- 可以
sudo apt install ed
- 来装一下
vi
的老祖宗 ls -lah > oeasy.txt
ed oeasy.txt
1
显示第1
行2,5p
,显示2
到5
行- 我们能感觉到显示器其实是一张纸
- 这个
4,6p
命令在vi
也能用,含义是print
文本编辑器 em
对 Thompson
和 Ritchie
来说, ed
已经足够好了。但是其他人则认为它很难用,而且它作为一个淋漓尽致地表现 Unix
对新手敌意的例子而臭名昭著。在 1975 年,一个名叫 George Coulouris
的人(这位前辈很神奇,他的爸爸是英国演员,出演过公民凯恩)
在伦敦玛丽皇后学院的 Unix
系统上开发了一个改进版 ed
。Coulouris
利用他在玛丽女王学院的视频显示器开发他的编辑器。与 ed
不同的是,Coulouris
的程序允许用户编辑在屏幕中的一行代码,通过一次次击键的方式来操作行(想象一下在 Vim
中每次编辑一行)。 Thompson
拜访玛丽女王学院时,看到 Coulouris
已经写好的程序,驳斥道他不需要在编辑文件的时候看到它的状态。受此启发,Coulouris
将他的程序命名为 em
,或者“为凡人而生的编辑器”。the editor for mortals
,这也是 em
名字来源。
(George Coulouris)
vi
1976年,Coulouris
把 em
引入了加州大学伯克利分校,在那里他用了一个夏天的时间在 CS
系访学。这是 Ken Thompson
离开伯克利去贝尔实验室工作十年之后的事了。在伯克利,Coulouris
遇到了 Bill Joy
,一名研究生。Coulouris
斯向 Joy
展示了 em
, Joy
以 Coulouris
的源代码为基础,为扩展 ed
建立了一个名为 ex
的改进版 ed
。1978年,1.1 版本的 ex
与第 1 个版本的 BSD Unix
捆绑在一起。ex
在很大程度上与 ed兼容,但它增加了两种模式:一种“开放”模式,这种模式可以使 em 单行编辑成为可能,还有一种“可见”模式,这种模式会占据整个屏幕,并且可以像我们今天所习惯的那样,对整个文件进行实时编辑。
(Bill Joy)
1979 年的第 2 版 BSD 引入了一个名为 vi
的可执行文件,它只在可视模式下打开 ex
。vi
名字来自于 visual
可视模式
进化
ex/vi
(后来称为 vi
)建立了我们现在使用的 Vim
中大多数的约定,但这些约定当时并不是 ed
的一部分。Bill Joy 使用的视频终端是 Lear Siegler ADM-3A
,它的键盘没有光标键。而是,h、j、k 和 l
键上绘制光标键,所以 Bill Joy 在vi 中就使用这些键来进行光标移动。ADM-3A
键盘上 escape
键位置是今天我们所使用的键盘上的 tab
键,这也就解释了为什么这样一个难以够着的键会被用来实现像退出当前模式这么常见的操作。前缀命令的 :字符同样也来自 i,它在常规模式下(即运行 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
用户推动了这些功能的加入。)
缘起
“Vim”
现在是“改进版 Vi”的缩写,而最初代表的是“模拟版 Vi”
。和其他许多“vi克隆版本”
一样,Vim
始于在一个无法使用 vi
的平台上复现 vi
的一个尝试。在荷兰 Venlo
一家影印公司工作的软件工程师 Bram Moolenaar
想要为他全新的 Amiga 2000
准备一款类似于 vi
的编辑器。Moolenaar
已经习惯了在大学时使用的 Unix
系统上的 vi
,当时他 已经对 vi
了如指掌。所以在 1988 年,Moolenaar
使用当时的 STEVIE vi
克隆版本开始工作。
(Bram Moolenaar,2006 年加入 Google)
Moolenaar
接触到 STEVIE
缘于其曾经出现在一个叫 Fred Fish
的磁盘上。Fred Fish
是一名美国程序员,每个月都会寄出一张软盘,内含为 Amiga
平台提供的精选可用开源软件。有点类似于国内曾经的软件指南。任何人只要支付邮费就可以得到一张这样的磁盘。有若干版本的 STEVIE
曾在 Fred Fish
磁盘上发布。Moolenaar
使用的 STEVIE
版本在 Fred Fish 256
号磁盘上发布。(令人失望的是,Fred Fish
磁盘似乎与 Freddi Fish
海底大冒险游戏 没有任何关系。)
Moolenaar
喜欢 STEVIE
,但很快就注意到其缺失了很多 vi
命令。因此,在第一次发布 Vim
时,Moolenaar
优先考虑了 vi
的兼容性。当时已经有其他人编写了一系列的 vi
宏,当运行一个合适的 vi
兼容编辑器时,可以求解一个随机生成的迷宫。Moolenaar
能够让这些宏在 Vim
中运行。1991年,Vim
以 Vi模拟
为名第一次发布于 Fred Fish 591
号磁盘。Moolenaar
添加了一些特性(包括多级撤销和解决编译器错误的“quickfix
”模式),这意味着 Vim
已经完成了对 Vi
的超越。在 1993 年通过 FTP 发布 Vim 2.0
之前,Vim
都仍以 Vi模拟
的身份存在。
从vi到vim
在众多互联网合作者的帮助下,Moolenaar
稳健地在 Vim
中加入了一些功能。Vim 2.0
引入了对 wrap
选项的支持,以及对长行文本进行水平滚动的支持。受到了 vi克隆nvi
的启发,Vim 3.0
增加了对分割窗口和缓冲区的支持。Vim
现在还将每个缓冲区保存到交换文件中以避免程序崩溃造成文件丢失。Vim
支持语法高亮显示,第一次出现是在 Vim 5.0
中。与此同时,Vim 的受欢迎程度也在不断增长。它被移植到 MS-DOS
、 Windows
、Mac
,甚至被移植到 Unix
与原来的 vi
竞争。
2006 年,Vim
被 Linux Journal
读者评为最受欢迎的编辑器。如今,根据 2018 年 Stack Overflow
的开发者调查,Vim
是最受欢迎的文本模式(即终端模拟器)编辑器,受用于 25.8% 的软件开发人员(和 40% 的 Sysadmin / DevOps 人员)。在 1980 年代末和整个 1990 年代,程序员一度发起了“编辑器战争”,将 Emacs
用户与 vi
(即最终的 Vim
)用户进行了对比。虽然 Emacs
肯定仍有一些追随者,但有些人认为编辑器战争已经以 Vim
获胜而结束。2018年 Stack Overflow
的开发者调查显示只有 4.1% 的受访者使用 Emacs,也验证了这个事实。
Vim
是如何变得如此成功的?显然,人们喜欢 Vim
所提供的特性。但我认为,Vim
背后的悠久历史表明了它的优势远不仅仅体现在其功能集上。Vim
的代码库可以追溯到 1988 年,当时 Moolenaar
开始研究它。
某种程度上要感谢 Bill Joy 和 Bram Moolenaar 对向后兼容性非比寻常的关注,才使好的想法逐渐积累起来。从这个意义上说, vim文本编辑器
是运行时间最长、最成功的开源项目之一,得益于计算机世界中一些最伟大的思想贡献。我不认为“创业公司无视所有先例来创造颠覆性的新软件”的开发方式都是不妥的,但 Vim
提醒我们,这种协作和增量的方式同样能产生奇迹。
总结
- 我们这次研究
vim
的历史 - 为什么会有行编辑器这种东西
- 竟然是当年
- 没有显示器只有纸的时代的无奈之举
vim
进化到今天,依然还有好多人使用- 而且
ssh
的时候直接vim
就很方便 - 命令行还有什么好玩的么?
- 下次再说
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (overmind1980/oeasyvim)
[蓝桥实验楼 邀请码FJWYIMGB] (oeasy 教您零基础玩转编辑神器 Vim_Linux - 蓝桥云课)
oeasy教您玩转vim - 48 - # ed由来的更多相关文章
- oeasy教您玩转vim - 56 - # 字符可视化模式
可视化编辑 回忆上节课内容 我们学习了关于模式匹配中使用参数 单个参数 :%s/<h2>\(.*\)</h2>/ - \1/g 多个参数 :%s/<img src=\ ...
- oeasy教您玩转vim - 57 - # 行可视化
可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...
- oeasy教您玩转vim - 53 - # 批量替换
查找细节 回忆上节课内容 我们温习了关于搜索的相关内容 /正向,?反向 n保持方向,N改变方向 可以设置 是否忽略大写小写 是否从头开始查找 是否高亮显示 还有一些正则表达式的使用方法 行头行尾 ^$ ...
- oeasy教您玩转linux010203显示logo
我们来回顾一下 上一部分我们都讲了什么?
- oeasy 教您玩转linux010101查看内核uname
linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...
- oeasy教您玩转linux010202软件包管理apt
顾一下 上一部分我们都讲了什么?
- oeasy教您玩转linux010201持续输出yes
我们来回顾一下 上一部分我们都讲了什么?
- oeasy教您玩转linux010108到底哪个which
到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?
- oeasy教您玩转python - 006 - # hello world
Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...
- oeasy教您玩转linux-010110内容回顾
我们来回顾一下 我们都讲了什么?
随机推荐
- java获取Linux和window系统多网卡mac地址和IP
public static List<Map<String, String>> getMacAndIp() throws SocketException { List<M ...
- MYSQL造数据占用临时表空间
在MySQL中,临时表空间通常用于存储如ORDER BY.GROUP BY.DISTINCT.UNION.JOIN等操作中产生的临时数据.当这些操作的数据集太大而无法在内存中完成时,MySQL会使用磁 ...
- web component基础概念及使用
概念和使用 作为开发者,我们都知道尽可能多的重用代码是一个好主意.这对于自定义标记结构来说通常不是那么容易 - 想想复杂的HTML(以及相关的样式和脚本),有时您不得不写代码来呈现自定义UI控件,并且 ...
- RDP 端口转发 多窗口运行
需要设置本机的默认端口进行修改 优点:(1)部署简单.Windows自带,支持IPv4和IPv6(2)不用重启机器,还长记性.命令即时生效,重启系统后配置仍然存在.缺点:(1)不支持UDP(2)XP/ ...
- 8.17考试总结(NOIP模拟42)[卷·简单题·粉丝·字符串]
你的败因只有一个,就是与我为敌. T1 卷 解题思路 乍一看,简单的树形 DP . 后来一看数据范围,发现事实并非如此.(\((10^9)^{2\times 10^5}\)????) 毕竟取 \( ...
- OpenCV笔记(6) Bitwise
源码: BitwiseAnd //dst = src1 & src2 public static void BitwiseAnd(InputArray src1, InputArray s ...
- 2024 Web 新特性 - 使用 Popover API 创建弹窗
Popover API 为开发者提供了一种声明式的方式来创建各种类型的弹窗.目前已在所有三大浏览器引擎中可用,并正式成为 Baseline 2024 的一部分. 一直以来,我们在实现弹出式菜单.提示框 ...
- 使用腾讯元宝+markmap生成思维导图
AI可以帮助我们进行提炼和总结, 节省了大量搜索资料和查阅的时间,像上图这张思维导图,就是使用腾讯元宝大模型进行内容提炼,再使用markmap生成思维导图,下面讲解下详细实现步骤: 一.工具准备 腾讯 ...
- redis简单应用demo - 订单号自增长的思路:业务编码+地区+自增数值
redis简单应用demo1.字符串127.0.0.1:6379> set hello toneyOK127.0.0.1:6379> type hellostring127.0.0.1:6 ...
- const 和 volatile 指针
关键字 const 和 volatile 规定了指针的处理方式: const 规定指针在初始化后是受保护的,不能够再修改. volatile 规定了变量的值能够被用户应用程序外部的操作所修改. 因此, ...