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

首先,我们先来解决第一章遗留的第一个问题:输入数据会被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 我的实现

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

  1. 让我们写一个 Win32 文本编辑器吧 - 2. 计划和显示

    让我们写一个 Win32 文本编辑器吧 - 2. 计划和显示 如果你已经阅读了简介,相信你已经对我们接下来要做的事情有所了解. 本文,将会把简介中基础程序修改为一个窗体应用程序.并对编辑器接下来的编辑 ...

  2. 学习Golang语言(6):类型--切片

    学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...

  3. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  4. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...

  5. vi文本编辑器的学习

    vi文本编辑器的启动与退出 启动:快捷键Ctrl+Alt+t进入终端, 在系统提示符($或#)的提示下,输入vi <文件名称>,可以自动载入你要编辑的文件或者新建一个文件. 退出:在指令模 ...

  6. [前端随笔][JavaScript] 制作一个富文本编辑器

    写在前面 现在网上有很多现成的富文本编辑器,比如百度家的UEditor,kindeditor,niceditor等等,功能特别的多,API也很多,要去熟悉他的规则也很麻烦,所以想自己了解一下原理,做一 ...

  7. iView + vue-quill-editor 实现一个富文本编辑器(包含图片,视频上传)

    1. 引入插件(注意IE10以下不支持) npm install vue-quill-editor --savenpm install quill --save (Vue-Quill-Editor需要 ...

  8. 富文本编辑器第一次正常显示,第二次渲染失败 -----在使用laravel-admin 时

    第二次显示 解决方法: 在每次获取富文本编辑器实例的时候,先删除一下,避免之前已经实例化造成的渲染失败

  9. 《Mysql 公司职员学习篇》 第二章 小A的惊喜

          第二章 小A的惊喜  ---- 认识数据库 吃完饭后,小Y和小A回到了家里,并打开电脑开始学习Mysql. 小Y:"小A,你平时的Excell文件很多的情况下,怎么样存放Exce ...

  10. 【学习笔记】第二章 python安全编程基础---正则表达式

    一.python正则表达式 定义:正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式相匹配: 1.1RE模块:是python语言拥有全部的正则表达式功能的一个正则模块: 常见 ...

随机推荐

  1. es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo

    #创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...

  2. kafka事务流程

    流程 kafka事务使用的5个API // 1. 初始化事务 void initTransactions(); // 2. 开启事务 void beginTransaction() throws Pr ...

  3. 开启IPV6网络

    1.路由器开启IPV6支持 2.路由器关闭IPV6 DHCP服务 3.若外网无法访问则关闭路由器防火墙 或关闭系统防火墙 4.tomcat需设置地址为0.0.0.0

  4. 2023/3/21 组会:ChatGPT 对数据增强的影响及 ChatGPT 的鲁棒性,Dense 和 Document 检索方法

    前两个也许跟上了,后两个完全没跟上,以后再详细读读吧qwq 反正组会跟不上才是正常现象. AugGPT: Leveraging ChatGPT for Text Data Augmentation 摘 ...

  5. 我又学会了使用Range实现网络文件下载的断点续传

    目录 前言 1.Range请求头 1.1.概述 1.2.使用限制 1.3.范围请求 1.4.预防资源变更 2.断点续传下载实现 2.1.流程设计 2.2.代码实现 2.3.运行结果 3.RandomA ...

  6. python提取特定格式的数据

    Excel Grid Data Converter 知识点总结 本文档总结了 ExcelGridConverter.py 脚本所涉及的关键 Python 知识点.该脚本用于从多个 Excel 文件中提 ...

  7. python重拾第七天-面向对象进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  8. 基于 Linux 2.6的 硬中断 / 软中断的原理以及实现

    Author:zhangskd @ csdn blog 概述 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器. 如果中断的线是激活的,中断控制 ...

  9. 【WPF】根据选项值显示不同的编辑控件(使用DataTemplateSelector)

    接了一个小杂毛项目,大概情形是这样的:ZWT先生开的店是卖拆片机的,Z先生不仅卖机器,还贴心地提供一项服务:可以根据顾客需要修改两个电机的转向和转速(机器厂家有给SDK的,但Z自己不会写程序).厂家有 ...

  10. 【论文阅读】IROS2017: Voxblox & RAL2019: Voxblox++

    IROS2017: Voxblox & RAL2019: Voxblox++ Status: Finished Type: RAL Year: 2019 组织/Sensor: ETH-ASL ...