oeasy教您玩轉(zhuǎn)vim - 48 - # ed由來
范圍控制
回憶上節(jié)課內(nèi)容??
我們這次研究了
mark
的定義和使用mb
定義'b
跳轉(zhuǎn)可以對
marks
,查詢刪除三種
marks
小寫 本文件內(nèi)
大寫 跨文件
數(shù)字 配置文件中
甚至可以在行編輯中,使用標(biāo)記
'a,'by
從標(biāo)記a的行復(fù)制到標(biāo)記b的行'a,'bt.
把從a到b的行復(fù)制到當(dāng)前位置'a,'bm$
把從a到b的行移動到文檔最后行編輯模式可真是太方便了!
可是,你知道嗎?
行編輯模式來自于ed
是當(dāng)時的無奈之舉?
怎么回事???
原始狀態(tài)
我們從時間線捋回去,會發(fā)現(xiàn)vi進(jìn)化過程沿著
ed->ex->vi->vim
最早來自于貝爾實驗室的
Ken Tompson

QED
1966 年,貝爾實驗室聘用了
Ken Thompson
Thompson
剛剛在加州大學(xué)伯克利分校完成了電氣工程和計算機科學(xué)的碩士學(xué)位在伯克利他使用一個名為QED
的文本編輯器該編輯器在 1965 到 1966 年間被開發(fā)用于伯克利分時系統(tǒng)
Thompson
到達(dá)貝爾實驗室后做的第一件事就是為麻省理工學(xué)院兼容分時系統(tǒng)重寫QED
他后來又為
Multics
項目寫了另一個版本的QED
在重寫過程中,他對程序進(jìn)行了擴(kuò)展
以便用戶可以在文件中搜索某一行,并使用正則表達(dá)式進(jìn)行替換。
開始
與伯克利的分時系統(tǒng)一樣,由麻省理工學(xué)院、通用電氣和貝爾實驗室合作的 Multics
項目試圖創(chuàng)建一個可行的商業(yè)分時操作系統(tǒng)。最終,AT&T
認(rèn)為這個項目毫無進(jìn)展并退出。在沒有分時系統(tǒng)的情況下,Thompson
和貝爾實驗室資深研究員 Dennis Ritchie
,開始懷念分時系統(tǒng)所提供的“交互式計算的感覺”,并著手創(chuàng)建他們自己的版本,該版本最終發(fā)展成為 Unix
。1969 年 8 月,在妻子和幼子外出去加州度假時,Thompson
“給操作系統(tǒng)、shell、編輯器和匯編程序分別分配了一個星期”,將新系統(tǒng)的基本組件組合在一起。
這個編輯器被稱為 ed
。它是基于 QED
的,但并不完全是 QED
的復(fù)現(xiàn)。 Thompson
決定放棄某些 QED
的功能,弱化了對常規(guī)的表達(dá)式的支持,因此 ed 只能理解相對簡單的正則表達(dá)式。QED
允許用戶打開多個緩沖區(qū)同時編輯多個文件,但是 ed
一次只使用一個緩沖區(qū)。QED
可以執(zhí)行包含命令的緩沖區(qū),而 ed
則不能。這些簡化可能是必要的。Dennis Ritchie
曾說過,去掉 QED
的高級正則表達(dá)式是“并不大的損失”。
ed
ed
現(xiàn)在是 POSIX
規(guī)范的一部分,所以如果你有一個符合 POSIX
的系統(tǒng),你的電腦上就安裝了 ed
。現(xiàn)在,許多 ed
命令都是 Vim
的一部分,因此,這就值得擺弄一番了。例如,你必須使用 w
命令來寫入磁盤緩沖區(qū),必須使用 q
命令來退出編輯器。

這兩個命令可以寫在同一行命令中,也就是 wq
。ed
與 Vim
一樣,是一個模態(tài)編輯器;若要從命令模式進(jìn)入輸入模式,取決于你試圖如何轉(zhuǎn)換文本,需使用 insert 命令(i)、append 命令(a)或 change 命令(c)
。ed
還引入了 s/foo/bar/g
語法來查找和替換文本。
名字由來
ed
名字來自于 editor
編輯器
ed
不允許你編輯開放緩沖區(qū)中那些被其他行圍繞的行,也不允許移動光標(biāo),因為 ed
在每次修改的時候都必須重新打印整個文件。在 1969 年, ed
沒有任何機制來“清除”屏幕上的內(nèi)容,因為”屏幕“就是一張紙,所有已經(jīng)輸出的東西都像是已經(jīng)用墨水打印出來了。在必要的時候,你可以使用列表命令(l)要求 ed
打印出一系列的行,但是大多數(shù)時候,你都是在你看不到的文本上操作。因此,使用 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
已經(jīng)足夠好了。但是其他人則認(rèn)為它很難用,而且它作為一個淋漓盡致地表現(xiàn) Unix
對新手?jǐn)骋獾睦佣裘阎T?1975 年,一個名叫 George Coulouris
的人(這位前輩很神奇,他的爸爸是英國演員,出演過公民凱恩)
在倫敦瑪麗皇后學(xué)院的 Unix
系統(tǒng)上開發(fā)了一個改進(jìn)版 ed
。Coulouris
利用他在瑪麗女王學(xué)院的視頻顯示器開發(fā)他的編輯器。與 ed
不同的是,Coulouris
的程序允許用戶編輯在屏幕中的一行代碼,通過一次次擊鍵的方式來操作行(想象一下在 Vim
中每次編輯一行)。 Thompson
拜訪瑪麗女王學(xué)院時,看到 Coulouris
已經(jīng)寫好的程序,駁斥道他不需要在編輯文件的時候看到它的狀態(tài)。受此啟發(fā),Coulouris
將他的程序命名為 em
,或者“為凡人而生的編輯器”。the editor for mortals
,這也是 em
名字來源。

