Skip to content

NylteJ/ConsoleNotepad

Repository files navigation

ConsoleNotepad

一个控制台文本编辑器. 使用 C++ 编写, 追求代码可读性、可拓展性, 并尽量使用现代 C++ 特性.

为 BIT 第三届十行代码大赛参赛作品. 95% 以上的代码均为原创, 只有极少数代码来源网络 / 文档 / AI. (此为当时的情况)

比赛结束后仍在继续更新. 目前正在进行大重构, 因此暂时废弃了许多功能. 文档暂未经过完善的更新, 可能有所出入.

功能列表 (兼操作说明)

  1. 所见即所得的插入、删除、选择功能, 均支持鼠标、键盘操作, 且和各大 IDE 的操作逻辑基本保持一致
    1. 鼠标: 直接点击即可移动光标, 拖动即可选择
    2. 键盘:
      1. 使用方向键移动光标, 到达屏幕边缘时会自动滚动屏幕以适配光标
      2. Shift + 方向键进行选择, 具体逻辑和各大 IDE 基本保持一致
      3. 支持 Backspace (退格) 键删除选中内容或光标前一格的字符, 也支持 Delete 键删除光标后一格 (或选中内容) 的字符
      4. 也支持使用 Home / End 键来直接移动到文件头 / 尾
  2. 支持许多以词为单位的操作(使用 ICU 库实现)
    1. 鼠标: 双击可选中当前词
    2. 键盘:
      1. Ctrl + / 方向键即可以词为单位移动光标, 也可搭配 Shift 进行选择
      2. Ctrl + Backspace 可以删除光标前的词
    3. 以词为单位的操作支持多种语言, 对中文也能正常适配 (不过有的词语无法根据语境准确适配)
  3. 支持四向滚动屏幕, 且能自动滚动
    1. 使用鼠标滚轮即可上下滚动页面, 按住 Ctrl 来更精确地调整
    2. 也支持使用鼠标滚轮来左右滚动页面, 按 Ctrl 来精确滚动 (但 Win11 新版终端中不支持)
    3. 使用 Ctrl + {[ / ]} 即可向左 / 右滚动屏幕, 按住 Alt 来更精确地调整 (这里说的 {[]} 指的是键盘上的按键)
    4. 使用键盘移动光标时, 屏幕会自动滚动来使光标始终位于屏幕内, 进行插入 / 删除时也一样
    5. 使用鼠标时也会自动移动, 但没有那么智能 (比如鼠标滑到最右侧时不会自动往右滚屏, 往上 / 往下时同理)
    6. 使用 Ctrl + / 方向键也可以滚动屏幕, 一次一行
    7. 也支持使用 PageUp / PageDown 键来滚动页面, 一次一屏 (少一行, 也就是上一屏的最后一行 / 第一行会保留)
  4. 支持复制 / 粘贴 (使用 Win11 的新终端时粘贴会被终端接管, 但仍能正常发挥作用, 只是速度慢一点)
    • 使用 Ctrl + C / V 即可
    • 在 Win11 终端中可以使用 Ctrl + (任意一个其它按键) + V 来绕过终端自带的粘贴功能, 当然不绕过也行
  5. 针对不同大小的窗口能自动适配, 即使在使用过程中拉动窗口大小也能即时适配
    • 使用老式终端时可能需要拉动左右边框才会自动适配, 单拉上下边框没用
    • 大部分控制台窗口没有动态适配 (即当窗口打开后, 拉动终端窗口大小, 控制台窗口不会自动改变大小, 但会在控制台无法容纳自身时自动关闭)
      • 但是有静态适配, 根据不同的终端大小自动调整控制台窗口大小, 并在空间不足以打开时弹出提示
  6. 支持中文输入, 也支持中英文混杂排版, 加上制表符 (Tab) 也完全没问题
  7. 双击 Esc 即可退出 (按一次 Esc 时会有提示) , 非常符合直觉, 哪怕是电脑小白应该也能成功退出
    • 在有弹出窗口时按第一次 Esc 只会关闭当前窗口, 但只要一直按 Esc 就能退出, 而且已经按过一次 Esc 时也能强制退出, 所以电脑小白应该也没问题......吧
  8. Ctrl + S 可以保存
  9. 支持打开已经存在的文件, 使用 Ctrl + O 即可
  10. 支持新建文件, 使用 Ctrl + N 即可. 具体逻辑基本同主流编辑器一致, 在新建时无需给文件起名、选择路径等, 直到保存时才需要指定保存路径
  11. 支持另存为, 使用 Ctrl + Shift + S 即可. 当原文件无法继续写入时也会自动触发
    • 支持覆盖保存, 此时会弹出控制台窗口询问是否覆盖
  12. 打开 / 另存为都有对应的控制台内窗口, 并有对应提示 (失败了也有对应的提示) , 新窗口也能部分地动态适配控制台大小
    • 文件路径的输入有防呆设计, 可以正常识别多种输入方式, 同时支持按 Tab 自动补全
      • 按 Tab 可以补全未写完的路径, 在当前路径有效时会逐次循环遍历当前目录下的其它文件 / 目录, 在目录名后加 \ 后再按 Tab 则会遍历子目录
      • 也支持带点的路径, 比如 .\testText.txt..\..\testText.txt, 不加前缀默认当前目录, 补全时会补上前缀
      • 总的来说逻辑和一般终端的类似, 试一试就基本能知道
  13. 支持撤销 / 重做, 按 Ctrl + Z / Y 即可 (任意文本输入框内都支持) , 最高支持步数、操作融合上限及策略均可配置
  14. 当前文件未保存时就试图打开 / 新建新文件 / 退出时, 会用一个控制台窗口提示是否先保存
    • 弹出窗口也支持用鼠标进行选择!
  15. 支持查找 / 替换, 使用 Ctrl + F / H 即可, 查找 / 替换时, 使用方向键在结果中切换. 替换时, 按回车替换当前项目, Shift + 回车 替换全部
    • 替换支持撤回, 虽然只能挨个撤回
    • 查找 / 替换均支持自主选择是否区分大小写以及全字匹配, 只需在窗口中按 Tab 切换到对应选项卡, 然后使用方向键 (左 / 右) 切换即可 (也支持鼠标)
    • 查找 / 替换均支持正则表达式
      • 比如可以尝试打开本项目中的 Editor.ixx, 然后查找 (wstring)(_view)?, 替换为 $2 (记得打开正则匹配), 即可将 wstring 删除, 并将 wstring_view 替换为 _view
  16. 支持不同编码类型, 并会在编码类型错误时给出提示
    • 目前支持 UTF-8 和 GB 2312
    • 也可以强行用错误的编码方式打开, 但会有很多 bug (最明显的就是字符宽度错误以及连带的光标、制表符错误) , 而且这些 bug 不在修复范围内
    • 也支持自动识别编码方式
  17. 支持自动保存, 会自动保存至另一个临时文件 (后缀名、默认名字均可配置), 且会在恰当的时机删除该临时文件
    • 默认 3 分钟保存一次 (可配置)
  18. 能同时兼容新终端与老终端
    • Win11 下 Win + R 输入 conhost 即可调出老终端, 用管理员模式运行时貌似也会默认使用老终端
    • 加上没有使用一些新特性, 理论上在老版本 Windows 下也可以正常使用, 但未经测试
  19. 支持通过命令行调用, 此时使用命令行参数可直接以指定编码打开文件
    1. "-o" / "--open" 表示打开, 后接要打开的文件路径
    2. "-e" / "--encoding" 表示编码, 后接编码名称
      • 有防呆设计, 比如 "utf-8", "UTF-8", "UTF 8", "utf8" 都能定位到 UTF-8
    3. "-h" / "--help" / "/?" 可以输出帮助, 会覆盖其它一切参数
    4. 只需要指定打开文件路径时, 可以直接作为参数附加, 无需带 "-o" / "--open"
    5. 示例 (程序名字取 ConsoleNotepad) :
      1. ConsoleNotepad 1.txt
      2. ConsoleNotepad -o 1.txt -e UTF-8
      3. ConsoleNotepad --encoding "gb 2312" -o 1.txt
      4. ConsoleNotepad /?
  20. 有简单友好地图形化设置界面, 按 Ctrl + P 即可打开.
    • 该界面完全支持鼠标操作. 可以直接点击来切换设置项, 也可以用滚轮上下滚动, 甚至可以直接通过点击左右两侧的箭头来切换选项 (其它地方其实也可以, 比如查找 / 替换里的就可以)
    • 设置内容会保存到当前目录下
  21. 有历史记录窗口,按 Ctrl + L 即可打开,其中记录了所有还能撤销 / 重做的操作,可以直观、简单地撤销 / 重做
    • 该窗口也支持鼠标操作
  22. 有行号显示, 支持自定义行号宽度 (设置为 0 即可关闭)
    • 行号是彩色的
  23. 性能较为优越 (尽管优化空间还很大)
    • 实测, 在我的电脑上, 打开一个 1GB, 1280 万行的文件大约只需要 1 秒 (Release 构建), VS Code 大概需要 8 秒, VS 需要 15 秒
    • 并且此时各项操作仍能较为顺利地进行 (滚动 / 插入 / 删除 / 历史记录等都可以)

