不到 1000 行程式碼寫一個編輯器,純粹好玩
原文由 Salvatore Sanfilippo 于 發布,訂閱此部落格
警告:這是一篇又長又沒什麼用的部落格文章。長話短說,我純粹好玩寫了一個不到 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 分鐘為單位衝刺寫程式,其他時間則拿來陪我可愛的女兒玩。最後在週日晚上,我試著把剩下所有東西修一修。
嘿,我還記得幾年前沉浸在一個專案裡就是真的 *埋頭苦幹*,一連好幾天全心投入。現在我老了,但還年輕到可以寫玩具編輯器,並把它當成正經事來看待 :-)
然而生活很現實,週一到了。真正的正事來了,沒有時間搞玩具專案,甚至連把週末做好的東西發布出來都沒時間……它還需要一點最基本的打磨和一篇部落格文章。
我得等到這個週一才又能碰「Kilo」編輯器。它叫 Kilo 是因為它不到 1024 行程式碼。用來計算程式碼行數的「cloc」工具告訴我,離 1024 行還有大約 100 行的空間,而一個像樣的編輯器畢竟還是需要「搜尋」功能。所以又回去改程式,順便試著稍微重整、重新加上註解,畢竟你知道的,在幾個小時內把兩個專案的片段湊在一起,程式碼品質很難稱得上優秀。
好了,現在是時候發布了,為這個瘋狂的專案畫下句點。也許有人會把它當作寫一個真正編輯器的起點,或者可以用它來寫出一些有趣的新 CLI,跳脫常見的 REPL 模式。
隨機一篇部落格
留言
登入後參與討論