ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用Double Commander与PowerShell实现Markdown快速预览

用Double Commander与PowerShell实现Markdown快速预览 在实际使用双栏文件管理器 Double Commander 管理 Markdown 文档时最烦人的并不是文件移动或批量重命名而是想快速确认一个 .md 文件里到底写了什么。默认情况下按 F3 只能看到原始文本标题、列表、代码块和表格混在一起阅读体验很差如果每次都启动 Typora又会觉得太重。本文从 Double Commander 的外部查看器机制入手用 PowerShell 7 自带功能渲染 Markdown配置一个“选中文件按 F3 即可在浏览器中看到排版效果”的预览方案。整个过程不依赖 Typora也不需要额外安装 Markdown 编辑器适合经常在目录里翻文档、读说明、核对系统配置的开发者。1. 为什么要在文件管理器里预览 Markdown1.1 文件管理中的 MD 预览痛点很多开源项目的 README、接口文档、配置注释都使用 Markdown 格式。你在文件管理器里找到 README.md通常第一个动作是双击打开然后选择一个编辑器。如果这个文件只是几十行快速说明启动一个完整编辑器的过程往往比阅读本身更耗时。Typora 在写作体验上很好但它的定位是编辑器而不是“文件预览器”。每次打开 Typora除了加载编辑器窗口还会建立文件关联、维护文档树、显示工具栏。对于一个只想确认“这个 MD 里写的接口参数是什么”的人来说这些功能都是多余的。另一个常见选择是 VS Code比如给 .md 安装 Markdown Preview Enhanced 插件。这种方式能渲染但 VS Code 启动时间、窗口内存占用都不小而且双击文件后会先进入文本编辑态需要另外切换预览窗口。在“快速看文件内容”这个场景里依然不是最优解。1.2 Double Commander 查看器机制从内置文本到外部程序Double Commander 是开源的双栏文件管理器兼容 Total Commander 的常见操作习惯。它有一个内置查看器按 F3 时可以直接查看当前文件内容。对于文本文件内置查看器显示的是原始文本也就是说 Markdown 的#号、星号、反引号会原样显示。Double Commander 允许把 F3 的“首选查看方式”从内部查看器切换到外部程序。这样一旦选中 .md 文件按下 F3文件管理器不再显示原始文本而是把你配置好的外部命令执行起来。外部命令可以是一个批处理、一个 PowerShell 脚本、一个 Python 脚本也可以是任何一个已安装的程序。本文要做的就是写一个非常小的 PowerShell 脚本读取 .md 文件内容把 Markdown 转成 HTML再用系统默认浏览器打开渲染结果。Double Commander 只需要负责把当前光标下的文件路径传给脚本。1.3 方案对比Typora、VS Code、浏览器和 DC 外部查看器先给一个直观对比帮助理解每个方案适合什么场景。方案启动速度是否能渲染是否适合预览是否适合编辑Typora中等是可以但功能偏重很适合VS Code Markdown 插件较慢是可以但窗口和内存占用高适合浏览器直接打开 .md快多数不渲染不推荐否Windows 自带记事本快否原始文本否Double Commander 外部预览脚本较快是很合适仅查看Double Commander Typora 打开中等是一般很适合从表格能看出如果核心诉求是“在文件目录里快速看渲染结果”Double Commander 配合外部脚本是最轻量的路径。Typora 的价值仍然在编辑场景但快速预览这个场景并不是非它不可。2. 先准备环境PowerShell 7 与 Double Commander2.1 Double Commander 安装与版本确认在 Windows 上安装 Double Commander 有两种常见方式从官方 SourceForge 页面下载安装包或者用包管理器安装。# 使用 winget 安装需要 Windows 10 1709 以上版本 winget install --id DoubleCommander.DoubleCommander安装后打开软件界面是左右两个文件列表。这篇文章以 Windows 版 Double Commander 1.1.x 为例不同语言界面下菜单位置会有一点差异但核心设置项目都是“查看方式Viewer”“文件关联File Associations”“工具栏ToolBar”。确认版本的方式是看菜单栏“帮助 - 关于”。本文不依赖 Double Commander 的特殊版本功能只要不是过于陈旧的版本都能完成后续配置。2.2 为什么选 PowerShell 7 的 ConvertFrom-MarkdownWindows 自带的 Windows PowerShell 5.1 默认没有 Markdown 解析函数。从 PowerShell 7 开始内置了ConvertFrom-Markdown命令。它基于 Markdig 库实现支持表格、代码块、引用、任务列表等常见 GFM 语法使用这条命令无需安装 Python也不用下载 npm 包适合作为文件预览脚本的核心。如果电脑上还没有 PowerShell 7可以通过 winget 安装winget install --id Microsoft.PowerShell安装完成后命令行对外命令通常是pwsh。如果输入pwsh提示找不到命令可能需要手动把安装目录加入 PATH或者在下文的配置里直接写pwsh.exe的完整路径。注意后续所有脚本和配置都以 PowerShell 7 的pwsh为准。如果仍然使用 Windows PowerShell 5.1ConvertFrom-Markdown会直接报错这是最容易踩的环境问题。2.3 用一条命令确认函数可用打开 PowerShell 7执行Get-Command ConvertFrom-Markdown预期结果会增加一条命令信息命令名称是ConvertFrom-Markdown。如果提示“找不到”或者“无法找到命令”说明当前不是 PowerShell 7需要重新打开pwsh不要继续后面的配置。接着可以做一个最小验证# Hellon**World** | ConvertFrom-Markdown | Select-Object -ExpandProperty Html如果输出包含h1Hello/h1和strongWorld/strong说明 Markdown 转换链路是通的。3. 编写 Markdown 预览脚本3.1 脚本功能与输入输出约定这个脚本接收一个文件路径作为参数最终行为如下读取 .md 文件内容。使用ConvertFrom-Markdown把 Markdown 渲染成 HTML 片段。把 HTML 片段放入一个完整页面的模板中并设置基础路径base href让 Markdown 里的相对图片路径能够正确加载。以唯一文件名写入系统临时目录。用系统默认浏览器打开临时 HTML 文件。延迟几秒后尝试删除临时文件如果浏览器仍然占用删除会静默失败等待系统清理。不要求脚本处理复杂的前端高亮或主题样式只要标题、段落、代码块、表格和图片可见即可。实际项目中如果对样式有更高要求可以直接替换模板中的style内容。3.2 完整 PowerShell 脚本在某个固定目录比如D:\Tools\新建文件md-preview.ps1内容如下param( [Parameter(Mandatory $true)] [string]$FilePath ) $ErrorActionPreference Stop if (-not (Test-Path -LiteralPath $FilePath -PathType Leaf)) { Write-Host 文件不存在: $FilePath exit 1 } $absolutePath (Resolve-Path -LiteralPath $FilePath).Path $content [System.IO.File]::ReadAllText($absolutePath) $htmlFragment ($content | ConvertFrom-Markdown).Html $title [System.IO.Path]::GetFileNameWithoutExtension($absolutePath) $dirUri [System.Uri]::new( [System.IO.Path]::GetDirectoryName($absolutePath) [System.IO.Path]::DirectorySeparatorChar ).AbsoluteUri $template !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 base href$dirUri title$title/title style body { max-width: 860px; margin: 32px auto; padding: 0 16px 48px; line-height: 1.75; color: #24292f; font-family: Microsoft YaHei, PingFang SC, sans-serif; } pre { background: #f6f8fa; padding: 12px 16px; border-radius: 6px; overflow-x: auto; line-height: 1.45; } code { background: #f0f0f0; padding: 2px 5px; border-radius: 4px; font-family: Cascadia Code, Consolas, monospace; } pre code { background: transparent; padding: 0; } table { border-collapse: collapse; width: 100%; margin: 16px 0; } th, td { border: 1px solid #d0d7de; padding: 6px 12px; text-align: left; } blockquote { margin: 16px 0; padding: 0 16px; color: #57606a; border-left: 4px solid #d0d7de; } img { max-width: 100%; } hr { border: 0; border-top: 1px solid #d0d7de; margin: 24px 0; } /style /head body $htmlFragment /body /html $tempFile Join-Path $env:TEMP dc-md-preview-$([System.Guid]::NewGuid().ToString(N)).html [System.IO.File]::WriteAllText($tempFile, $template, [System.Text.Encoding]::UTF8) Start-Process $tempFile Start-Sleep -Seconds 8 Remove-Item -LiteralPath $tempFile -Force -ErrorAction SilentlyContinue3.3 关键代码解释读取、渲染、模板、图片路径脚本里最值得注意的有四个点。第一是读取文件。这里没有使用Get-Content而是[System.IO.File]::ReadAllText($absolutePath)。Get-Content默认会按行读取并返回数组遇到空文件或特殊编码时容易产生偏差ReadAllText会一次性读取整个字符串并自动按照 UTF8 或 UTF16 的 BOM 判断编码。如果文件是 UTF-8 编码处理起来没有问题。第二是渲染函数。ConvertFrom-Markdown返回的对象包含Html属性它是 Markdown 转换后的 HTML 片段不包含html外层结构。直接把它嵌入完整模板可以避免每个文件都重复写页面框架。第三是基础路径。Markdown 中经常出现类似![img](./images/logo.png)的相对图片路径。脚本生成的临时 HTML 在系统临时目录如果直接打开相对路径会被解析到临时目录下导致图片 404。在head中加入base href$dirUri$dirUri是当前 .md 文件所在目录的 file 协议 URI例如file:///D:/docs/。这样浏览器会把./images/logo.png解析成file:///D:/docs/images/logo.png图片就能正常显示。第四是临时文件清理。脚本在浏览器打开后睡眠 8 秒再尝试删除。Windows 上如果浏览器已经加载完文件删除通常能成功如果文件被浏览器进程占用Remove-Item会抛错但脚本用-ErrorAction SilentlyContinue忽略了错误。这个设计不是最优解但足够满足日常使用系统会在后续清理临时目录时回收残留文件。3.4 脚本测试命令行运行 md 文件先找一个简单的 Markdown 文件测试pwsh -NoProfile -File D:\Tools\md-preview.ps1 D:\docs\README.md这里-NoProfile的作用是跳过 PowerShell 用户配置文件启动更快也避免 profile 里的别名或模块影响脚本执行。如果脚本正确浏览器会打开一个带样式的页面能正常显示标题、列表和代码块。如果命令执行后没有任何反应先检查pwsh是否在 PATH 中。可以执行Get-Command pwsh如果pwsh不在 PATH 中可以通过完整路径调用。例如 PowerShell 7 安装到C:\Program Files\PowerShell\7\pwsh.exe就把测试命令改成 C:\Program Files\PowerShell\7\pwsh.exe -NoProfile -File D:\Tools\md-preview.ps1 D:\docs\README.md这一条可以同时验证脚本本身和外部命令调用方式后续 Double Commander 配置里也需要用完整路径或确保 PATH 中包含pwsh。4. 在 Double Commander 中接入预览4.1 设置 F3 使用外部查看器打开 Double Commander进入菜单“配置 - 选项”在左侧找到“查看方式”或“Viewer”。右侧会看到查看器相关设置其中有一个“首选查看器”或“Viewer”的选项默认通常是“内置查看器”。把它切换为“外部查看器”或“External Viewer”然后在下面的命令输入框里填写pwsh.exe -NoProfile -File D:\Tools\md-preview.ps1 %p如果你在命令行里无法直接调用pwsh需要写成完整的可执行文件路径C:\Program Files\PowerShell\7\pwsh.exe -NoProfile -File D:\Tools\md-preview.ps1 %p其中%p是 Double Commander 的宏代表当前光标所在文件的完整路径。双引号是为了防止路径里包含空格或中文目录。配置完成后选中任意一个 .md 文件按 F3。理想情况下Double Commander 不再打开内置文本查看器而是运行脚本并在浏览器中渲染 Markdown 页面。注意这里的“外部查看器”设置是全局的会影响所有文件类型的 F3 行为。也就是说按下 F3 后所有文件都会交给这个脚本处理。如果只想对 .md 文件使用外部预览而其他文件继续使用内置查看器需要使用文件关联而不是修改全局查看器设置。两种方式各有侧重下面会分别说明。4.2 用文件关联让双击 MD 文件直接预览如果只针对 .md 文件做处理更稳妥的方式是配置“文件关联”。菜单路径一般是“配置 - 文件关联”或“文件 - 文件关联”。在关联列表里新增扩展名md然后指定一个命令pwsh.exe -NoProfile -File D:\Tools\md-preview.ps1 %p文件关联配置完成之后在 Double Commander 中双击任意 .md 文件会直接执行预览脚本。其他文件类型的双击行为不受影响。这种方式还保留了扩展可能如果以后希望“双击预览回车用编辑器打开”可以再增加一个外部命令把Typora或VS Code关联到另一个快捷键上而不是覆盖默认双击。4.3 在工具栏增加一个“预览 Markdown”按钮F3 和双击已经足够使用。如果你想在工具栏放一个显眼入口可以自定义工具栏按钮。右键点击 Double Commander 的工具栏空白区域选择“自定义”。新增一个按钮命令类型选择“外部命令”或“执行程序”命令内容仍然是pwsh.exe -NoProfile -File D:\Tools\md-preview.ps1 %p可以为按钮设置一个文字标签比如“预览 MD”也可以选择一个合适的图标。这个按钮适合给不熟悉快捷键的人使用也和“快速预览”的定位保持一致。4.4 双栏结合左栏浏览右栏预览Double Commander 本身是双栏布局你可以左栏进入文档目录右栏进入另一个备份目录方便做文件对比。对于 Markdown 预览双栏的价值在于左栏选中文件按 F3 弹出浏览器右栏仍然是文件列表不会被打断。这种“边看预览边操作文件”的方式比全屏编辑器更顺手。但要注意Double Commander 内置的“快速查看面板”快捷键CtrlQ显示的是内置查看器并不会直接调用外部脚本。如果快速查看面板打开时按 F3外部脚本仍会弹出浏览器窗口快速查看面板本身保持原始文本显示。因此本文方案的预览结果是在浏览器中打开的而不是嵌入在 Double Commander 的右侧面板里。如果希望彻底内嵌需要寻找支持 Markdown 的 wlx 查看插件这已经超出本文的依赖范围。5. 验证效果与常见问题排查5.1 用一份规范 MD 文档验证渲染结果为了验证脚本是否达到预期可以创建一份包含不同语法块的最小测试文档保存为test.md# 标题测试 这是一个段落包含 **加粗**、*斜体* 和 行内代码。 ## 二级标题 - 列表项一 - 列表项二 python def hello(): print(hello)这是一段引用。名称说明F3渲染预览F4编辑文件注意上面的测试文档里有一个 python 代码块。将内容写入文件后在 Double Commander 中选中它并按 F3。浏览器打开后应该看到 - 一级标题和二级标题字号有层级。 - 加粗、斜体、行内代码样式正确。 - 无序列表有项目符号。 - Python 代码块有灰色背景且能横向滚动。 - 引用有左侧竖线。 - 表格有边框。 如果看到这些效果说明脚本链路已经通了。 ### 5.2 常见问题排查路径 排查遵循从简单到复杂的原则先确认脚本本身能跑通再确认 Double Commander 的配置是否生效。 | 问题现象 | 常见原因 | 检查方式 | 处理建议 | | --- | --- | --- | --- | | 按 F3 没有反应 | 首选查看器没切成外部 | 查看“选项 - 查看方式”里的设置项 | 切换为外部查看器或者检查文件关联 | | 命令行运行脚本报错 ConvertFrom-Markdown 找不到 | 不是 PowerShell 7 | 执行 Get-Command pwsh | 安装 PowerShell 7使用 pwsh 运行 | | 浏览器打开但内容是乱码 | 读取文件时编码判断错误 | 用编辑器查看原始文件编码 | 如果你的文件是 GBK可以用 Get-Content -Encoding Default但推荐统一转存为 UTF-8 | | 图片显示为空白 | 相对路径解析错误 | 查看临时 HTML 的 base href | 确认脚本中 dirUri 生成正确或者打开临时 HTML 后按 F12 看网络请求 | | 每次都弹黑色命令窗口 | 外部命令执行了控制台程序 | 设置里直接使用脚本路径 | 这是 PowerShell 正常现象可接受也可以用 -WindowStyle Hidden 降低干扰 | | 双击 .md 文件没有走预览脚本 | 文件关联没生效或命令错误 | 在 Double Commander 文件关联中重新选择 md 扩展名 | 确认命令中包含 %p 宏 | | 临时文件越积越多 | 删除操作被浏览器占用或脚本没执行删除 | 检查脚本最后的删除语句 | 手动清理 %TEMP% 下 dc-md-preview-*.html或改用固定文件名覆盖 | 这里要特别提醒不要一开始就怀疑脚本。先在命令行把脚本跑通再进入 Double Commander 做配置。工具类问题大多数出在配置项的宏和路径而不是脚本逻辑。 ### 5.3 参数与宏速查表 如果之后要自定义脚本或者给不同的文件类型配置不同查看命令下面的宏比较常用。 | 宏 | 含义 | 典型用法 | | --- | --- | --- | | %p | 当前光标下文件的完整路径 | %p | | %n | 当前文件名不含路径 | %n | | %d | 当前文件所在目录 | %d | | %t | 目标面板当前文件完整路径 | %t | | %L | 当前路径下的所有选中文件列表 | 批量处理场景 | 在本文的预览脚本中只需要 %p。如果你希望脚本也支持“预览另外一栏的文件”可以考虑改成 %t在使用时不要混淆。 ## 6. 进阶Python 方案与其他平台扩展 ### 6.1 已有 Python 环境的备选脚本 如果你的机器已经安装了 Python并且不想安装 PowerShell 7可以使用 Python 的 markdown 库作为替代。先安装依赖 bash pip install markdown然后创建md_preview.pyimport pathlib import sys import tempfile import webbrowser import time from pathlib import Path import markdown if len(sys.argv) 2: print(usage: python md_preview.py file) sys.exit(1) file_path Path(sys.argv[1]).resolve() if not file_path.exists(): print(file not found:, file_path) sys.exit(1) content file_path.read_text(encodingutf-8) body markdown.markdown( content, extensions[tables, fenced_code, codehilite], ) html f!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 base href{file_path.parent.as_uri()}/ title{file_path.stem}/title style body {{ max-width: 860px; margin: 32px auto; padding: 0 16px 48px; line-height: 1.75; }} pre {{ background: #f6f8fa; padding: 12px; border-radius: 6px; overflow: auto; }} code {{ background: #f0f0f0; padding: 2px 4px; border-radius: 4px; }} table {{ border-collapse: collapse; }} th, td {{ border: 1px solid #ddd; padding: 6px 12px; }} blockquote {{ border-left: 4px solid #ccc; margin-left: 0; padding-left: 16px; color: #666; }} /style /head body {body} /body /html with tempfile.NamedTemporaryFile( w, suffix.html, deleteFalse, encodingutf-8 ) as f: f.write(html) temp_path f.name webbrowser.open(temp_path) time.sleep(5) pathlib.Path(temp_path).unlink(missing_okTrue)在 Double Commander 中外部查看器命令可以写成python D:\Tools\md_preview.py %p使用 Python 方案时要注意编码如果 .md 文件不是 UTF-8需要先转换为 UTF-8 再读取。相比之下PowerShell 7 方案少一个 Python 依赖但两种都能达到同样的预览目标。6.2 Linux 与 macOS 上的思路Double Commander 本身是跨平台工具。在 Linux 下如果希望快速预览 Markdown核心思路是一样的把 F3 外部查看器指向一个能渲染 Markdown 的脚本。例如可以使用pandoc把 Markdown 转成 HTML再用xdg-open打开#!/usr/bin/env bash file$1 tmp$(mktemp --suffix.html) pandoc $file -s --metadata titlePreview -o $tmp xdg-open $tmp sleep 3 rm -f $tmpmacOS 里把xdg-open替换成open即可。原理没有区别本质都是“把 Markdown 转换成 HTML然后交给浏览器渲染”。在 Linux 桌面环境中也可以直接给 .md 文件配置一个 MIME 类型的默认打开命令让文件管理器里的双击行为变成预览脚本。这与 Windows 下在 Double Commander 中做文件关联是一样的思想。6.3 还需要 Typora 吗编辑与预览的分工建议这篇文章的标题比较直接但实际结论并不是“Typora 没有任何存在价值”。Typora 仍然是非常好的 Markdown 写作工具尤其是在写长文、调整表格、需要大纲视图时它的编辑体验胜过“文件管理器 浏览器预览”的组合。本文方案真正解决的问题是日常读文件和快速核对内容。比如你下载了一个开源项目想先看 README或者在服务器目录里找接口说明文档想确认参数或者在一堆配置说明里查找某个命令。这些场景下按一下 F3 直接看到渲染结果比启动一个完整编辑器明显更高效。所以更准确的说法是在快速预览这个环节Typora 不是必须的。Double Commander 加一个小脚本就能完成这个任务。如果遇到需要深度写作的 .md 文件仍然可以随时用 Typora 或其他编辑器打开。6.4 日常使用前的维护建议这个方案投入成本很低但为了让它在日常使用中不添乱建议遵守下面几条把md-preview.ps1或md_preview.py放到固定工具目录不要放在桌面或临时目录。如果更换了 PowerShell 7 的安装路径立即更新 Double Commander 中的查看器命令避免下次按 F3 后才发现自己写的是旧路径。每隔一段时间清理一次%TEMP%下的dc-md-preview-*.html文件尤其是脚本在浏览器占用文件时删除失败的情况。不要把脚本里的临时 HTML 文件名固定死否则浏览器会因为缓存显示旧内容使用 GUID 命名能避免大部分缓存问题。如果项目中使用了自定义 Markdown 扩展语法比如提示块、公式、绘图预览脚本可能无法完整渲染此时仍然需要 Typora 或专业预览工具介入。从本质上说这类方案的价值不在技术难度而在于把“看文档”这个高频动作嵌入了你已经熟悉的文件管理流程。Double Commander 提供一个入口PowerShell 负责转换浏览器负责展示三者配合之后Markdown 预览就能像查看普通文本一样顺手。
返回列表