實現一個終端文字編輯器來學習golang語言:第一章專案構建

4ma2ingZed發表於2024-08-03

歡迎!這個系列的博文會帶你使用golang語言來編寫一個你自己的文字編輯器。更多介紹見https://www.cnblogs.com/Ama2ingYJ/p/18340634


這裡我把我們的文字編輯器專案命名為zedterm。

首先第一步自然是初始化golang工程

go mod init zedterm

作為文字編輯器,其中重要的一個工作便是讀取使用者的鍵盤輸入,並展示出來。現在我們來簡單寫一個程式。這個程式會持續讀取使用者輸入的字元,直到使用者輸入 'q':

package main  
  
import (  
	"bufio"  
	"fmt"  
	"os"  
)  
  
func main() {  
	reader := bufio.NewReader(os.Stdin)  
	for {  
		char, _, err := reader.ReadRune()  
		if err != nil {  
			panic(err)  
		}  
		fmt.Printf("Entered: %c\n", char)  
		if char == 'q' {  
			break  
		}  
	}  
}

如上所示,這是程式的主要步驟:

  1. reader := bufio.NewReader(os.Stdin):這一行建立了一個新的讀取器 reader,它從標準輸入(os.Stdin)讀取資料。
  2. for { ... }:這是一個無限迴圈,它會持續執行,直到遇到 break 語句。
  3. char, _, err := reader.ReadRune():這一行從 reader 讀取一個字元(rune)。如果在讀取過程中發生錯誤,它會返回一個錯誤。
  4. if err != nil { panic(err) }:這一行檢查 ReadRune() 是否返回了錯誤。如果有錯誤,它會呼叫 panic() 函式,這將終止程式並列印錯誤訊息。
  5. fmt.Printf("Entered: %c\n", char):這一行列印出讀取到的字元。
  6. if char == 'q' { break }:這一行檢查讀取到的字元是否是 'q'。如果是,它會執行 break 語句,這將跳出無限迴圈,然後程式結束。

在專案目錄下在terminal輸入go run . 以執行。

上述程式碼非常直觀,然而如果你執行的話,可能會遇到一個問題:每次按下鍵盤上的字元後,程式並沒有直接列印而是直到敲擊enter鍵後才列印。這是由於預設情況下,Linux 的終端把使用者的輸入暫時存放起來不“提交”,等使用者按下Enter鍵的時候一次性“提交”。平時用微信聊天也是這樣的機制,把要說的話編輯好再一次性發出去,這符合人的使用習慣,但和文字編輯器“按鍵之後立刻讀取、立刻反饋”的要求不符。

同時你會發現,作為一個終端的文字編輯器(如vim、nano),它缺少了游標的顯示。

我們會在第二章解決這些問題,當前程式碼足以證明我們的專案工程配置的沒問題,且已經能夠正常跑起來了。

相關文章