本章我们来完成文本编辑器的文件打开和查看功能,最后成品如上图。我们将分4步,逐渐完成本章所需功能。内容比较多,会分为两个部分,第一部分主要关注于“View视图”和“buffer及文本读取”。

如上图最终效果所示,我们希望在终端的最下方增加一个状态栏,能够展示当前被打开的文件和当前的光标位置。

同时我们打算对整个终端视图做一些划分和重构。

首先先介绍一下编辑器各个组件的定位:

  • 编辑器editor:此组件主要在不同的用户界面组件(当前仅View)之间进行协调。
  • 视图View:此组件接收来自编辑器的每个与文本相关的事件,例如字符的按键输入、换行等。视图使用此信息来进行渲染,并将文本修改事件转化并传递给缓冲区buffer
  • 缓冲区buffer(一会儿会介绍到):此组件将保存我们的文本。本项目我们只会从处理ascii码的字符,不会针对全角字符、emoji符号进行处理 ,所以对这类特殊字符的展示和编辑可能会有异常。



    具体来说,红框内部分是编辑器的主要交互部分,我们把它用一个名为view的结构体来表示;下方橙黄色框内的部分我们把它用status_bar的结构体来表示,它会显示编辑器的一些状态信息,如当前打开的文件名和当前光标在第几行第几列。

View结构

首先我们来重构项目部分代码,来把一些现有功能放入view结构体以及它的方法中,因此我们的editor结构体应该持有一个View

type editor struct {
view *view.View needQuit bool
}

而对于View来说,因为光标只能在View内移动,所以指示光标位置的TextLocXTextLocY应当被移动到View结构的成员中。

type View struct {
TextLocX int
TextLocY int
}

其余和View相关的函数页应被重构为View的方法,包括

  • CursorPos
  • Render
  • MoveCursor

作业1

按“View结构”的要求,重构代码。

Code Review 我的实现

简单的Buffer

缓冲区是一种常见的结构,它保存了文本编辑器修改和显示文本文件所需的一切。视图与缓冲区交互以在屏幕上呈现文本。在许多文本编辑器中,您可以轻松地从一个缓冲区切换到下一个缓冲区,从而允许您并行打开多个文件。

缓冲区的实现细节因文本编辑器而异。例如,Nano 使用一种简单直接的缓冲区结构:保存文件时,缓冲区的内容(不包括语法高亮显示的颜色等数据)会保存到磁盘。而Vim 具有复杂的内部结构,即使在处理大型文件时也能高效地处理操作,并且包括一个单独的屏幕缓冲区,用于表示当前屏幕上可见的内容。这些设计选择反映了每个编辑器的愿景:Nano 旨在成为一个小型、轻量级的编辑器,适用于快速更新配置文件。而 Vim 则被设计为一个功能齐全、功能丰富的文本编辑器,非常适合处理冗长的文件。

作业2 简单的buffer

  • 创建一个名为 Buffer 的新结构体,其中包含一个 string切片
  • 更改View结构以容纳一个Buffer
  • buffer提供load_file方法:该方法读取文本,并将文本内容存到buffer中,一行文本对应buffer中的一个string元素
    • 你可以使用bufio.NewScannerscan方法来逐行读取文本
    • 逐行在终端上渲染Buffer中的每个string元素。对于屏幕上的每个空行,仍然渲染一个 ~ 

      Code Review 我的实现

