实现一个终端文本编辑器来学习golang语言:第一章项目构建

cnblogs 2024-08-03 16:39:00 阅读 50

欢迎!这个系列的博文会带你使用golang语言来编写一个你自己的文本编辑器。更多介绍见https://www.cnblogs.com/Ama2ingYJ/p/18340634

这里我把我们的文本编辑器项目命名为zedterm。

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

<code>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

}

}

}

如上所示,这是程序的主要步骤:

    <li>reader := bufio.NewReader(os.Stdin):这一行创建了一个新的读取器reader,它从标准输入(os.Stdin)读取数据。
  1. for { ... }:这是一个无限循环,它会持续运行,直到遇到break语句。
  2. char, _, err := reader.ReadRune():这一行从reader读取一个字符(rune)。如果在读取过程中发生错误,它会返回一个错误。
  3. if err != nil { panic(err) }:这一行检查ReadRune()是否返回了错误。如果有错误,它会调用panic()函数,这将终止程序并打印错误消息。
  4. fmt.Printf("Entered: %c\n", char):这一行打印出读取到的字符。
  5. if char == 'q' { break }:这一行检查读取到的字符是否是 'q'。如果是,它会执行break语句,这将跳出无限循环,然后程序结束。

在项目目录下在terminal输入go run . 以运行。

上述代码非常直观,然而如果你运行的话,可能会遇到一个问题:每次按下键盘上的字符后,程序并没有直接打印而是直到敲击enter键后才打印。这是由于默认情况下,Linux 的终端把用户的输入暂时存放起来不“提交”,等用户按下回车键的时候一次性“提交”。平时用微信聊天也是这样的机制,把要说的话编辑好再一次性发出去,这符合人的使用习惯,但和文本编辑器“按键之后立刻读取、立刻反馈”的要求不符。

同时你会发现,作为一个终端的文本编辑器(如vim、nano),它缺少了光标的显示。

我们会在第二章解决这些问题,当前代码足以证明我们的项目工程配置的没问题,且已经能够正常跑起来了。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。