(George Coulouris)
vi
1976年,Coulouris
把 em
引入了加州大學(xué)伯克利分校,在那里他用了一個夏天的時間在 CS
系訪學(xué)。這是 Ken Thompson
離開伯克利去貝爾實驗室工作十年之后的事了。在伯克利,Coulouris
遇到了 Bill Joy
,一名研究生。Coulouris
斯向 Joy
展示了 em
, Joy
以 Coulouris
的源代碼為基礎(chǔ),為擴(kuò)展 ed
建立了一個名為 ex
的改進(jìn)版 ed
。1978年,1.1 版本的 ex
與第 1 個版本的 BSD Unix
捆綁在一起。ex
在很大程度上與 ed兼容,但它增加了兩種模式:一種“開放”模式,這種模式可以使 em 單行編輯成為可能,還有一種“可見”模式,這種模式會占據(jù)整個屏幕,并且可以像我們今天所習(xí)慣的那樣,對整個文件進(jìn)行實時編輯。

(Bill Joy)
1979 年的第 2 版 BSD 引入了一個名為 vi
的可執(zhí)行文件,它只在可視模式下打開 ex
。vi
名字來自于 visual
可視模式
進(jìn)化
ex/vi
(后來稱為 vi
)建立了我們現(xiàn)在使用的 Vim
中大多數(shù)的約定,但這些約定當(dāng)時并不是 ed
的一部分。Bill Joy 使用的視頻終端是 Lear Siegler ADM-3A
,它的鍵盤沒有光標(biāo)鍵。而是,h、j、k 和 l
鍵上繪制光標(biāo)鍵,所以 Bill Joy 在vi 中就使用這些鍵來進(jìn)行光標(biāo)移動。ADM-3A
鍵盤上 escape
鍵位置是今天我們所使用的鍵盤上的 tab
鍵,這也就解釋了為什么這樣一個難以夠著的鍵會被用來實現(xiàn)像退出當(dāng)前模式這么常見的操作。前綴命令的 :字符同樣也來自 i,它在常規(guī)模式下(即運行 ex 進(jìn)入的模式)使用 : 作為提示。這解決了一個 ed
中被長期詬病的問題,也就是一旦啟動之后,沒有任何反饋信息向用戶致以問候。在可見模式下,保存和退出需要使用現(xiàn)在仍在使用的經(jīng)典 wq
。“Yanking”和“putting”
、標(biāo)記
、以及用于設(shè)置選項的 set
命令都是原始 vi
的一部分。我們今天在 Vim
中使用的的基本文本編輯過程,都是 vi
中使用的特性。

vi
是除 ed
之外唯一與 BSD Unix
捆綁的文本編輯器。在那個時候,Emacs
可能會花費數(shù)百美元(這是在 GNU Emacs
之前),所以 vi
變得非常流行。但是 vi
是 ed
的直接衍生版本,這意味著如果沒有 AT&T
的源代碼,源代碼就不能被修改。這促使一些人創(chuàng)建了 vi
的開源版本。 STEVIE
(專門為 VI
愛好者的 ST
編輯器)出現(xiàn)于1987年,Elvis
出現(xiàn)于 1990 年,nvi
出現(xiàn)于 1994 年。其中一些克隆版本添加了額外的功能,如語法高亮和窗口分離。尤其是 Elvis
,它的許多功能被整合到 Vim
中,因為許多 Elvis
用戶推動了這些功能的加入。)
緣起
“Vim”
現(xiàn)在是“改進(jìn)版 Vi”的縮寫,而最初代表的是“模擬版 Vi”
。和其他許多“vi克隆版本”
一樣,Vim
始于在一個無法使用 vi
的平臺上復(fù)現(xiàn) vi
的一個嘗試。在荷蘭 Venlo
一家影印公司工作的軟件工程師 Bram Moolenaar
想要為他全新的 Amiga 2000
準(zhǔn)備一款類似于 vi
的編輯器。Moolenaar
已經(jīng)習(xí)慣了在大學(xué)時使用的 Unix
系統(tǒng)上的 vi
,當(dāng)時他 已經(jīng)對 vi
了如指掌。所以在 1988 年,Moolenaar
使用當(dāng)時的 STEVIE vi
克隆版本開始工作。

