首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年08月04日 23:02


本章我们来完成文本编辑器的文件打开和查看功能,最后成品如上图。我们将分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 我的实现
From:https://www.cnblogs.com/Ama2ingYJ/p/18342443
本文地址: http://www.shuzixingkong.net/article/784
0评论
提交 加载更多评论
其他文章 【EF Core】自动生成的字段值
自动生成字段值,咱们首先想到的是主键列(带 IDENTITY 的主键)。EF Core 默认的主键配置也是启用 Identity 自增长的,而且可以自动标识主键。前提是代表主键的实体属性名要符合以下规则: 1、名字叫 ID、id、或 Id,就是不分大小写; 2、名字由实体类名 + Id 构成。比如,
【EF Core】自动生成的字段值 【EF Core】自动生成的字段值
从零体检一个魔塔社区模型(modelscope)最简单demo
从社区拿一个模型,比如以下这个链接 https://www.modelscope.cn/models/iic/cv_mobilenet-v2_bad-image-detecting 它的代码样例如下 from modelscope.pipelines import pipeline from mod
从零体检一个魔塔社区模型(modelscope)最简单demo 从零体检一个魔塔社区模型(modelscope)最简单demo
Vue Vine:带给你全新的 Vue 书写体验!
你好,我是 Kagol,个人公众号:前端开源星球。 上个月和 TinyVue 的小伙伴们一起参加了 VueConf 24 大会,有幸认识沈青川大佬,并了解了他的 Vue Vine 项目,Vue Vine 让你可以在一个文件中通过函数方式定义多个 Vue 组件,同时可以使用所有 Vue 的模板特性。
Vue Vine:带给你全新的 Vue 书写体验! Vue Vine:带给你全新的 Vue 书写体验! Vue Vine:带给你全新的 Vue 书写体验!
英语.Net多语言开发中的问题
问题与现象 多语言开发是一件成本很高的事情。 很多公司会退而求其次选择只开发英文版本的软件分发到不同国家,但这里仍存在不同问题。 我们就遇到了这样的问题,参考下面的代码。 CultureInfo culture;double number =1.5; culture&#
PowerBI_一分钟学会利用ALLEXCPET分组计算(以计算门店开业前3天销售金额为例)
在某些特殊场景,我们往往需要去计算一些特定的组别的聚合数据 今天,就以计算门店开业前3天的销售情况,来学习一下,利用计算列和DAX度量值,两种快捷计算此类问题的方案。 一:XMIND 二:示例数据 2.1 示例数据列说明 为了方便验证和更清晰的检查结果,数据源只用了三列,分别是3个门店,分别为A,B
PowerBI_一分钟学会利用ALLEXCPET分组计算(以计算门店开业前3天销售金额为例) PowerBI_一分钟学会利用ALLEXCPET分组计算(以计算门店开业前3天销售金额为例) PowerBI_一分钟学会利用ALLEXCPET分组计算(以计算门店开业前3天销售金额为例)
golang 指定权限是 0o755 而不是 0755
在Go语言中,当指定文件权限时,使用前缀 0o 来明确表示八进制数是一种推荐的做法。 这是因为在Go语言中,八进制字面量必须以 0o 或 0O 开头,后跟八进制数字(0-7)。 这种语法是从 Go 1.8 开始引入的,目的是为了减少由于 八进制 字面量与零开头的 十进制数 之间的混淆。 在更早的 G
推荐一款.NET开源、功能强大的二维码生成类库
前言 在日常开发需求中,生成二维码以分享文本内容或跳转至指定网站链接等场景是比较常见的。今天大姚给大家分享一款.NET开源(MIT License)、免费、简单易用、功能强大的二维码生成类库:QrCodeGenerator。 项目特点 跨平台兼容性: 支持.NET Standard 2.0
推荐一款.NET开源、功能强大的二维码生成类库 推荐一款.NET开源、功能强大的二维码生成类库 推荐一款.NET开源、功能强大的二维码生成类库
C#.Net筑基-解密委托与事件
委托与事件是C#中历史比较悠久的技术,从C#1.0开始就有了,核心作用就是将方法作为参数(变量)来传递和使用。其中委托是基础,需要熟练掌握,编程中常用的Lambda表达式、Action、Func都是委托,包括事件也是基于委托实现的。
C#.Net筑基-解密委托与事件 C#.Net筑基-解密委托与事件 C#.Net筑基-解密委托与事件