编译环境搭建

IDE: Visual Studio 2022 17.13.5 x64
平台工具集: Visual Studio 2022 (v143)
C++ 语言标准: 最新 ( /std:c++latest ), 并且勾选 “生成 ISO C++23 标准库模块”
操作系统: Windows 11 22H2 22621.3737

(理论上从 GitHub clone 下来后直接拿对应版本的 VS 编译就能跑, 不用改设置)

问题清单

基本按时间排序, 越靠上的越古老

(加了勾选框却完全不勾.jpg)

  • 调整窗口大小的过程中编辑器会鬼畜 (特别是快速拉动时) , 不过这个不涉及核心所以不急着修 (谁没事干天天拉编辑器窗口大小玩)

更新计划

理论上会按照顺序更新, 但实际上很可能随缘更 ()

  1. 优化查找 / 替换, 使其能只使用 \n 匹配 \r
  2. 行尾处理, 能选择插入 CR / LF / CRLF, 以及自动统一化 (单纯阅读的话已经实现了, 但插入还是默认 \n)
  3. 编码处理, 添加以其它编码打开 / 保存的功能 (重构后的编码选择功能实际上被 ICU 架空了)
  4. 增加更多的高亮提示等 (比如查找 / 替换时高亮所有选择结果) , 这一条涉及的底层比较多所以放后面了
  5. 添加十六进制查看 / 编辑功能
  6. 接入之前自己开发的一个语法高亮

About

一个简单的控制台文本编辑器,用于参加第三届十行代码挑战赛。

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages