LumNote-重新定义单机Markdown编辑器 们的设计哲学性能优先写作时最怕卡顿灵感稍纵即逝。我们确保每一次输入都流畅自然。深度集成写作不只是打字还包括版本管理、格式转换、协作分享等。我们把整个写作流程都考虑进去了。跨平台一致无论你在Windows、macOS还是Linux上体验都是一致的。你的工作流不应该被操作系统限制。可扩展性每个人的写作习惯不同我们提供了足够的定制空间。为什么选择自研渲染引擎这是一个我们思考了很久的问题。市面上有很多现成的方案比如基于WebView的编辑器或者使用第三方渲染库。但我们都觉得不够理想。基于WebView的方案性能开销大内存占用高第三方渲染库虽然省事但灵活性受限难以深度定制。于是我们选择了最难但最有价值的路自研渲染引擎。这个决定意味着更多的开发工作量但也意味着我们能够完全掌控渲染流程实现极致的性能优化深度集成Git工作流让版本控制成为写作体验的一部分确保跨平台渲染效果完全一致支持AOT编译生成真正的原生应用启动速度飞快现在回想起来这个决定虽然艰难但非常值得。因为正是这个自研引擎让LumNote有了独特的灵魂。核心功能让写作成为一种享受在LumNote的开发过程中我们一直在思考一个问题什么样的功能才能真正帮助写作者我们不是简单地堆砌功能而是从真实的写作场景出发设计每一个细节。下面这些功能都是我们在实际写作中痛出来的需求。1. 实时预览灵感不等待不知道你有没有这样的经历在写技术文档时需要频繁地在编辑器和预览之间切换打断思路。我们受够了这种体验。正因为如此LumNote的实时预览成了我们最重视的功能之一。我们实现了50ms防抖的实时渲染——你几乎感觉不到延迟但又不会因为频繁渲染而卡顿。这背后的技术细节其实挺有意思的。我们尝试过各种方案最终选择了防抖机制。简单来说就是当你快速输入时系统会稍微等一等等你的输入稳定下来再渲染。这样既保证了实时性又避免了性能浪费。2. 可选中预览打破只能看不能选的魔咒传统的Markdown预览有个很大的问题你只能看不能选。想从预览里复制一段代码对不起不行。我们觉得这太不合理了。预览不就是给人看的吗为什么不能选中复制呢于是我们花了很大功夫实现了可选中预览。现在你不仅可以在右侧看到渲染效果还可以直接选中文本复制。这个看似简单的功能背后其实有很多技术挑战比如如何保持文本布局的同时支持选中如何处理复杂的嵌套结构等。但当我们看到用户能够流畅地从预览中复制代码时觉得所有的努力都值得了。3. 完整的GFM支持不只是基础功能GitHub风格的MarkdownGFM现在几乎是技术写作的标准了。但很多编辑器对GFM的支持都不够完整。在LumNote里我们确保表格不仅支持还能正确处理列对齐任务列表可以交互式勾选代码块有完整的语法高亮和行号数学公式渲染清晰美观引用块支持多级嵌套我们相信细节决定体验。一个表格的边框颜色、代码块的行号对齐、数学公式的渲染质量——这些看似微小的细节加起来就是完全不同的使用体验。4. 内置Git工作流写作与版本控制的完美融合这是LumNote最让我们自豪的功能之一。我们观察到很多技术写作者其实也是开发者他们习惯用Git管理代码但文档管理却要切换到另一个工具。这种割裂的体验很不友好。于是我们想为什么不能把Git直接集成到编辑器里呢现在在LumNote里你可以直接看到每个文件的Git状态已修改、新增、删除可以查看文件差异了解自己改了哪里可以直接提交更改不需要切换到命令行或其他工具可以管理分支切换不同的写作版本这不仅仅是功能的叠加而是工作流的重新设计。写作和版本控制不再是两个独立的过程而是一个完整的体验。5. 多格式导出一次写作处处可用写作的最终目的是分享。但不同的场景需要不同的格式技术文档可能需要PDF博客可能需要HTML社交媒体可能需要图片。LumNote支持多种导出格式HTML完整的网页文档保持所有样式PDF高质量的打印格式适合正式文档DOCXMicrosoft Word格式完美支持数学公式和复杂排版PNG清晰的图片格式方便分享长图特别适合移动端阅读特别值得一提的是LumNote对数学符号的支持非常完善。无论是LaTeX公式还是MathJax表达式都能在导出时完美保留这对于技术文档和学术写作来说至关重要。我们甚至考虑到了批量导出的需求。如果你有一个文件夹的文档需要统一转换格式LumNote可以一键完成。这些功能的设计理念很简单让写作者专注于写作其他的事情交给工具。技术背后的思考为什么这样设计在介绍完功能之后我们想和大家聊聊LumNote背后的技术设计。这些技术选择不是随意的而是基于我们对写作工具的理解和长期思考。1. 自研解析器为了极致的性能很多朋友问我们为什么不用现成的Markdown解析库比如CommonMark.NET或者Markdig我们当然考虑过这些方案。它们都很优秀功能也很全面。但我们在测试中发现对于大型文档比如几万行的技术文档这些通用解析库的性能还有优化空间。于是我们决定自研解析器。这个决定让我们能够针对技术写作的特点进行专门优化实现增量解析只解析可见部分更好地控制内存使用我们采用了很多现代C#的特性比如ReadOnlySpanchar来避免不必要的内存分配使用内联方法来减少函数调用开销。这些优化可能用户感觉不到但它们确实让LumNote在处理大文档时更加流畅。2. Skia渲染引擎为了跨平台的一致性跨平台是LumNote的一个重要目标。我们希望无论你在哪个系统上使用体验都是一致的。这听起来简单做起来却很难。不同的操作系统有不同的字体渲染引擎、不同的DPI处理方式、不同的图形API。经过多方比较我们选择了Skia作为渲染后端。Skia是Google开源的2D图形库Chrome、Android、Flutter都在用它。它的优势很明显跨平台表现一致性能优秀功能全面使用Skia意味着我们可以在所有平台上获得相同的渲染效果。你在Windows上看到的表格边框颜色在macOS上看到的代码高亮在Linux上看到的数学公式都是一模一样的。3. Avalonia UI框架为了真正的跨平台体验在UI框架的选择上我们选择了Avalonia。这是一个基于.NET的跨平台UI框架它让我们能够真正的原生体验在每个平台上都使用原生控件而不是模拟高性能渲染充分利用硬件加速现代化的开发体验支持MVVM模式、数据绑定等现代UI开发特性选择Avalonia意味着我们可以在Windows、macOS、Linux上提供一致的体验同时保持每个平台的特色。这也是为什么LumNote在各个系统上都能运行流畅的原因之一。4. 架构设计为了可维护性和可扩展性LumNote的架构是我们花了很长时间设计的。我们采用了清晰的分层架构表现层负责UI展示和用户交互业务层处理核心业务逻辑核心层包含解析器、渲染引擎等基础组件这样的设计有几个好处易于维护各层职责清晰修改一个部分不会影响其他部分易于测试可以单独测试每一层易于扩展未来添加新功能时只需要在相应的层进行修改我们特别注重代码的可读性和可维护性。因为我们知道一个开源项目要长久发展清晰的代码结构是基础。6. 开源组件站在巨人的肩膀上LumNote使用了多个优秀的开源组件我们对此保持完全透明Avalonia跨平台UI框架Skia2D图形渲染引擎MarkdigMarkdown解析部分功能LibGit2SharpGit集成PdfSharpPDF导出DocXWord文档生成我们尊重并感谢所有开源项目的贡献者。在项目仓库中我们提供了完整的开源组件清单和许可证信息确保项目的透明度和合规性。7. AOT友好设计为了更好的用户体验AOTAhead-of-Time编译是.NET的一个很棒的特性。它可以把.NET应用编译成真正的原生可执行文件不需要安装.NET运行时启动速度也更快。但AOT编译对代码有一些要求比如要避免某些反射用法。我们在设计LumNote时就考虑到了这些限制。我们使用Source Generator来生成序列化代码避免运行时反射。我们显式声明了需要保留的类型确保AOT编译后不会丢失功能。这些工作用户可能看不到但它们确实让LumNote的安装包更小启动更快运行更稳定。性能优化看不见的努力看得见的体验性能优化是一个永无止境的过程。在LumNote的开发中我们投入了大量精力来优化性能。这些优化可能用户感觉不到但它们确实让使用体验更加流畅。内存优化让大文档不再卡顿技术文档往往很大有些可能有几万行代码。传统的编辑器在处理这种大文档时往往会卡顿甚至崩溃。我们在LumNote中实现了智能的内存管理使用LRU缓存来管理文档内容实现虚拟化渲染只渲染可见部分使用内存映射文件来处理超大文件这些技术让LumNote能够流畅地处理几十MB甚至上百MB的文档。渲染优化让滚动如丝般顺滑快速滚动时卡顿这是很多编辑器的通病。我们通过多种技术来解决这个问题实现滚动节流避免过度重绘使用双缓冲技术减少闪烁优化布局算法减少计算量现在即使在配置较低的电脑上LumNote的滚动也很流畅。搜索优化让查找更加高效文档搜索是一个高频操作但也是一个性能敏感的操作。我们实现了智能防抖避免频繁搜索结果缓存加速重复搜索增量搜索边输入边显示结果这些优化让搜索变得又快又准。聊了这么多技术细节现在让我们回到最实际的问题如何使用LumNote我们尽量让LumNote的使用变得简单直观但作为一个功能丰富的工具还是有一些值得分享的使用技巧。1. 快速开始5分钟上手我们相信一个好的工具应该开箱即用。LumNote的安装和使用都非常简单对于普通用户直接从GitHub Releases下载对应平台的安装包双击安装就像安装其他软件一样简单打开就能用不需要复杂的配置对于开发者如果你想从源码构建可以通过Git克隆项目仓库使用dotnet构建工具进行编译和运行。我们特别注重第一次使用的体验。当你第一次打开LumNote时会看到一个简洁的欢迎界面上面有快速开始指南常用快捷键提示示例文档我们希望你在5分钟内就能开始写作而不是花半小时研究怎么用。2. 基本使用写作变得如此简单LumNote的界面设计遵循少即是多的原则。核心功能都在最显眼的位置文档管理左侧是文档列表支持搜索和过滤。你可以轻松找到需要的文档。编辑区域中间是编辑区支持语法高亮和智能提示。实时预览右侧是预览区你输入的内容会实时渲染。工具栏顶部是常用操作按钮包括保存、导出、Git操作等。我们设计了直观的操作流程点击文档列表中的文件开始编辑输入内容右侧实时预览使用CtrlS保存或者设置自动保存需要导出时点击导出按钮选择格式整个流程非常自然几乎没有学习成本。3. Git集成像管理代码一样管理文档这是我们最自豪的功能之一。很多用户反馈说这个功能彻底改变了他们的文档工作流。使用场景一个人写作每写一段就保存一次自动记录修改历史可以随时回退到之前的版本不同章节可以用不同的分支管理使用场景二团队协作多人可以同时编辑不同章节通过Git合并解决冲突清晰的版本历史知道谁在什么时候改了哪里使用场景三内容发布主分支存放正式版本开发分支用于草稿和修改发布时合并到主分支生成最终版本这个功能的设计理念是写作应该像软件开发一样严谨但又像写作一样自由。4. 导出功能一次写作处处可用写作的最终目的是分享。但不同的平台有不同的格式要求技术博客需要HTML正式报告需要PDF社交媒体需要图片移动端阅读需要长图LumNote支持所有这些格式而且质量都很高。HTML导出保持所有样式包括代码高亮、数学公式、表格样式等。PDF导出适合打印支持分页、页眉页脚、目录等。DOCX导出Microsoft Word格式完美支持数学公式和复杂排版适合学术论文和正式报告。图片导出高质量PNG适合分享到社交媒体。长图导出特别为移动端优化阅读体验很好。特别值得一提的是LumNote对数学符号的支持非常完善。无论是LaTeX公式还是MathJax表达式都能在导出时完美保留这对于技术文档和学术写作来说至关重要。更棒的是你可以批量导出。如果你有一个系列的文档可以一次性导出成多种格式大大节省时间。更棒的是你可以批量导出。如果你有一个系列的文档可以一次性导出成多种格式大大节省时间。个性化配置打造属于你的写作环境每个人的写作习惯都不同。有人喜欢深色主题在深夜写作时眼睛更舒服有人喜欢浅色主题在白天写作时更清晰。有人需要大字体看得更清楚有人需要紧凑布局一屏看到更多内容。LumNote提供了丰富的配置选项让你可以打造完全个性化的写作环境。1. 主题系统不只是颜色我们的主题系统设计得很灵活。一个主题包括颜色方案背景色、前景色、强调色等字体设置字体家族、字号、行高等布局参数边距、间距、对齐方式等样式细节代码块样式、表格样式、链接样式等我们提供了10种精心设计的预设主题包括GitHub风格熟悉的GitHub配色深色专业适合长时间写作浅色清新适合白天使用护眼模式减少蓝光保护视力高对比度适合视力不佳的用户2. 自定义主题发挥创意如果你对预设主题不满意可以完全自定义。我们的配置界面很直观支持通过JSON格式配置文件来定义主题的颜色方案、字体设置和布局参数。你甚至可以为不同的写作场景设置不同的主题。比如写技术文档时用深色专业写博客文章时用浅色清新晚上写作时用护眼模式3. 快捷键定制符合你的习惯快捷键是提高效率的关键。但每个人的习惯不同有人习惯VS Code的快捷键有人习惯Sublime Text的有人习惯Vim的。LumNote支持完整的快捷键重映射。你可以在设置界面中查看所有可用的快捷键修改现有的快捷键添加快捷键导入/导出快捷键配置我们甚至支持情景快捷键不同的编辑模式下可以使用不同的快捷键。比如普通编辑模式Vim模式Emacs模式4. 工作流配置优化你的写作流程除了外观和快捷键你还可以配置工作流相关的选项自动保存每隔多少秒自动保存只在失去焦点时保存手动保存默认版本控制自动提交间隔提交消息模板分支命名规则导出设置默认导出格式导出质量设置导出目录结构这些配置让你可以完全按照自己的习惯来使用LumNote真正实现人适应工具到工具适应人的转变。开发故事我们遇到的挑战与解决方案在LumNote的开发过程中我们遇到了很多技术挑战。有些挑战我们预料到了有些则完全出乎意料。今天我们想和大家分享这些故事也许对正在开发类似工具的你有帮助。1. 跨平台渲染一场字体和DPI的战争跨平台开发听起来很美一次开发到处运行。但现实往往很骨感。我们曾经天真地以为只要代码写得好就能在所有平台上完美运行。但现实给了我们当头一棒。第一个挑战字体渲染差异我们在Windows上测试时字体渲染很清晰。但到了macOS上同样的字体看起来就不一样了——有的变粗了有的变细了有的间距变了。Linux上又是另一种效果。这种感觉就像你精心调制的咖啡在不同的杯子里喝起来味道都不一样。我们尝试了很多方案使用系统默认字体但不同系统的默认字体不同打包字体文件但字体文件很大而且有版权问题使用字体回退机制效果不理想最终解决方案我们实现了一个智能字体选择系统。它会优先使用用户指定的字体如果该字体不存在使用平台推荐的等宽字体如果还没有使用我们打包的免费开源字体同时我们使用Skia作为渲染后端确保在不同平台上渲染效果一致。这就像给所有平台都穿上了统一的制服无论在哪里看起来都一样精神。第二个挑战DPI缩放现在的显示器DPI千差万别有96DPI的传统显示器有144DPI的2K屏有200DPI的4K屏还有苹果的Retina屏。我们曾经遇到过这样的情况在Windows上字体大小刚刚好到了macBook上就变得太小几乎看不清。我们的解决方案是完全支持系统DPI缩放。LumNote会自动检测系统DPI设置并相应调整所有UI元素的大小。这样无论在什么显示器上文字大小都是合适的。我们相信好的工具应该适应不同的环境而不是让用户去适应工具。2. 大文档性能与内存和CPU的较量技术文档往往很大。我们见过100MB的Markdown文件包含大量代码示例。传统的编辑器打开这种文件要么很慢要么直接崩溃。想象一下你正在写一个大型技术文档每次打开都要等几分钟那种体验有多糟糕。我们的解决方案增量解析我们不是一次性解析整个文档而是只解析可见部分。当用户滚动时再解析新出现的部分。这大大减少了初始加载时间。就像看书一样你不需要一次性读完所有内容而是可以边看边翻。虚拟化渲染我们只渲染屏幕上可见的部分。对于不可见的部分我们只计算布局不实际渲染。这大大减少了GPU负担。想象一下如果每次滚动都要重新渲染整个文档那得多慢啊智能内存管理我们使用LRU缓存来管理文档内容。最近使用的部分留在内存中不常用的部分会被释放。当内存紧张时我们会自动清理缓存。这就像你的大脑一样记住最近看过的内容忘记很久以前的内容。这些优化让LumNote能够流畅处理超大文档。我们测试过500MB的文档LumNote依然能够正常工作虽然加载需要一些时间。我们相信好的工具应该能够处理用户的所有需求而不是让用户去适应工具的局限。3. Git集成实时性与性能的平衡Git集成是LumNote的特色功能但说实话这也是最让我们头疼的功能之一。我们想了很多办法才找到一个平衡点。挑战一实时状态更新我们希望用户在修改文件后能立即在UI上看到Git状态的变化。但频繁执行git status命令会影响性能用户体验会很差——想象一下每敲几个字就要等几秒钟那种感觉太糟糕了。我们的解决方案经过多次尝试我们找到了一个混合方案使用文件系统监视器监听文件变化文件变化后稍微等一等500ms再执行git status避免频繁打扰缓存结果避免重复计算在后台线程执行不阻塞UI挑战二差异对比性能显示文件差异需要比较当前内容和Git中的内容。对于大文件这个操作可能很慢。我们曾经遇到过这样的情况用户打开一个100MB的文件想要查看差异结果等了十几秒——这显然是不可接受的。解决方案只比较可见部分使用增量比较算法缓存比较结果提供进度提示让用户知道正在处理这些优化让Git集成既实时又高效。用户几乎感觉不到性能开销但又能获得完整的Git功能。