实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出 ...

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673


从第二章开始,在每个末节的末了都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上举行扩展。
首先,我们先来解决第一章遗留的第一个题目:输入数据会被stdin缓存,直到遇到换行符(也就是按下 Enter 键)才被发送。
进入Raw模式(Raw Mode)

"Raw mode" 是一个终端设置,该设置允许程序直接处理终端的输入数据。在 "raw mode" 中,输入的字符不会被终端缓冲,而会立刻发送到程序。这意味着程序可以立刻相应用户的每一个按键,而不需要等待用户按下 Enter 键。
此外,在 "raw mode" 中,终端不会处理特别的控制字符,例如 Ctrl+C(通常用于发送中断信号)或 Ctrl+Z(通常用于挂起程序)。这些字符会直接发送到程序,程序可以自行决定如何处理它们。
需要注意的是,开启 "raw mode" 需要对终端和操作体系有深入的明白,并且可能需要特定的平台相关代码支持。在本次项目中我们决定使用 termbox-go 库来简化这个过程。以下翻译自termbox-go库的介绍:
Termbox是一个库,它提供了一种简洁的API,允许程序员编写基于文本的用户界面。该库是跨平台的,既有*nix操作体系上的基于终端的实现,也有Windows操作体系上基于winapi控制台的实现。基本的想法是以简洁的方式抽象出所有重要终端和其他雷同终端API中可用的最大公共子集的特性。小型API意味着它易于实现,测试,维护和学习,这就是使termbox在其领域中成为一个独特库的缘故起因。
通过go get指令引入代码库进入项目
  1. go get -u github.com/nsf/termbox-go
复制代码
这个库提供的API接口许多,我们需要了解以下三个函数:

  • termbox.Init()
  • termbox.Size()
  • termbox.PollEvent()
    这里不在展开,可以看对应库函数的解释来了解用途。
作业1 波浪线~

你的第一个使命是在屏幕的最左侧绘制一列波浪符(~),就像vim所做的那样。在我们的文本编辑器中,我们将在编辑的文件结束后的任何行的开头绘制一个波浪符,当前你可以使用fmt.Printf来举行绘制。其次当输入q的时候,结束程序运行。
Code Review 我的实现

  • 首先定义了一个editor结构体代表终端
  • 通过termbox.Size()获取到终端的宽高,然后不断打印~,直至到终端底部。
  • 通过termbox.PollEvent()来捕捉终端变乱,如果是键入q的变乱,则标记needQuit为true。这样每次刷新终端之前我们就可以根据这个flag决定是继承刷新终端还是直接退出。
作业2 波浪线~优化

在这个作业中我们对波浪线~的画法举行优化,使用termbox的api举行绘制,同时展示出光标。
需要注意的是当终端正在绘制屏幕时,光标可能会在屏幕中间的某个地方闪现,。为了确保这个闪烁效果不会发生,我们需要在刷新屏幕之前隐藏光标,并在刷新完成后立刻显示出来。你需要完成如下功能:

  • 每当termbox.PollEvent捕捉到键盘上下左右移动时,同时向对应方向移动终端上的光标
  • 在刷新屏幕之前将光标隐藏(使用termbox.HideCursor)
  • 刷新屏幕后,展示光标(使用termbox.SetCursor)
  • 使用termbox.SetCell方法绘制波浪线~
    注意:使用termbox api举行绘制时,绘制行为会被保存在其内部的buffer中,以是需要在符合的时候调用termbox.Flush举行屏幕刷新
Code Review 我的实现

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表