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

news/2025/1/15 23:48:20/文章来源:https://www.cnblogs.com/Ama2ingYJ/p/18341230

从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上进行扩展。

首先,我们先来解决第一章遗留的第一个问题:输入数据会被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指令引入代码库进入项目

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的事件,则标记needQuittrue。这样每次刷新终端之前我们就可以根据这个flag决定是继续刷新终端还是直接退出。

作业2 波浪线~优化

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

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

Code Review 我的实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777417.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

protobuf pwn题专项

protobuf pwn 准备工作 安装protobuf编译器 sudo apt-get install libprotobuf-dev protobuf-compiler 安装python依赖库 pip3 install grpcio pip3 install grpcio-tools googleapis-common-protos安装pbtk git clone https://github.com/marin-m/pbtkggbond 来自DubheCTF202…

JAVA游戏源码:魔塔大学生练手项目java学习项目

学习java朋友们,福利来了,今天小编给大家带来了一款魔塔源码。注意:此源码仅供学习使用!! 视频演示 源码搭建和讲解 启动main入口://************************************************************************ // ************完整源码移步: gitee典康姆/hadluo/java_g…

第五周进度报告

这周主要学习了java的一些基础知识,接下来的任务继续学习javaAPI部分的知识 鼠标监听机制 - MouseListener键盘监听机制 -KeyListener常用APIpackage me.Study;public class Test {public static void main(String[] args) {//获取到当前时间的毫秒值long start = System.curre…

dotnet hello world

参考资料 dotnet 命令参考 使用 dotnet test 和 xUnit 在 .NET 中对 C# 进行单元测试 Declaring InternalsVisibleTo in the csproj XUnit输出消息 创建控制台项目 # 创建项目目录 md DotnetStudy cd DotnetStudy# 创建解决方案 dotnet new sln # 创建控制台项目,-n: 名称,--us…

第五周学习mysql

本周学完了mysql基础部分的知识点 下周将学习进阶方面 本周浮躁了很多,目标都没定好,发现学这些mysql和之前学的代码思路有很多不一样的地方,上手很慢,学完事务之后才有一些整体的意思; 下周会定好目标加油努力学到视图,如果是只看视频不跟着敲代码的话,那就学完进阶篇,…

JAVA游戏源码:仙剑奇侠传|大学生练手项目

视频演示 源码搭建和讲解 启动main入口://************************************************************************ // ************完整源码移步: gitee典康姆/hadluo/java_game01.git ********* //*****************************************************************…

【恶意代码】那些事

一、什么是恶意代码 恶意代码(Unwanted Code) 是指故意编制或设置的对网络或系统会产生威胁或潜在威胁的计算机代码。最常见的恶意代码有计算机病毒(简称病毒)、特洛伊木马 (简称木马)、计算机蠕虫 (简称蠕虫)、后门、逻辑炸弹等等。 二、恶意代码的分类 恶意代码分类 恶意代码…

重学 KMP 小记

重学 KMP 小记 前言 KMP 这个东西赛时用到的几率很小(虽然圣人说概率不小、也不是很大),但是如果一旦考字符串类的题又极可能考匹配问题。当时掌握得也是一知半解,所以现在来重学来了。 情境引入 现实中我们会遇到类似的问题:给你一篇报道,让你找一找这篇报道中有没有出现…

Manhattan Triangle

纪念一下代码打得太慢了导致比赛结束3分钟才做出来的E题 我的做法: 考虑确定枚举三角形的一个点。最开始尝试枚举\(x\)最大的点,但是后面发现不太好讨论,于是尝试枚举\(x\)在中间的点,此时发现由于曼哈顿是三角形不可能是钝角三角形,剩下两个点要么同时在中间点的上方,要…

JAVA游戏源码:天天酷跑

学习java朋友们,福利来了,今天小编给大家带来了一款天天酷跑源码。注意:此源码仅供学习使用!! 源码搭建和讲解 启动main入口://************************************************************************ // ************完整源码移步: gitee典康姆/hadluo/java_game01…