news 2026/9/15 15:06:10

NotepadNext 如何按文档步骤升级 thirdparty 中的 Scintilla 依赖

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NotepadNext 如何按文档步骤升级 thirdparty 中的 Scintilla 依赖

NotepadNext 如何按文档步骤升级 thirdparty 中的 Scintilla 依赖

【免费下载链接】NotepadNextA cross-platform, reimplementation of Notepad++项目地址: https://gitcode.com/GitHub_Trending/no/NotepadNext

NotepadNext 把 Scintilla 以源码形式内嵌在thirdparty/scintilla目录中随项目一起构建。当需要使用新版 Scintilla(例如获取修复或新特性)时,不能只替换代码:项目里还依赖 Scintilla 的 Qt 封装层ScintillaEdit,而该封装层的ScintillaEdit.cpp/ScintillaEdit.h是由脚本从 Scintilla 的接口定义文件生成的。仓库中的 doc/Update Scintilla.md 给出了升级这套内嵌 Scintilla 的完整 4 步流程。这篇文章按该文档的操作路径展开,说明每一步做什么、影响什么,以及升级后如何按 doc/Building.md 的构建流程验证。

适用前提:已能按 doc/Building.md 完成 NotepadNext 的构建,即系统装有 CMake、兼容的 C++ 编译器、Qt 库(文档给出 Windows 下 Visual Studio 2022 + Qt >= 6.5 的组合,Linux 下用 apt 安装的 Qt6 开发包);此外第 3 步需要 Python(WidgetGen.py脚本文件头声明为python3)。

升级前需要了解的依赖关系

