本章我們來完成文字編輯器的檔案開啟和檢視功能,最後成品如上圖。我們將分4步,逐漸完成本章所需功能。內容比較多,會分為兩個部分,第一部分主要關注於“View檢視”和“buffer及文字讀取”。
如上圖最終效果所示,我們希望在終端的最下方增加一個狀態列,能夠展示當前被開啟的檔案和當前的游標位置。
同時我們打算對整個終端檢視做一些劃分和重構。
首先先介紹一下編輯器各個元件的定位:
- 編輯器
editor
:此元件主要在不同的使用者介面元件(當前僅View
)之間進行協調。 - 檢視
View
:此元件接收來自編輯器的每個與文字相關的事件,例如字元的按鍵輸入、換行等。檢視使用此資訊來進行渲染,並將文字修改事件轉化並傳遞給緩衝區buffer
。 - 緩衝區
buffer
(一會兒會介紹到):此元件將儲存我們的文字。本專案我們只會從處理ascii碼的字元,不會針對全形字元、emoji符號進行處理 ,所以對這類特殊字元的展示和編輯可能會有異常。
具體來說,紅框內部分是編輯器的主要互動部分,我們把它用一個名為view的結構體來表示;下方橙黃色框內的部分我們把它用status_bar的結構體來表示,它會顯示編輯器的一些狀態資訊,如當前開啟的檔名和當前游標在第幾行第幾列。
View結構
首先我們來重構專案部分程式碼,來把一些現有功能放入view結構體以及它的方法中,因此我們的editor
結構體應該持有一個View
type editor struct {
view *view.View
needQuit bool
}
而對於View
來說,因為游標只能在View
內移動,所以指示游標位置的TextLocX
、TextLocY
應當被移動到View
結構的成員中。
type View struct {
TextLocX int
TextLocY int
}
其餘和View
相關的函式頁應被重構為View的方法,包括
- CursorPos
- Render
- MoveCursor
作業1
按“View結構”的要求,重構程式碼。
Code Review 我的實現
簡單的Buffer
緩衝區是一種常見的結構,它儲存了文字編輯器修改和顯示文字檔案所需的一切。檢視與緩衝區互動以在螢幕上呈現文字。在許多文字編輯器中,您可以輕鬆地從一個緩衝區切換到下一個緩衝區,從而允許您並行開啟多個檔案。
緩衝區的實現細節因文字編輯器而異。例如,Nano 使用一種簡單直接的緩衝區結構:儲存檔案時,緩衝區的內容(不包括語法高亮顯示的顏色等資料)會儲存到磁碟。而Vim 具有複雜的內部結構,即使在處理大型檔案時也能高效地處理操作,並且包括一個單獨的螢幕緩衝區,用於表示當前螢幕上可見的內容。這些設計選擇反映了每個編輯器的願景:Nano 旨在成為一個小型、輕量級的編輯器,適用於快速更新配置檔案。而 Vim 則被設計為一個功能齊全、功能豐富的文字編輯器,非常適合處理冗長的檔案。
作業2 簡單的buffer
- 建立一個名為 Buffer 的新結構體,其中包含一個
string
切片 - 更改View結構以容納一個Buffer
- buffer提供load_file方法:該方法讀取文字,並將文字內容存到buffer中,一行文字對應buffer中的一個string元素
- 你可以使用
bufio.NewScanner
的scan
方法來逐行讀取文字 - 逐行在終端上渲染Buffer中的每個string元素。對於螢幕上的每個空行,仍然渲染一個
~
- 你可以使用
Code Review 我的實現