简介面向习惯用 Notepad 编写文档的开发者、运维与测试人员这套 Markdown 支持组件用于补齐编辑器原生缺失的语法高亮与实时预览能力让技术文档、README 与日常笔记在同一窗口内完成编写和校对。压缩包内共 2 个文件体积约 228KB主体为一个 dll 插件核心和一个 xml 用户自定义语言配色配置前者承担 Markdown 的解析与渲染加载后即可从插件菜单调出预览入口后者配合 Zenburn 暗色方案为标题、列表、代码块等元素分配不同颜色减轻长文档的视觉疲劳。目前已有 1839 人学习。对于想轻量上手 Markdown、又不愿额外安装独立编辑器的读者这份组件可直接嵌入既有工作流兼顾编辑效率与阅读体验也便于按个人习惯调整高亮与预览设置。1. Notepad 写 Markdown 的盲区预览缺失带来的返工上周改一份三百行的部署说明表格列宽全靠数竖线图片写成![](img/arch.png)在 Notepad 里看着整整齐齐粘到别处一渲染表格塌成一堆竖杠图全裂了。问题不在手写 Markdown 的水平在于编辑器不给反馈Notepad 本质是文本编辑器Markdown 的排版效果它不知道也不负责显示。装一个预览插件把「写完才知道坏了」提前成「写着就看见坏了」这就是全部价值。我自己常用的是 MarkdownViewer,它能在侧边或独立窗口实时渲染当前文件允许指定自定义 CSS还能把渲染结果导出成 HTML。适合把 Notepad 当主力编辑器、又经常写 README、接口文档、配置说明的人不适合想要所见即所得、拖拽排版的人那类需求该换编辑器不该给 Notepad 加插件。2. 装 MarkdownViewer三条安装路径与目录结构的硬规则2.1 三条路线的取舍高亮、预览、外部渲染在动手之前先把选项摊开。很多人以为 Notepad 装了 Markdown 插件就什么都有了实际上「语法着色」和「渲染预览」是两套独立机制互不替代。方案装什么得到什么代价只做高亮导入 Markdown 的 UDL 词法文件标题、加粗、代码块有颜色看不到任何排版效果MarkdownViewer插件本体DLL实时预览、自定义 CSS、导出 HTML渲染内核受限少数 CSS 不生效外部渲染pandoc 浏览器最接近最终发布效果要切窗口、手动跑命令反馈慢写文档过程中需要的是「扫一眼对不对」不是「出版级还原」。所以预览延迟和面板占位比渲染精度更重要这也是我优先装 MarkdownViewer 而不是每次切浏览器刷新的原因。真要出版级效果第 4 章用 pandoc 做兜底导出两者不冲突。2.2 在线装Plugins Admin 的正确用法Notepad 8.x 自带插件管理入口路径是「插件 → Plugins Admin插件管理」。打开后有个可搜索的列表检索 markdown勾选 MarkdownViewer点 Install编辑器会自动关闭并重启。整个过程不需要手动找文件。几个容易被忽略的点7.5 之前的版本用的是老的 Plugin Manager界面和列表源都不一样网上教程对不上号时先看自己的版本号帮助 → 关于。公司网络或内网环境经常连不上插件列表源表现为列表空白或一直转圈这时候走 2.3 的离线路线别在原地反复点。装完必须让它自己重启一次手动关掉再开有时插件注册表没写完菜单里就是不出现。提示在线安装成功不代表版本匹配装完务必做 2.4 的验证。2.3 离线装plugins 目录结构是硬规则从 Notepad 7.6 开始插件不再允许把 DLL 直接扔进plugins根目录必须是「每个插件一个同名子目录DLL 放在里面」Notepad/ └── plugins/ └── MarkdownViewer/ ├── MarkdownViewer.dll └── (依赖的 dll)放错层级的典型后果是菜单里找不到插件也没有任何报错静悄悄失败。这是新手最容易翻车的地方,血泪经验是——只放了一个 DLL 到根目录然后怀疑插件坏了重装了三次编辑器。下面这段 PowerShell 用来核对安装结果同时暴露目录层级问题# 按实际安装路径改32 位在 64 位系统上一般是 ${env:ProgramFiles(x86)} $npp C:\Program Files\Notepad # 1. 先确认编辑器版本和位数关于对话框里也能看这里拿文件版本做交叉验证 (Get-Item $npp\notepad.exe).VersionInfo | Select-Object FileVersion, ProductVersion # 2. 只列 plugins 下的子目录如果插件 DLL 直接躺在根目录这里看不到它 Get-ChildItem $npp\plugins -Directory | ForEach-Object { Get-ChildItem $_.FullName -Filter *.dll -Recurse | Select-Object {nPlugin;e{$_.Directory.Name}}, Name, {nDllVersion;e{$_.VersionInfo.FileVersion}} }逻辑说明第一条命令读 exe 的版本信息用来对齐插件和编辑器版本第二条只枚举目录是因为 7.6 的加载器只认子目录结构这个写法本身就能验证结构对不对。参数上把$npp改成你的实际路径即可便携版指向解压目录。如果第二条命令的输出里压根没有 MarkdownViewer说明文件位置错了先别怀疑 DLL 损坏。2.4 装完先做三件事验证看菜单「插件」菜单下应该出现 MarkdownViewer 子项包含预览开关。新建test.md,写一个二级标题、一张两列三行的表、一段围栏代码块打开预览看是否渲染出结构。关掉编辑器再开看预览面板位置和自定义 CSS 是否还在以此判断配置有没有落到磁盘。配置文件位置随安装形态变化找不到配置时按这张表定位安装形态配置目录安装版%APPDATA%\Notepad\plugins\config便携版解压目录下.\config或.\plugins\config3. 预览链路拆解解析器、CSS 注入与图片基准路径3.1 从编辑器缓冲区到 HTML 的四步理解这条链路后面所有异常都能自己定位。点击预览时大致发生四件事第一步插件从编辑器取出当前缓冲区内容注意是缓冲区不是磁盘文件所以没保存也能预览这一点比很多人想的方便第二步交给内置的 Markdown 解析器转成 HTML不同版本底层库换过想确认的话去看插件目录里的依赖 DLL 名字看到 Markdig 这类库名就说明走的是对应解析器第三步套一个 HTML 模板把你指定的 CSS 注入进去第四步把结果塞进插件内置的浏览器控件渲染。关键结论在第四步预览用的是嵌入的浏览器控件不是系统浏览器。常见情况是该控件内核偏老对 flex、grid、gap这类较新的 CSS 支持不完整于是出现「预览里排版崩了、导出到网页却正常」的假象。看到这类现象不要回头改 Markdown先判断是内核问题还是写法问题——把可疑样式单独抽一个小 HTML 丢进系统浏览器对比一次就能定论。3.2 自定义 CSS把预览面板调到能看默认样式通常字小、行距紧、表格没有分隔感长时间看很累。插件设置里可以指定一个外部 CSS 文件路径改完重新打开预览面板生效。/* preview.css —— 只做可读性调整不追求好看 */ /* 中文字体优先行高给足长文档才不挤 */ body { font-family: Microsoft YaHei, PingFang SC, system-ui, sans-serif; font-size: 15px; line-height: 1.75; max-width: 900px; /* 面板很宽时限制行宽避免一行横跨整个屏幕 */ padding: 16px 24px; } /* 表格斑马纹 细边框行列多的时候不容易看串行 */ table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #d0d7de; padding: 6px 10px; } tbody tr:nth-child(even) { background: #f6f8fa; } /* 行内代码和代码块分开处理混用会很难看 */ code { background: #f0f2f5; padding: 1px 4px; border-radius: 3px; font-size: 13px; } pre { background: #f6f8fa; padding: 12px; overflow-x: auto; border-radius: 4px; } pre code { background: none; padding: 0; } /* 引用块用左边框比整块底色克制 */ blockquote { margin: 12px 0; padding: 4px 12px; border-left: 3px solid #d0d7de; color: #555; } /* 图片不溢出面板这一条能省掉大量横向滚动 */ img { max-width: 100%; }参数说明max-width控制正文行宽面板宽度变化时它才是决定阅读舒适度的量pre的overflow-x: auto让超长代码行局部滚动而不是撑破布局img的max-width: 100%是必加项否则一张大图能把整个面板横向拉爆。若你的样式被内置样式压住用!important兜底但只对确实不生效的那一条用,全篇铺开以后很难维护。3.3 图片为什么在预览里裂开这是最高频的疑问。原因在于浏览器控件需要知道「相对路径相对于谁」而插件渲染时页面并不真的位于你的 md 文件目录基准路径常常是临时目录或插件目录于是img/arch.png找不到。按这个顺序排查基本一次能定位文件是否已保存到磁盘。新文件没路径相对路径无解先 CtrlS。相对路径写法统一。![](img/a.png)和![](./img/a.png)在不同版本里行为可能不一致建议全篇统一不带./。用绝对路径做对照实验。临时把一张图改成![](file:///D:/doc/img/a.png)能显示说明是路径基准问题不能显示说明是文件本身不存在或格式不支持。路径里有中文和空格时优先重命名目录。编码问题在控件里表现得很玄学能避就避。注意预览显示正常不等于发布后正常图片路径这类问题必须用最终渲染器再验一次。3.4 编码UTF-8 无 BOM 是底线编码问题有两个典型症状。第一个是第一个#标题不渲染反而在正文里显示成一段带点的文字原因是文件存成了 UTF-8 with BOM,解析器把 BOM 当成正文的第一个字符行首不再是#,标题语法就失效了。第二个是中文全变问号或方块那是存成了 ANSI。处理方式很直接在 Notepad 的「编码」菜单里选「转为 UTF-8」不带 BOM保存。养成习惯后可以避免九成的乱码问题。判断当前状态看右下角状态栏它会显示 UTF-8 或 ANSI。批量处理一堆老文件时用「在文件中查找」配合编码转换更稳别一个个手点。4. 把写作流程补齐UDL 高亮、自动完成与 pandoc 兜底导出4.1 UDL 词法高亮只管着色不管渲染Notepad 原生并不带完整的 Markdown 词法语言菜单里没有 Markdown 选项时靠导入 UDL用户自定义语言补上。路径是「语言 → 自定义语言 → 导入」选一个 UDL XML 文件导入后语言菜单末尾会多出一项给.md文件套上即可。需要说清楚的是UDL 只负责把标题、加粗、代码围栏染上颜色它和预览插件是两条独立的链路互不影响。装了 UDL 但没装插件你只有颜色没有预览装了插件没装 UDL,你只有预览没有颜色。两者都装才算顺手。UDL 文件不必自己从零写长度动辄上百行结构上分词法类型和关键字分组两块。自己改的时候最容易改坏的是文件扩展名关联和「前缀模式」开关——Markdown 的#是行首标记而非独立单词不开前缀模式就染不上色。4.2 自动完成用 XML 补常用片段#标题、表格竖线、任务列表这类东西重复度极高靠自动完成能省不少敲键。Notepad 的自动完成配置放在安装目录的autoCompletion文件夹下文件名必须和语言名逐字一致否则静默不生效——这是最容易踩的坑。?xml version1.0 encodingUTF-8? NotepadPlus !-- language 必须与「语言」菜单里显示的名字完全一致 -- AutoComplete languagemarkdown Environment ignoreCaseno startFunc( stopFunc) paramSeparator, terminal;/ !-- 只放高频、单行的片段多行骨架交给宏处理 -- KeyWord namepython / KeyWord namebash / KeyWord name- [ ] / KeyWord name- [x] / KeyWord name 注意 / KeyWord name 提示 / KeyWord name![截图](img/ / /AutoComplete /NotepadPlus参数说明ignoreCaseno表示大小写敏感Markdown 标记本身区分场景建议保持 no;startFunc和stopFunc用于函数式提示这里不涉及留默认即可每个KeyWord是一整段待插入文本注意 XML 里、需要转义。文件存成 UTF-8 无 BOM,放进autoCompletion目录重启编辑器后输入-或触发候选列表。需要坦白一点这个机制只适合单行片段。表格骨架带换行塞进KeyWord里不可靠我一般用宏录一遍开始录制 → 敲一遍三行表格 → 停止 → 保存宏 → 绑定快捷键比改 XML 稳得多。4.3 快捷键与宏把高频动作压到一个键实际写文档时动作序列很固定保存 → 刷新预览 → 滚到改动处。MarkdownViewer 的预览开关可以在「设置 → 管理快捷键」里绑键我习惯绑到CtrlShiftM,和自带的快捷键不冲突。宏则用来处理重复结构比如每次都要写的「接口地址 / 请求方式 / 参数表」三段式录一次宏绑一个键写新接口时按一下就有骨架剩下的填空。这里有个取舍宏绑太多键会记不住。我的原则是只给三类动作用宏——多行结构、跨文件的固定头部、需要重复粘贴的校验命令其他一概手工。快捷键表膨胀之后反而更慢。4.4 pandoc 兜底一次导出验证真实效果预览面板的渲染器终究不是发布环境交付前用 pandoc 走一遍能提前发现预览阶段看不到的问题。# 从 md 生成独立 HTML注入和预览一致的 CSS便于对比 pandoc README.md \ -f gfm \ # 按 GitHub 风格解析表格、任务列表都支持 -t html5 \ # 输出 HTML5 --standalone \ # 生成完整文档而不是片段 --metadata title部署说明 \ # 补上 head 里的标题 --cssstyle/preview.css \ # 复用预览用的那套样式减少视觉落差 -o dist/README.html # 需要单文件分发图片一起打包时把资源内联进去 pandoc README.md -f gfm -t html5 --standalone --embed-resources -o dist/README.html参数说明-f gfm决定了表格、删除线、任务列表这些扩展语法能不能识别用默认的 markdown 格式时管道表格常被当普通文本--standalone不加的话输出的是 HTML 片段直接打开是一堆无样式文本--embed-resources会把图片转成 base64 内联适合发给别人看但文件体积会明显变大正式发布还是分开存。旧版本 pandoc 用的是--self-contained,报参数不存在时换这个。5. 踩坑排查五类装不上、预览空、样式不生效的现场5.1 插件管理里搜不到手动装完菜单也没有现象Plugins Admin 列表里没有 MarkdownViewer,或者手动放了文件重启后「插件」菜单依旧没有新增项。原因两个方向。一是位数不匹配64 位编辑器加载 32 位 DLL 时会直接拒绝且不弹提示二是目录层级不对7.6 要求plugins\插件名\插件名.dll,平铺在根目录不会加载。解决先用 2.3 那段 PowerShell 确认 exe 版本和 plugins 下的实际结构再从对应位数的发布包取文件。判断位数最快的办法是看「帮助 → 关于」里写的是 32-bit 还是 64-bit,别凭安装路径猜。5.2 预览面板打开了但一片空白现象菜单点了预览面板出现了里面什么都没有或者只有一行纯文本。原因常见的三种——文件是 UTF-8 with BOM 导致首个语法标记失效插件依赖的 .NET 运行时缺失渲染环节静默失败面板宽度被拖到接近 0,看起来像空白。解决先把编码转成 UTF-8 无 BOM 再试再到插件目录看依赖 DLL 是否齐全缺运行时按提示装对应版本最后把面板拖宽、或者关掉预览重开一次。三步都过一遍九成能出结果。5.3 预览里表格正常粘到别处就塌现象预览面板显示的是漂亮的三线表复制到别的地方渲染成一堆竖线加文字。原因表格语法要求表头行和分隔行紧邻且表格块前后各留一个空行。预览用的解析器比较宽容会容错补全严格的解析器不容错直接当普通段落处理。解决在表格前后各补一个空行分隔行写成| --- | --- |,竖线数量与表头列数对齐。这是个纯格式问题不要怀疑插件。5.4 图片怎么都不显示现象正文里图片位置显示成小裂图或者干脆空着路径肉眼检查没问题。原因控件不知道相对路径的基准目录把img/a.png解析到了临时目录下或者文件名里有中文、空格、括号没转义。解决先 CtrlS 保存出真实路径再把相对路径统一去掉./,然后用file:///绝对路径做一次对照实验区分是路径问题还是文件问题。长期方案是把图片集中放在img/目录、文件名全用英文短横线。5.5 换了 CSS预览一点变化都没有现象改完 preview.css,重新点预览样式还是老样子。原因设置里的 CSS 路径写成了相对路径插件按自己的目录解析指向了一个不存在的文件或者 CSS 写错一个括号导致整份文件解析失败浏览器控件静默丢弃。解决CSS 路径一律写绝对路径最稳改完在浏览器里单独打开那份 CSS 检查有没有语法错误确认设置保存后完全退出编辑器再启动。改样式是个反复试错的过程把「改文件 → 重开预览」做成肌肉记忆比反复怀疑插件有效。6. 发布前自检一个图片路径脚本和四条验收线预览给的是即时反馈不是交付保证。我现在固定用一个小脚本扫全库的图片引用把「预览正常、发布裂图」这种情况挡在提交之前。import re import sys import pathlib # 只匹配 ![alt](src) 形式忽略带 title 的写法够用 IMG re.compile(r!\[[^\]]*\]\(([^)\s])) root pathlib.Path(sys.argv[1] if len(sys.argv) 1 else .) missing 0 for md in root.rglob(*.md): text md.read_text(encodingutf-8, errorsignore) for m in IMG.finditer(text): src m.group(1) if src.startswith((http://, https://, data:)): continue # 外链和内联图跳过 target (md.parent / src).resolve() if not target.exists(): missing 1 print(f{md} - 缺失 {src}) print(f缺失总数: {missing})逻辑说明rglob(*.md)递归扫描指定根目录相对路径按 md 文件自身所在目录解析这跟大多数渲染器的行为一致http、https、data:开头的直接跳过避免误报errorsignore是为了让个别编码不规范的老文件也能被扫到而不是中断。用法就是python check_img.py docs,输出为空即通过。这个脚本只有二十来行但省掉过我至少两次当场返工。除了脚本交付前我还会过四条验收线检查项通过标准为什么必须查表格结构前后有空行分隔行列数对齐预览容错、发布环境不容错标题层级从##起逐级不跳自动生成目录时会错乱代码围栏每个围栏都带语言标识无标识时高亮失效图片路径脚本输出为空最常见也最丢人的问题最后说个习惯。以前我信任「预览没问题就是没问题」,直到一次把文档发出去对方打开全是裂图才发现预览里的图走的是本地绝对路径。从那以后我每次交付前都强制走一遍这个脚本加一次 pandoc 导出两个结果都对得上才敢发。插件在 Plugins Admin 里搜 MarkdownViewer 直接装内网装不了就去取对应位数的离线包按目录结构放好剩下的交给上面这几步。希望帮到你。本文还有配套的精品资源点击获取