範圍控制
回憶上節課內容🤔
-
我們這次研究了
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 - 藍橋雲課)