歡迎!這個系列的博文會帶你使用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
}
}
}
如上所示,這是程式的主要步驟:
reader := bufio.NewReader(os.Stdin)
:這一行建立了一個新的讀取器reader
,它從標準輸入(os.Stdin
)讀取資料。for { ... }
:這是一個無限迴圈,它會持續執行,直到遇到break
語句。char, _, err := reader.ReadRune()
:這一行從reader
讀取一個字元(rune)。如果在讀取過程中發生錯誤,它會返回一個錯誤。if err != nil { panic(err) }
:這一行檢查ReadRune()
是否返回了錯誤。如果有錯誤,它會呼叫panic()
函式,這將終止程式並列印錯誤訊息。fmt.Printf("Entered: %c\n", char)
:這一行列印出讀取到的字元。if char == 'q' { break }
:這一行檢查讀取到的字元是否是 'q'。如果是,它會執行break
語句,這將跳出無限迴圈,然後程式結束。
在專案目錄下在terminal輸入go run .
以執行。
上述程式碼非常直觀,然而如果你執行的話,可能會遇到一個問題:每次按下鍵盤上的字元後,程式並沒有直接列印而是直到敲擊enter鍵後才列印。這是由於預設情況下,Linux 的終端把使用者的輸入暫時存放起來不“提交”,等使用者按下Enter鍵的時候一次性“提交”。平時用微信聊天也是這樣的機制,把要說的話編輯好再一次性發出去,這符合人的使用習慣,但和文字編輯器“按鍵之後立刻讀取、立刻反饋”的要求不符。
同時你會發現,作為一個終端的文字編輯器(如vim、nano),它缺少了游標的顯示。
我們會在第二章解決這些問題,當前程式碼足以證明我們的專案工程配置的沒問題,且已經能夠正常跑起來了。