MiniVim:原来光标后面有这么多事情
发表于|更新于|项目
MiniVim 是基于交大 CS1958-01 课程框架的 C++17 编辑器项目。我的仓库是课程上游的 fork,下面记录一下项目中的模块和编辑流程。
模块
项目分为 Buffer、Window、Command、Renderer、Editor 和 Terminal,分别处理文本、可见区域、命令、渲染、编辑器状态和终端交互。
屏幕上的行号不一定等于文件中的行号;缓冲区修改之后,也需要由渲染部分把变化显示出来。看源码时可以从按键进入 Editor 开始,继续跟到作用于 Buffer 的操作。
模式和边界
Normal、Insert 和命令行模式下,相同按键可能有不同含义。除此之外,行首退格、光标移动到屏幕外等情况也需要明确处理。
课程提供基础要求、进阶说明和终端测试工具。这篇主要记录结构,没有重新运行完整课程测试。
相关链接
相关推荐

2026-10-11
STLite 数据结构作业:把容器接口落到内存与迭代器
STLite 是 ACM 班 CS1951 数据结构课的作业框架,要求实现 vector、deque、priority_queue 和 map,包括迭代器和复杂度要求。我的仓库是课程仓库的 fork,接口和测试来自上游。 deque 的存储 deque/notes.md 里记录了分块数组的设计:通过逻辑下标找到块号和块内偏移,再用这套坐标处理访问、迭代和元素移动。 实现容器的时候,接口写出来只是第一步。插入、删除和扩容之后,元素位置以及迭代器的行为都需要重新考虑。 内存和对象 笔记还讨论了元素没有默认构造函数的情况。块申请原始内存,容器在需要的位置构造元素;删除、清空和析构时则要销毁活对象。异常路径上也需要处理已经构造的部分。 笔记中还留了坐标用错、扩容后容量没有更新、边界遗漏等排查记录。具体实现和课程要求可以在仓库里查看。 相关链接 课程 fork · 课程上游 · deque 实现笔记

2026-10-11
交大 C++ 基础课:从第一个程序开始建立习惯
这里放一下交大 C++ 基础课的课堂代码。目前仓库里的内容主要是 Hello World、课堂练习和输入输出示例,先把这些基础部分记下来。 第一份 main.cpp 使用 std::cout 输出 Hello World,同目录下还有 Makefile。程序虽然很短,但从源文件到可执行程序,仍然要经过编译和运行的过程。后面遇到多文件项目,还需要考虑依赖和链接。 输入输出部分也有一个值得注意的地方:cin.get.cpp 虽然文件名里有 get,实际使用的是 std::cin >> a >> b >> c。两种输入方式对空白字符的处理不同,复习的时候还是得看代码本身。 目前这里是课堂练习的记录,后面有新的代码再继续补充。 相关链接 课堂仓库 · 第一个程序 · 输入输出示例

2026-10-26
YMarkdownG项目说明
YMarkdownG项目说明 类neovide markdown笔记编辑器。 起因 起因其实很简单,就是因为我想写一个博客,用来专门来记录拆分Deepseek Inference Engine记录。 我倒是之前有写一个给博客增加在线写文章的功能,但是显然如果要在一个随时可能会被手关闭的东西里面写进去十多个小时的文档,那我估计到时候哭爹喊娘也不够了。 但是我真的真的不想在vscode里面写,很难看。而且vscode太辣眼睛了。 所以我尝试了一下使用Typora。但是呢发现Typora居然要收费,而且也没那么好用。 说到这里,又想起来之前倒是看到过一个neovide的代码编辑器,里面的光标很灵动,在写字的时候也有不错的光效反馈。所以我就想要不干脆给他做到这里面来算了。 所以就有了YMarkdownG. 一个100MB左右无需安装的markdown编辑器。兼容MacOS,Linux和Windows 后续更新计划。 可能会考虑把文件管理做到更类似Zotero的方式,可以更好的管理markdown文档。 增加一个一键导出PDF功能。 左侧笔记右键菜单还没做。只做了文件夹的。所以有些不方便...

2026-10-11
人工智能基础与实践:从 Python 练习到可演示的作品
这里整理一下交大人工智能入门课程的内容。仓库保存了按周组织的实践、期末复习、自测页面和期末项目,从 Python 基础一直涉及神经网络、CNN、目标检测、大语言模型、生成式 AI、Agent 和 AI 伦理。 练习与复习 实践部分有回归、MNIST 和 CNN 相关 Notebook。看实验的时候,除了模型结构,还可以顺着输入、标签、损失函数、训练循环和结果分析,把整个过程走一遍。 Final_term_review/ 按章节整理了概念,Final_exercises/ 里有复习笔记和 HTML 自测页面。复习完一个章节之后可以用问题检查一下自己是否真的记住了。 期末项目 期末项目《别点那个链接!》是一个校园反诈互动网页,包括三关剧情、风险线索复盘、AI 问答和报告导出。项目有静态演示模式,也可以通过本地 Flask 后端连接模型接口。 项目的具体介绍放在另一篇文章,课程代码和复习资料见下面的仓库。 相关链接 课程仓库 · 期末复习笔记 · 期末项目

2026-10-11
ACMOJ 作业整理:接口约束与对象生命周期
这篇记录一下 ACMOJ 上的 C++ 作业。仓库按照 Homework 和题号保存代码,这里挑两道比较有意思的题。 逻辑构造 Homework1/2354/ans.hpp 里面先定义了一个函数:只有两个输入都为真时才返回假。再利用这个函数组合出逻辑与和逻辑非。 题目对可用操作有限制,所以不能只看最后的结果。需要想清楚在给定操作下,怎么把想要的逻辑组合出来。 Defer 与对象生命周期 Homework2/1048/DeferClass.hpp 使用 std::function<void()> 保存动作,在对象析构时从容器尾部逐个取出执行。复制构造和复制赋值被禁用,避免一组动作被复制到另一个对象之后执行两遍。 这里需要注意保存顺序和执行顺序,也需要想清楚对象什么时候离开作用域。作业代码和题目接口可以在下面的仓库里查看。 相关链接 作业仓库 · 逻辑构造 · Defer 实现

2026-10-11
空教室雷达:别再一间一间开盲盒了
之前写过一篇空教室查询器,这里再记一下查询逻辑。 怎么判断有没有课 项目使用 Flask。查询接口接收日期、楼栋和起止节次,遍历楼层和教室的课程安排,排除时间有交集的教室。 把查询节次记作闭区间 [a, b],课程节次记作 [c, d]。两者不重叠的情况是 b < c 或 a > d;除此之外就存在重叠。这样包含、部分交叉和边界相接都可以用同一条规则处理。 课表和现场状态 当天的查询还会尝试补充现场占用信息和部分环境指标。课表反映的是排课安排,现场数据则是某个时刻的观测;没有排课并不一定代表教室里没有人。 学校接口的字段、权限和可用性可能变化,这次没有重新查询接口。使用时还是要以实际情况为准。 相关链接 项目仓库 · 查询代码




