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

首先,我们先来解决第一章遗留的第一个问题:输入数据会被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. C#.NET WINFORM 缓存 System.Runtime.Caching MemoryCache

    C#.NET WINFORM 缓存 System.Runtime.Caching MemoryCache 工具类: using System; using System.Runtime.Caching ...

  2. 网络问题排查必备利器:Pingmesh

    背景 当今的数字化世界离不开无处不在的网络连接.无论是日常生活中的社交媒体.电子商务,还是企业级应用程序和云服务,我们对网络的依赖程度越来越高.然而,网络的可靠性和性能往往是一个复杂的问题,尤其是在具 ...

  3. 判断日期是否为周六周日,BigDecimal比较大小

    判断日期是否为周六周日,BigDecimal比较大小 package com.example.core.mydemo.date; import java.math.BigDecimal; import ...

  4. 向web服务器下载文件

    web服务器向客户端发送文件 Web服务器读取一个文件的二进制数据,把这组二进制数据发送个客户端,服务器发送给客户端的HTML文档的本质也是二进制.客户端使用以下代码读文件 response = ur ...

  5. WPF/C#:显示分组数据的两种方式

    前言 本文介绍自己在遇到WPF对数据进行分组显示的需求时,可以选择的两种方案.一种方案基于ICollectionView,另一种方案基于IGrouping. 基于ICollectionView实现 相 ...

  6. 新手指引:前后端分离的springboot + mysql + vue实战案例

    案例说明: 使用springboot + mysql + vue实现前后端分离的用户查询功能. 1.mysql:创建test数据库 -> 创建user数据表 -> 创建模拟数据: 2.sp ...

  7. Linux驱动:输入子系统(input-subsystem) 分析

    Linux驱动:输入子系统 分析 参考: https://www.cnblogs.com/lifexy/p/7542989.html https://blog.csdn.net/myselfzhang ...

  8. FSCTF 2023(公开赛道)WP

    FSCTF 2023 ID:Mar10 Rank:6 总结:下次看到不正常报错一定重新安装一遍工具~~ web 源码!启动! 就在源码注释里 <!-- 师傅们,欢迎来到CTF的世界~ NSSCT ...

  9. Spring的@Configuration和@Bean注解定义第三方bean

    @Configuration和@Bean注解的使用 @Configuration标注在类上,相当于把该类作为spring的xml配置文件中<beans>,作用为:配置spring容器(应用 ...

  10. Java-继承Thread的方式和实现Runnable接口多线程

    继承Thread的方式实现多线程 public class TestThread extends Thread{ @Override public void run() { System.out.pr ...