如何寫一個編輯器:緒言

在上一篇寫完之后,頸椎和背部的肌肉開始出現(xiàn)不太正常的情況。經(jīng)過幾天的休息之后,基本有所緩解。
即使轉(zhuǎn)頭太難受,也覺得,得寫點東西。就寫一個編輯器吧。前一篇提到的一些算法和編輯器,雖然有一些歷史遺留,但是大抵上還是能重新構(gòu)建出來的。而構(gòu)建出來的東西,實際上是基于TUI的(text-based user interfaces)。這個TUI的典型,就是基于書中提到的VT100終端上面,搞文本操作。

如果舉不太久的例子,那大概可以想象一下DOS下面的一些編輯器的樣子。實際上,我寫完最初版本的,陡然發(fā)現(xiàn)TUI上面的一些操作實際上和畫GUI是一樣的。當(dāng)然,這種一樣,前提是把繪圖作為一種抽象的行為來看,而不是拘泥于實際的繪制差異。

雖然,TUI這種東西的復(fù)古味道比較濃烈,但是在實現(xiàn)編輯器這一個話題上,卻比使用GUI框架還是簡單不少。而且,舉一反三,把TUI的經(jīng)驗遷移到GUI上也并不復(fù)雜。
前幾天(12月25號)發(fā)布的Ruby 3.1.0里面實現(xiàn)了比較復(fù)雜terminal控制(自動補全等)。這里面的東西也算得上是編輯器,但是肯定比本教程要描述的編輯器還是要復(fù)雜很多的。

熟悉我的讀者大概知道我是搞TeX的,還是底層開發(fā)的那種。而TeX的概念之中,有一個叫做escape的,通常翻譯成轉(zhuǎn)義字符。我們每天使用的鍵盤上就有個ESC按鍵。自從ASCII編碼創(chuàng)制以來,ESC的作用,多是來發(fā)送指令來執(zhí)行人機交互的。這里面的人機交互比較簡單,比如發(fā)送指令讓程序打開或者保存文件,或者讓屏幕上的文本改變一下樣式(顏色等)。
我們可以運行下面的例子:
輸出大抵如下:

實際上,這段代碼隱藏了很多細節(jié),我們可以直接簡單粗暴地使用:
那么出現(xiàn)的效果實際上是一樣的。
這里面的“\x1b”開始的一串字符,就是之后我們要使用的控制終端輸出的部分。這一串字符串能夠控制的東西很多,比如顏色,鼠標(biāo)模式,光標(biāo)位置。
這里只是一個簡單的介紹,更詳細的控制可以參考維基百科的ANSI?escape?code詞條。
下一篇,講文件的結(jié)構(gòu)。