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

从第二章开始,在每个小节的最后都会有一些代码实操作业,你可以选择自己完成(比较推荐),再对照我的实现方式,当然也可以直接看我的代码实现。不过,之后的各个功能实现,我都会基于我先前的代码实现版本,在它的基础上进行扩展。
首先,我们先来解决第一章遗留的第一个问题:输入数据会被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的事件,则标记needQuit为true。这样每次刷新终端之前我们就可以根据这个flag决定是继续刷新终端还是直接退出。
作业2 波浪线~优化
在这个作业中我们对波浪线~的画法进行优化,使用termbox的api进行绘制,同时展示出光标。
需要注意的是当终端正在绘制屏幕时,光标可能会在屏幕中间的某个地方闪现,。为了确保这个闪烁效果不会发生,我们需要在刷新屏幕之前隐藏光标,并在刷新完成后立即显示出来。你需要完成如下功能:
- 每当termbox.PollEvent捕捉到键盘上下左右移动时,同时向对应方向移动终端上的光标
- 在刷新屏幕之前将光标隐藏(使用termbox.HideCursor)
- 刷新屏幕后,展示光标(使用termbox.SetCursor)
- 使用termbox.SetCell方法绘制波浪线~
注意:使用termbox api进行绘制时,绘制行为会被保存在其内部的buffer中,所以需要在合适的时候调用termbox.Flush进行屏幕刷新
Code Review 我的实现
实现一个终端文本编辑器来学习golang语言:第二章Raw模式下的输入输出的更多相关文章
- 让我们写一个 Win32 文本编辑器吧 - 2. 计划和显示
让我们写一个 Win32 文本编辑器吧 - 2. 计划和显示 如果你已经阅读了简介,相信你已经对我们接下来要做的事情有所了解. 本文,将会把简介中基础程序修改为一个窗体应用程序.并对编辑器接下来的编辑 ...
- 学习Golang语言(6):类型--切片
学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...
- Stealth视频教程学习笔记(第二章)
Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...
- vi文本编辑器的学习
vi文本编辑器的启动与退出 启动:快捷键Ctrl+Alt+t进入终端, 在系统提示符($或#)的提示下,输入vi <文件名称>,可以自动载入你要编辑的文件或者新建一个文件. 退出:在指令模 ...
- [前端随笔][JavaScript] 制作一个富文本编辑器
写在前面 现在网上有很多现成的富文本编辑器,比如百度家的UEditor,kindeditor,niceditor等等,功能特别的多,API也很多,要去熟悉他的规则也很麻烦,所以想自己了解一下原理,做一 ...
- iView + vue-quill-editor 实现一个富文本编辑器(包含图片,视频上传)
1. 引入插件(注意IE10以下不支持) npm install vue-quill-editor --savenpm install quill --save (Vue-Quill-Editor需要 ...
- 富文本编辑器第一次正常显示,第二次渲染失败 -----在使用laravel-admin 时
第二次显示 解决方法: 在每次获取富文本编辑器实例的时候,先删除一下,避免之前已经实例化造成的渲染失败
- 《Mysql 公司职员学习篇》 第二章 小A的惊喜
第二章 小A的惊喜 ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...
- 【学习笔记】第二章 python安全编程基础---正则表达式
一.python正则表达式 定义:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式相匹配: 1.1RE模块:是python语言拥有全部的正则表达式功能的一个正则模块: 常见 ...
随机推荐
- es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
#创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...
- kafka事务流程
流程 kafka事务使用的5个API // 1. 初始化事务 void initTransactions(); // 2. 开启事务 void beginTransaction() throws Pr ...
- 开启IPV6网络
1.路由器开启IPV6支持 2.路由器关闭IPV6 DHCP服务 3.若外网无法访问则关闭路由器防火墙 或关闭系统防火墙 4.tomcat需设置地址为0.0.0.0
- 2023/3/21 组会:ChatGPT 对数据增强的影响及 ChatGPT 的鲁棒性,Dense 和 Document 检索方法
前两个也许跟上了,后两个完全没跟上,以后再详细读读吧qwq 反正组会跟不上才是正常现象. AugGPT: Leveraging ChatGPT for Text Data Augmentation 摘 ...
- 我又学会了使用Range实现网络文件下载的断点续传
目录 前言 1.Range请求头 1.1.概述 1.2.使用限制 1.3.范围请求 1.4.预防资源变更 2.断点续传下载实现 2.1.流程设计 2.2.代码实现 2.3.运行结果 3.RandomA ...
- python提取特定格式的数据
Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点.该脚本用于从多个 Excel 文件中提 ...
- python重拾第七天-面向对象进阶
本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...
- 基于 Linux 2.6的 硬中断 / 软中断的原理以及实现
Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器. 如果中断的线是激活的,中断控制 ...
- 【WPF】根据选项值显示不同的编辑控件(使用DataTemplateSelector)
接了一个小杂毛项目,大概情形是这样的:ZWT先生开的店是卖拆片机的,Z先生不仅卖机器,还贴心地提供一项服务:可以根据顾客需要修改两个电机的转向和转速(机器厂家有给SDK的,但Z自己不会写程序).厂家有 ...
- 【论文阅读】IROS2017: Voxblox & RAL2019: Voxblox++
IROS2017: Voxblox & RAL2019: Voxblox++ Status: Finished Type: RAL Year: 2019 组织/Sensor: ETH-ASL ...