(Bram Moolenaar,2006 年加入 Google)
Moolenaar
接觸到 STEVIE
緣于其曾經(jīng)出現(xiàn)在一個叫 Fred Fish
的磁盤上。Fred Fish
是一名美國程序員,每個月都會寄出一張軟盤,內(nèi)含為 Amiga
平臺提供的精選可用開源軟件。有點類似于國內(nèi)曾經(jīng)的軟件指南。任何人只要支付郵費就可以得到一張這樣的磁盤。有若干版本的 STEVIE
曾在 Fred Fish
磁盤上發(fā)布。Moolenaar
使用的 STEVIE
版本在 Fred Fish 256
號磁盤上發(fā)布。(令人失望的是,Fred Fish
磁盤似乎與 Freddi Fish
海底大冒險游戲 沒有任何關(guān)系。)
Moolenaar
喜歡 STEVIE
,但很快就注意到其缺失了很多 vi
命令。因此,在第一次發(fā)布 Vim
時,Moolenaar
優(yōu)先考慮了 vi
的兼容性。當(dāng)時已經(jīng)有其他人編寫了一系列的 vi
宏,當(dāng)運行一個合適的 vi
兼容編輯器時,可以求解一個隨機生成的迷宮。Moolenaar
能夠讓這些宏在 Vim
中運行。1991年,Vim
以 Vi模擬
為名第一次發(fā)布于 Fred Fish 591
號磁盤。Moolenaar
添加了一些特性(包括多級撤銷和解決編譯器錯誤的“quickfix
”模式),這意味著 Vim
已經(jīng)完成了對 Vi
的超越。在 1993 年通過 FTP 發(fā)布 Vim 2.0
之前,Vim
都仍以 Vi模擬
的身份存在。
從vi到vim
在眾多互聯(lián)網(wǎng)合作者的幫助下,Moolenaar
穩(wěn)健地在 Vim
中加入了一些功能。Vim 2.0
引入了對 wrap
選項的支持,以及對長行文本進(jìn)行水平滾動的支持。受到了 vi克隆nvi
的啟發(fā),Vim 3.0
增加了對分割窗口和緩沖區(qū)的支持。Vim
現(xiàn)在還將每個緩沖區(qū)保存到交換文件中以避免程序崩潰造成文件丟失。Vim
支持語法高亮顯示,第一次出現(xiàn)是在 Vim 5.0
中。與此同時,Vim 的受歡迎程度也在不斷增長。它被移植到 MS-DOS
、 Windows
、Mac
,甚至被移植到 Unix
與原來的 vi
競爭。
2006 年,Vim
被 Linux Journal
讀者評為最受歡迎的編輯器。如今,根據(jù) 2018 年 Stack Overflow
的開發(fā)者調(diào)查,Vim
是最受歡迎的文本模式(即終端模擬器)編輯器,受用于 25.8% 的軟件開發(fā)人員(和 40% 的 Sysadmin / DevOps 人員)。在 1980 年代末和整個 1990 年代,程序員一度發(fā)起了“編輯器戰(zhàn)爭”,將 Emacs
用戶與 vi
(即最終的 Vim
)用戶進(jìn)行了對比。雖然 Emacs
肯定仍有一些追隨者,但有些人認(rèn)為編輯器戰(zhàn)爭已經(jīng)以 Vim
獲勝而結(jié)束。2018年 Stack Overflow
的開發(fā)者調(diào)查顯示只有 4.1% 的受訪者使用 Emacs,也驗證了這個事實。
Vim
是如何變得如此成功的?顯然,人們喜歡 Vim
所提供的特性。但我認(rèn)為,Vim
背后的悠久歷史表明了它的優(yōu)勢遠(yuǎn)不僅僅體現(xiàn)在其功能集上。Vim
的代碼庫可以追溯到 1988 年,當(dāng)時 Moolenaar
開始研究它。
某種程度上要感謝 Bill Joy 和 Bram Moolenaar 對向后兼容性非比尋常的關(guān)注,才使好的想法逐漸積累起來。從這個意義上說, vim文本編輯器
是運行時間最長、最成功的開源項目之一,得益于計算機世界中一些最偉大的思想貢獻(xiàn)。我不認(rèn)為“創(chuàng)業(yè)公司無視所有先例來創(chuàng)造顛覆性的新軟件”的開發(fā)方式都是不妥的,但 Vim
提醒我們,這種協(xié)作和增量的方式同樣能產(chǎn)生奇跡。
總結(jié)
我們這次研究
vim
的歷史為什么會有行編輯器這種東西
竟然是當(dāng)年
沒有顯示器只有紙的時代的無奈之舉
vim
進(jìn)化到今天,依然還有好多人使用而且
ssh
的時候直接vim
就很方便命令行還有什么好玩的么???
下次再說 *
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[藍(lán)橋?qū)嶒灅?邀請碼FJWYIMGB] (https://www.lanqiao.cn/courses/2840)