Writing an editor in less than 1000 lines of code, just for fun

Salvatore Sanfilippo

用不到 1000 行程式碼寫一個編輯器,只是為了好玩

警告:這是一篇又長又沒什麼用的網誌文章。簡單來說,我只是為了好玩,用不到 1000 行程式碼寫了一個文字編輯器,它不依賴 ncurses,還支援語法突顯和搜尋功能。程式碼在這裡:http://github.com/antirez/kilo

螢幕錄影在此:https://asciinema.org/a/90r2i9bq8po03nazhqtsifksb

獻給念舊的人,請繼續讀下去……

幾週前有一則新聞,說 Nano 編輯器不再是 GNU 專案的一部分。我的第一個反應是,哇,竟然還有人這麼在乎這個老舊的編輯器——它原本只是一個以終端機為基礎的電子郵件客戶端中所附編輯器的複製品。再說一次,「電子郵件客戶端」。到了現在,電子郵件客戶端這個概念本身都已經消失了,一切都變了。然而,我在 Hacker News 上卻看到不少人寫道,他們在隨機的系統上處理系統管理任務時,常常因為有 nano 可用而得救。Nano 也是我兒子用來寫他人生第一個 C 語言程式的工具。它提供了一種還算可以接受的體驗,不需要具備編輯檔案的經驗也能上手。

我就是這樣開始思考,要寫一個比 Nano 本身還要小得多的文字編輯器。基本上只是為了好玩,因為我喜歡、也欣賞小巧的程式。

如今寫一個編輯器有多遜、多沒用、多浪費時間?我們理應要去寫那些閃亮亮、令人驚豔、非常酷、非常複雜、很有價值的東西。但有時候,做一些沒有明確目的的事情反而讓人耳目一新。也有一些回憶……

我還記得小時候第一次接觸 Commodore 16 內建於 ROM 的組譯器,以及童年時期用過的所有家用電腦和 BASIC 直譯器。編輯器是人類與機器之間最基本的連結。它讓人能夠寫出電腦可以解讀的東西。那個方形提示符號的閃爍,是我們許多人永遠都不會忘記的畫面。

嗯,一切都很美好,但我的時間非常有限。在兩個週末之間,只有幾個小時的空檔,其餘時間都排滿了家庭活動,還要為朋友的長時間烤肉聚會準備肉品。也許我還是能在幾個零碎的空檔裡,用點小技巧寫出一個編輯器。我的目標是寫一個非常小巧、不使用 curses、又具備語法突顯功能的編輯器。基本上就是要能實際使用。這就是條件……東西很小,但在幾個小時內要從零開始寫出這一切,已經很不容易了。

不過……等等,我以前其實寫過一個編輯器,它是 LOAD81 專案的一部分,那是一個以 Lua 為基礎、給孩子用的程式設計環境。也許我可以直接重複利用它……與其用 SDL 來把內容寫到螢幕上,不如直接對終端機發送 VT100 跳脫序列呢?而且我在 linenoise 裡也有相關的程式碼,那是另一個玩具專案,後來卻在不少其他嚴肅的專案中找到了自己的位置。所以,也許把兩者混合起來……

第一週的週六早上我去了海邊,感覺很棒。之後我哥哥從 Edinburg 來到 Catania,到了傍晚,我們一起帶著筆電坐在花園裡,試著抵禦白天高達 30 度的高溫,於是我開始動手打造編輯器的第一個雛形。LOAD81 的程式碼相當模組化,要把它從原本的專案中抽離出來簡直易如反掌。幾個小時後,我就已經可以勉強進行編輯了,然後也該上床睡覺了。隔天我又在出門去海邊之前繼續做。我那 15 歲的兒子會睡到下午一點,畢竟,我 15 歲時夏天也是這樣睡的,所以我在等他起床的空檔,用 30 分鐘為單位衝刺寫程式,其餘時間則陪我可愛的女兒玩。最後在週日晚上,我試著把剩下所有的東西修好。

嘿,我還記得幾年前全心投入一個專案,就是那種 *hack* 一整個專案,一連好幾天全職投入的感覺。我現在老了,但還年輕到可以寫玩具編輯器,並把它當成正經事來做 :-)

然而生活是艱難的,週一到了。真正的工作來了,沒有時間搞玩具專案,甚至沒時間把週末做好的東西發布出來……它還需要一些最基本的修飾,以及一篇網誌文章。

我得等到這個週一才能再次動手處理「Kilo」編輯器。它之所以叫 Kilo,是因為它不到 1024 行程式碼。用來計算程式碼行數的「cloc」工具告訴我,在達到 1024 LOC 之前,我還有大約 100 行的空間,而一個像樣的編輯器畢竟還是需要「搜尋」功能。所以又回到程式碼,也試著稍微重構並重新加上註解,畢竟你知道的,當你在幾個小時內把兩個專案的片段混在一起時,程式碼品質不那麼優異的風險是很高的。

好了,現在是時候發布了,這個瘋狂的專案就此告一段落。也許有人會把它當作起點來寫一個真正的編輯器,或者也許它可以用來寫出一些有趣的新 CLI,超越常見的 REPL 風格模式。

程式碼在:http://github.com/antirez/kilo

HN 留言:https://news.ycombinator.com/item?id=12065217

原文由 Salvatore Sanfilippo 發布

本文章由 muse-spark-1.2-contributor 進行翻譯