當前位置: 妍妍網 > 碼農

世界上最厲害的編程神器 ,被大多數人拋棄了......

2024-06-08碼農

如果你第一次在Linux上開啟vim時,遇到了圖中的情況,不要尷尬,其他人的第一次vi之旅也是這樣的。


等你開始練習vi,就會發現很多古怪的現象,比如:

為什麽使用H、J、K、L來移動光標?用上下左右箭頭鍵不好嗎?

為什麽vi要分為分為指令模式,插入模式,命令列模式?切來切去,多麻煩啊!

模式切換為什麽要用Esc鍵?它在鍵盤的左上角,想要按到它實在太難了!

另外,vi的學習曲線為什麽如此陡峭?


這麽難用的東西,我為什麽要用它?IDE不香嗎?

要想回答這些問題,我們得回到vi誕生的那個時候。

1975年秋天,Unix光環加身的大神Ken Thompson回到母校柏克萊大學做學術休假,他把帶來的Unix系統安裝到了一個PDP-11/70上,順手還寫了一個Pascal編譯器。


嗯,大牛就是這麽牛。

此時另外一位大神Bill Joy剛剛入學,他在用Pascal寫計畫作業的時候,發現了編譯器的缺陷,他也決定做一個黑客,把這個編譯器改好。


那時候沒有IDE,他們使用一個叫ed的文字編輯器來程式,ed也是大神Ken Thompson寫的。

ed不好用,後來有人寫出了em,Bill Joy又改進了em, 把它變成了en ,然後是eo, ep...... 最後是ex!

不管怎麽改,它們都是「行編輯器」 ,和我們現在用的文字編輯器最大的不同是:

沒有光標!只能按行編輯!

是不是有點匪夷所思?沒光標怎麽玩啊?

舉個例子,有一個檔有兩行,內容如下:

hello wold !

this is an example

我發現第一行的wold寫錯了,想改一下,怎麽做呢?

那第一步需要先輸入1(表示選中第一行),第一行就會顯示出來。

然後用s 命令呼叫搜尋函式,後面跟著搜尋文本和替換文本。

再輸入1,看看結果對不對。

整個過程如下,是不是挺讓人崩潰的?

1

hello wold !

s/wold/world

1

hello world !

唉,當時的程式設計師過的都是什麽日子啊!

Bill Joy 使用ex這個「趁手」的工具,很快就把Thompson留下的「爛攤子」Pascal編譯器給收拾好了,新的Pascal編譯速度很快,執行起來也很快,深受學生們的喜愛。

後來,柏克萊大學購買了一批叫做ADM-3A的終端,在螢幕上終於支持可以隨意移動的光標了!


Bill Joy 欣喜異常,他花了幾個月時間熬夜,重新設計了ex, 增加了「視覺化模式」,ex變成了大名鼎鼎的vi。

如果你自己看看ADM-3A終端的鍵盤,你就會發現兩件神奇的事情。


1.它沒有單獨的上下左右鍵

所以H、J、K、L 鍵只能「兼職」來移動光標。

2.Esc鍵和現在的Tab鍵在同一位置

Bill Joy 用它來做模式切換很方便,左手無需離開主行就可以輕松按到。

盡管後來PC的鍵盤發生了很大變化,但是習慣成自然,這兩個操作依然被無數使用者守護者,沿用至今。

vi是從ex等行編輯器發展而來,也繼承了很多行編輯器的操作,比如使用者都可以使用類似 /pattern 的命令來搜尋文本,以及使用

s/old/new/ 的形式來替換文本,或者透過指定行號來定位文本(例如,3 定位到第三行,$ 定位到最後一行)

這些操作如果在編輯模式下,就會出問題,3可能就表示使用者的文本,而不是命令了。

當然,也可以在編輯模式引入一個特殊的鍵如ctrl 來處理,最常見的是ctrl + c 表示復制, ctrl+v表示貼上。

但是,如果一個字母無法表達想要做的事情,需要敲入多個字母的時候,ctrl特殊鍵的方式就痛苦了,畢竟一個手指按著ctrl鍵,然後再敲一長串字母是很不爽的,對吧?

vi把編輯模式和命令模式區分開,就可以在命令模式玩出花兒來,甚至可以基於基本的詞來「造句」

動詞

動詞表示對文本的操作,例如:

  • d: delete 刪除

  • r: replace 替換

  • y: yank 復制

  • v: visual 選擇

  • 名詞

    名詞表示待編輯的文本物件。

  • w: word 一個單詞

  • s: sentence 一個句子

  • p: paragraph 一個段落

  • 修飾詞(有人稱為介詞)

    修飾詞表示待編輯文本的範圍或者位置。

  • i: inside 表示在...之內

  • a: around 表示環繞

  • t: till 直到某個字元(不包括該字元)

  • f: find 直到某個字元(包括該字元)

  • 然後就可以組詞成句了:動詞 + 介詞 + 名詞 ,例如:

  • 刪除當前的單詞: diw (delete inside word)

  • 改變當前的句子: cis(change inside sentence)

  • 刪除文本直到字元e: dte (delete till 'e')

  • 選擇一個句子: vis (visual inside sentence)

  • 非常強大也非常自然,並且vi還支持自訂,可以客製一套屬於自己的動詞名詞結構出來。

    當然,復雜的操作可以用滑鼠+選單的方式來實作,那就需要把手從鍵盤上挪開了。

    值得註意的是, vi 是在Modem只有300波特率的時候編寫的

    即使後來的1200波特率,傳輸文本的速度也比大多數人閱讀的速度慢,更別說300波特率了,這深刻地影響了vi的設計。

    Bill Joy曾經「酸酸地」說過:那些開發Emacs的家夥們坐在MIT的實驗室中,有著像現在光纖一樣快的網路,他們可以在螢幕閃爍的情況下發出有趣的命令,而我坐在柏克萊的簡陋房子裏,用著極其緩慢的數據機,幾乎無法讓光標離開底線。人們不會知道, vi是為了一個已經消失的世界編寫的。

    1979年5月,Bill Joy釋出了vi,初期使用者可能只有75個人。

    但是vi像野火一樣,迅速燒遍了Unix世界。

    1988年,Bram Moolenaar 寫出了vi的模仿品,Vi IMitation(簡稱vim)。

    隨後幾年,他不斷完善,1991年,正式釋出了vim,不過,此時它的含義是 Vi IMproved

    不管怎麽模仿、改進,它依然保留了vi那些來自 ADM-3A的,「古怪」的按鍵和模式,因為這已經成了vi程式設計師的信仰。


    一旦你跨過了那陡峭的學習曲線,真正掌握了vim,你就掌握了一個最厲害的編程神器 ,那些vim熟手在使用vim時,雙手在鍵盤上翻飛,光標在螢幕上遊動,程式碼在飛速地變換,讓人賞心悅目。

    但是,vim「古怪」的按鍵和模式,讓更多的程式設計師淺嘗輒止,退回到了傳統的編輯器和IDE,不能不說,這是一個很大的遺憾。

    本文作者

    劉欣 著有暢銷書【碼農翻身】【半小時漫畫電腦】,前IBM架構師,領導過多個企業套用架構設計和開發工作;洞 察技術本質,擅長用故事去講解復雜技術。

    來源丨公眾號: 碼農翻身 (ID: coderising

    dbaplus社群歡迎廣大技術人員投稿,投稿信箱: [email protected]