实现一个终端文本编辑器来学习golang语言:第三章文本查看器part1的更多相关文章

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

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

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第三章:变换 学习目标 理解如何用矩阵表示线性变换和仿射变换: 学习在 ...

  3. 在某网站的登录页面登录时如果选择“记住用户名”,登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页面中存在一个超链接,单击超链接可以链接到第三个页面查看信息。若选择“

    Response实现登录并记录用户名和密码信息 在某网站的登录页面登录时如果选择"记住用户名",登录成功后会跳转到一个中间层(页面代码将登录的用户名和密码存在cookie),中间页 ...

  4. vi文本编辑器的学习

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

  5. 《Mysql 公司职员学习篇》 第三章 小A的疑问

    第三章 小A的疑问  ---- 数据类型和自增列 小A拿着鸡腿,回到了房间里面,咬了一嘴油,说:"我有2个疑问,在Excell里面,像列PetAge(宠物年龄)这样的数字,我一般会设置成数值 ...

  6. JavaScript DOM编程艺术-学习笔记(第三章、第四章)

    第三章: 1.js的对象分为三种:①用户自定义对象 ② 内建对象(js提供的对象) ③宿主对象(js寄宿的环境-浏览器,提供的对象) 2.文档是由节点组成的集合,即dom树,html元素是根元素,是唯 ...

  7. 【WPF学习】第二十二章 文本控件

    WPF提供了三个用于输入文本的控件:TextBox.RichTextBox和PasswordBox.PasswordBox控件直接继承自Control类.TextBox和RichTextBox控件间接 ...

  8. 【学习笔记】第三章 python3核心技术与实践--Jupyter Notebook

    可能你已经知道,Python 在 14 年后的“崛起”,得益于机器学习和数学统计应用的兴起.那为什么 Python 如此适合数学统计和机器学习呢?作为“老司机”的我可以肯定地告诉你,Jupyter N ...

  9. asp.net mvc 4 高级编程学习笔记:第三章 视图(1)

    1.基础规则 视图的职责是向用户提供用户界面. 视图位于View目录下:有普通的需要控制器渲染的视图,有局部视图,有布局视图等各种视图. 2.视图渲染 控制器默认情况下渲染与控制器同名的目录内的与Ac ...

  10. 【菜鸟学习Linux】-第三章- Linux环境搭建-使用VMware9安装Ubuntu 12.04系统

    上一步,我们安装了VMware9虚拟机,现在我们就是用它来安装Ubuntu12.04系统,至于Ubuntu是什么,我就不废话了,大家google一下,比我讲的清楚,好了,开始干活! Ubuntu官网下 ...

随机推荐

  1. 说一下 JSP 的 4 种作用域?

    page:代表与一个页面相关的对象和属性. request:代表与客户端发出的一个请求相关的对象和属性.一个请求可能跨越多个页面,涉及多个 Web 组件:需要在页面显示的临时数据可以置于此作用域. s ...

  2. word文档生成视频,自动配音、背景音乐、自动字幕,另类创作工具

    简介 不同于别的视频创作工具,这个工具创作视频只需要在word文档中打字,插入图片即可.完事后就能获得一个带有配音.字幕.背景音乐.视频特效滤镜的优美作品. 这种不要门槛,没有技术难度的视频创作工具, ...

  3. navicat 15

    新机经常需要安装navicat每次都要去网上搜很麻烦这次搜到了记录下来以后就不需要重复下载了 有X86和X64两个版本 破解说明在README文档中 下载地址:https://www.aliyundr ...

  4. 01-Linux系统介绍、安装与入门

    关于Linux 背景 最先出现的是Unix操作系统,这种操作系统收费,而且适用于大型机上面. Linus想做一个免费的,传播自由的操作系统.他就仿照Unix的操作,做了一个类Unix系统:Linux内 ...

  5. IP数据报分片问题

    为什么要分片? 很多时候,由于单个数据太大,超过了MTU的限定值,就要对数据包进行分组,即切割并分别发送. 我们要解决以下几个问题: 1.顺序问题.接收方可以按照原来的顺序重组这些分片,并能知道这些分 ...

  6. 实验6.交换机MAC地址表简单实验

    # 实验6.交换机Mac地址表 本实验用于验证和测试交换机的Mac地址表的特性. 实验组 测试 测试在PC1没有pingPC2时,此时mac表为空 当PC1ping一个其他的ip而不是PC2时,无论是 ...

  7. 题解:洛谷 P1165 日志分析

    标签:栈,模拟 题意 对于一个栈,给定三种操作: 0 x,将 \(x\) 入栈: 1,出栈,栈空时忽略: 2,查询当前栈内最大值. 思路 前两个都是栈的基本操作,关键在于查最大值. 每次询问暴力找肯定 ...

  8. Mac Docker设置国内镜像加速器

    安装docker 点我直达 设置国内加速镜像 { "experimental": false, "features": { "buildkit&quo ...

  9. bean的二次加工-Spring5.X后置处理器BeanPostProcessor

    什么是BeanPostProcessor 是Spring IOC容器给我们提供的一个扩展接口 在调用初始化方法前后对Bean进行额外加工,ApplicationContext会自动扫描实现了BeanP ...

  10. Microsoft Compatibility telemetry占cpu资源高

    1.在Windows10系统卡的时候,打开任务管理器,发现Microsoft Compatibility telemetry占用了大量的系统资源,特别是CPU占用率非常高. 位置:控制面板->管 ...