實現一個終端文字編輯器來學習golang語言:第三章文字檢視器part1

4ma2ingZed發表於2024-08-05


本章我們來完成文字編輯器的檔案開啟和檢視功能,最後成品如上圖。我們將分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內移動,所以指示游標位置的TextLocXTextLocY應當被移動到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.NewScannerscan方法來逐行讀取文字
    • 逐行在終端上渲染Buffer中的每個string元素。對於螢幕上的每個空行,仍然渲染一個 ~

Code Review 我的實現

相關文章