先确认当前仓库对 Scintilla 的依赖方式,这决定了为什么升级后必须重新生成 Qt 封装:

  • 根 CMakeLists.txt 通过add_subdirectory(thirdparty)引入第三方库,thirdparty/CMakeLists.txt 再执行add_subdirectory(scintilla),同时还有target_link_libraries(lexilla PRIVATE scintilla),即 Lexilla 语法分析库也链接 Scintilla 静态库。
  • thirdparty/scintilla/CMakeLists.txt 把 Scintilla 核心源文件(src/*.cxx)和 Qt 封装源文件(qt/ScintillaEdit/ScintillaEdit.cppqt/ScintillaEdit/ScintillaDocument.cppqt/ScintillaEditBase/下的三个文件)一起编译成静态库scintilla,并链接Qt6::CoreQt6::WidgetsQt6::Core5Compat
  • 应用代码直接包含生成的头文件,例如 src/ScintillaNext.h 和 src/NppImporter.h 都有#include "ScintillaEdit.h"

也就是说:替换 Scintilla 源码后,include/Scintilla.iface接口文件会变化,ScintillaEdit封装必须按新接口重新生成,否则应用层包含的 API 与底层不匹配。

当前仓库内嵌的 Scintilla 版本可以从 thirdparty/scintilla/version.txt 查看,仓库当前值为566553,可用于升级前做基线记录。

升级步骤

以下步骤逐条对应 doc/Update Scintilla.md。文档中路径使用 Windows 风格反斜杠,Linux/macOS 上按相同目录结构书写即可。

1. 清空 thirdparty/scintilla(保留 CMakeLists.txt)

文档第 1 步:删除thirdparty\scintilla中的所有文件,只保留CMakeLists.txt

这是一个破坏性操作:执行后该目录下的 Scintilla 源码、Qt 封装、脚本全部被移除,只留下项目自建的 thirdparty/scintilla/CMakeLists.txt。建议先把当前仓库状态提交到 git 或自行备份,避免旧版本代码无法找回。

2. 拷贝新版 Scintilla 源码

文档第 2 步:将新版本的 Scintilla 发布版源码拷贝到thirdparty\scintilla

结合第 3 步脚本的实际依赖(见下文),拷贝进去的必须是完整的 Scintilla 发布源码,至少包含:

  • include/Scintilla.iface——WidgetGen.py直接读取../../include/Scintilla.iface作为生成输入;
  • scripts/目录——WidgetGen.py会把该目录加入sys.pathimport Face(WidgetGen.py 开头即有scintillaScriptsDirectory = os.path.join(scintillaDirectory, "scripts"))。

拷贝完成后目录中应同时存在新版 Scintilla 的文件和第 1 步保留的CMakeLists.txt

3. 运行 WidgetGen.py 重新生成 Qt 封装

文档第 3 步:进入thirdparty\scintilla\qt\ScintillaEdit\目录,运行python WidgetGen.py

cd thirdparty/scintilla/qt/ScintillaEdit python3 WidgetGen.py

python3说明:文档命令写作python,脚本文件头声明为#!/usr/bin/env python3,Linux/macOS 上请使用python3

这一步的作用可以从 WidgetGen.py 源码确认:它解析../../include/Scintilla.iface,用同目录下的ScintillaEdit.cpp.templateScintillaEdit.h.template重新生成ScintillaEdit.cppScintillaEdit.h,覆盖旧文件。跳过这一步的后果是封装层仍对应旧版 Scintilla 接口,与第 2 步拷入的新版源码不一致,后续构建会失败或行为错乱。

4. 按需调整 thirdparty/scintilla/CMakeLists.txt

文档第 4 步:Update thirdparty\scintilla\CMakeLists.txt as needed(视需要更新)。

该文件的现状(见 thirdparty/scintilla/CMakeLists.txt):SCINTILLA_SOURCES变量显式列出了全部 Scintilla 核心源文件(src/下约 40 个.cxx)和 Qt 封装源文件。新版 Scintilla 如果增删了src/下的源文件,这份清单需要同步修改,否则会出现缺文件(链接错误)或引用不存在的文件(CMake 配置错误)。文档没有给出更细的判断标准,"as needed" 指的是按新版源码树的实际文件布局核对这份清单。

升级后的验证方式

文档本身没有给出专门的升级验证命令,可用的验证路径就是 doc/Building.md 中描述的构建流程——升级是否成功,以项目能否按常规流程重新构建并运行为准。

Windows(文档给出的是 Visual Studio 2022 + Qt Creator 流程):

  1. 打开 Qt Creator,打开根目录CMakeLists.txt
  2. 配置为Desktop Qt 6.5 MSVC2019 64bit(或已安装的 Qt 版本);
  3. Ctrl+R,Qt Creator 构建并运行项目。

Linux(Ubuntu/Debian 流程,构建命令摘自 doc/Building.md):

cmake -S . -B build \ -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DAPP_DISTRIBUTION=$DISTRIBUTION cmake --build build --target appimage --parallel

其中DISTRIBUTION=AppImage,Qt6 等依赖包的 apt 安装命令见 Building.md 的 Linux 小节(该 apt 命令使用sudo安装系统包,会修改系统环境,仅在尚未装好构建依赖时执行)。

如果第 3 步生成的ScintillaEdit封装与新版 Scintilla 接口不匹配,应用层src/ScintillaNext.hsrc/NppImporter.h等包含ScintillaEdit.h的模块会最先在构建中暴露错误,可以从这些报错反向核对生成是否成功、第 4 步的 CMakeLists 清单是否漏改。

限制说明

  • doc/Update Scintilla.md 只给出 4 个步骤,没有指定从何处获取 Scintilla 发布版,也没有说明新旧版本之间的 API 兼容范围;第 4 步的"as needed"同样没有进一步指引。
  • 构建侧的依赖要求以 doc/Building.md 为准:CMake、C++ 编译器、Qt 库(文档示例为 Qt >= 6.5,Windows 下推荐 6.5);macOS 构建流程在文档中标注为 TODO,升级后在 macOS 上的验证方式文档未提供。

【免费下载链接】NotepadNextA cross-platform, reimplementation of Notepad++项目地址: https://gitcode.com/GitHub_Trending/no/NotepadNext

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!