MarkText 命令行接口(CLI)完全指南:全部命令参数与源码级实现解析
【免费下载链接】marktext📝A simple and elegant markdown editor, available for Linux, macOS and Windows.项目地址: https://gitcode.com/gh_mirrors/ma/marktext
本篇指南基于 MarkText 官方文档 Command Line Interface 展开,完整介绍marktext命令的语法、全部可用参数、位置参数(文件/目录路径)的用法,并结合本仓库主进程源码(packages/desktop/src/main/cli、packages/desktop/src/main/app等)逐项解析每个参数背后的实现原理。读完本文,你将能够在 Linux、macOS、Windows 上熟练通过命令行启动 MarkText、指定用户数据目录、启用调试或安全模式,并理解单实例锁与第二实例参数转交等底层机制。
命令语法总览
MarkText 的命令行语法为:
marktext [commands] [path ...]其中commands是可选参数(flag),path ...是一个或多个文件或目录路径,用于在启动时直接打开。完整的可用命令如下(摘自 CLI.md 与 cli/index.ts 中的 help 输出):
| 参数 | 别名 | 说明 |
|---|---|---|
--debug | 无 | 启用调试模式 |
--safe | 无 | 禁用插件及其他用户配置 |
--new-window | -n | 在已运行实例存在时,于新窗口打开 |
--user-data-dir | 无 | 更换用户数据目录 |
--disable-gpu | 无 | 禁用 GPU 硬件加速 |
--disable-spellcheck | 无 | 本次会话禁用拼写检查 |
--verbose | -v | 输出详细日志(可重复叠加) |
--version | 无 | 打印版本信息 |
--help | -h | 打印帮助信息 |
注意:
marktext应指向你的 MarkText 安装位置,不同平台的具体路径不同。例如 macOS 上可以创建别名(alias)方便调用,详见下文“平台差异与便捷别名”一节。
参数解析的底层实现
MarkText 主进程使用arg库解析命令行参数,解析规格定义在 cli/parser.ts 中:
const spec = { '--debug': Boolean, '--safe': Boolean, '--new-window': Boolean, '-n': '--new-window', '--disable-gpu': Boolean, '--disable-spellcheck': Boolean, '--user-data-dir': String, // Misc '--help': Boolean, '-h': '--help', '--verbose': arg.COUNT, '-v': '--verbose', '--version': Boolean } satisfies arg.Spec return arg(spec, { argv, permissive })几个值得注意的解析细节:
- 布尔开关:
--debug、--safe、--new-window、--disable-gpu、--disable-spellcheck都是纯布尔参数,出现即视为true。 - 取值参数:
--user-data-dir的类型是String,必须跟随一个目录路径值。 - 计数参数:
--verbose使用arg.COUNT,可以重复出现(如-vvv),叠加次数会被累计;-n/-h/-v分别是三个长参数的单字符别名。 - 宽容模式:
parseArgs默认以permissive = true解析,未知的 flag 不会被当作错误抛出,而是被保留下来(例如在第二实例参数处理时用于忽略未知开关)。
解析入口在 cli/index.ts,它会基于process.argv切片生成参数,并依序处理--help、--version、便携模式检测与--user-data-dir的绝对路径规范化。
逐个参数详解
--debug:启用调试模式
该参数用于开启调试模式,方便排查问题。在 app/env.ts 中,调试模式由以下三个条件共同决定:
const debug = !!args['--debug'] || !!process.env.MARKTEXT_DEBUG || import.meta.env.DEV也就是说,只要满足以下任一条件即进入调试模式:
- 命令行传入
--debug; - 环境变量
MARKTEXT_DEBUG被设置为非空值; - 应用运行在开发模式(
import.meta.env.DEV,即通过electron-vite开发服务器启动)下。
调试标志随后被写入global.MARKTEXT_DEBUG,同时 verbose 计数被写入global.MARKTEXT_DEBUG_VERBOSE(见 app/env.ts),供主进程其他模块读取。
--safe:安全模式
安全模式的语义是“禁用插件及其他用户配置”。从源码看,app/env.ts 将--safe映射为safeMode并同样写入全局变量global.MARKTEXT_SAFE_MODE。
它的实际影响之一体现在用户自定义快捷键的处理上:keyboard/shortcutHandler.ts 在加载用户快捷键配置前会先检查安全模式:
const safeMode = (globalThis as typeof globalThis & { MARKTEXT_SAFE_MODE?: boolean }) .MARKTEXT_SAFE_MODE if (safeMode || !isFile2(this.configPath)) { // 跳过用户配置,仅使用默认快捷键 }此外 preferences/index.ts 中留有注释表明设计意图:安全模式下不应加载用户偏好设置。因此--safe适合在遇到由用户配置(自定义快捷键、个性化设置等)引起的异常时,以干净的默认环境启动应用。
-n, --new-window:第二实例在新窗口打开
MarkText 在非 macOS 且非开发模式下会通过app.requestSingleInstanceLock()申请单实例锁(见 index.ts):当第二个实例启动时,它不会创建新进程窗口,而是把自身命令行参数转交给已运行的实例处理。
第二实例处理逻辑在 app/index.ts 的second-instance事件中:
app.on('second-instance', (_event, argv, workingDirectory, additionalData) => { // 解析第二实例的原始参数 const args = parseArgs(secondArgv.slice(1)) as CliArgs // 收集所有路径参数 const buf: PathInfo[] = [] for (const pathname of args._) { if (pathname.startsWith('--')) continue const info = normalizeMarkdownPath(path.resolve(workingDirectory, pathname)) if (info) buf.push(info as PathInfo) } if (args['--new-window']) { this._openPathList(buf, true) return } // 否则在现有窗口中打开文件/目录 })- 不带
--new-window:第二实例传入的文件/目录会在已运行的实例中打开(聚焦到最合适的窗口)。 - 带
--new-window:直接在新窗口中打开这些路径,且所有文件会合并进第一个目录窗口(_openPathList(buf, true)中的openFilesInSameWindow = true逻辑,见 app/index.ts)。
这一点同样体现在 Windows 的任务栏跳转列表(Jump List)中,MarkText 注册了一个“New Window”任务项,其启动参数就是--new-window(见 app/index.ts)。
--user-data-dir:更换用户数据目录
用户数据目录存放偏好设置(preferences.json)、编辑器缓冲区状态、日志等应用数据。--user-data-dir用于将其迁移到其他位置,例如:
marktext --user-data-dir /path/to/my-marktext-data其处理逻辑在 cli/index.ts:
// 检查便携模式并确保用户数据路径为绝对路径 if (!args['--user-data-dir']) { const portablePath = path.join(app.getAppPath(), '..', '..', 'marktext-user-data') if (isDirectory(portablePath)) { args['--user-data-dir'] = portablePath } } else { args['--user-data-dir'] = path.resolve(args['--user-data-dir']) }- 若显式传入
--user-data-dir,会通过path.resolve规范化为绝对路径(假定该目录可写,否则会导致应用启动失败)。 - 若未传入,MarkText 会检查应用安装目录上上级是否存在
marktext-user-data目录——存在即自动启用“便携模式”,把数据目录指到那里。这是官方支持的一种便携化运行方式。
--disable-gpu:禁用 GPU 硬件加速
该参数在 main/index.ts 中处理:
if (args['--disable-gpu']) { app.disableHardwareAcceleration() }它会在应用启动早期调用 Electron 的app.disableHardwareAcceleration(),彻底关闭 GPU 硬件加速。适用于虚拟机环境、老旧显卡驱动导致渲染异常或花屏的场景。注意必须在 app ready 之前生效,因此该判断被放在主进程入口的早期位置。
--disable-spellcheck:禁用本次会话的拼写检查
该参数在 app/env.ts 中被映射为disableSpellcheck标志。MarkText 依赖 Chromium/Electron 的内置拼写检查器(见 spellchecker/index.ts,其中通过webContents.session管理拼写检查的开关、语言切换与用户词典),--disable-spellcheck让你在不进入偏好设置的前提下,仅对当前会话临时关闭拼写检查。
另外需要注意 main/config.ts 中的一处工作区注释:如果应用启动时已禁用拼写检查,则在后续的 WebContents 创建中不能重新启用它——也就是说该开关会影响整个会话的拼写检查状态。
-v, --verbose:详细日志输出
--verbose是一个可重复的计数参数(arg.COUNT),支持-v、-vv、-vvv等写法。它与日志级别挂钩,映射关系实现在 utils/index.ts:
-v次数 | 日志级别 |
|---|---|
| 0(未指定) | info(生产环境) |
1(-v) | verbose |
2(-vv) | debug |
≥ 3(-vvv) | silly |
verbose 计数值通过global.MARKTEXT_DEBUG_VERBOSE暴露给日志初始化逻辑(见 main/index.ts 的getLogLevel()调用),用于控制主进程与渲染进程日志文件的输出粒度。
--version:打印版本信息
--version会打印 MarkText 及其运行环境的完整版本信息(见 cli/index.ts):
MarkText: <版本号> Node.js: <Node 版本> Electron: <Electron 版本> Chromium: <Chromium 版本> OS: <系统类型> <架构> <内核版本>在排查问题时,这组信息(尤其是 Electron 与 Chromium 版本)是向项目提交 issue 时必须附带的关键上下文。
-h, --help:打印帮助信息
--help(或-h)会在标准输出打印本文开头的完整命令列表并立即退出(process.exit(0)),不启动应用窗口。
位置参数:启动时直接打开文件或目录
marktext [commands] [path ...]中,不以-开头的参数会被当作路径处理(arg解析结果存放在args._中)。启动时这些路径会进入_openFilesCache,随后在 app ready 后按一定策略分发(见 app/index.ts 与_openPathList方法):
- 文件:在合适窗口的新标签页中打开;
- 目录:作为根目录在新窗口打开,并自动记忆为“最近打开的文件夹”(
lastOpenedFolder); - 同时传入多个文件与目录:会尽量把属于同一目录的文件合并到对应目录窗口,其余文件按“最佳窗口”算法分发(
findBestWindowToOpenIn); - 偏好设置中的
openFilesInNewWindow若开启,则每个文件/目录都会各自新建窗口打开。
例如,启动并直接打开两个 Markdown 文件:
marktext notes/meeting.md notes/todo.md启动并打开整个文档目录:
marktext ~/Documents/notes另外,代码对位置参数中的未知 flag 做了防护:以--开头的条目会被跳过(见 app/index.ts),避免误把开关当路径处理。
开发模式下的参数覆盖
在开发模式下(import.meta.env.DEV),cli/index.ts 会重写整个 argv:
if (import.meta.env.DEV) { // 不把 Electron 开发参数传给 MarkText,并更换用户数据路径。 argv = ['--user-data-dir', path.join(getPath('appData'), 'marktext-dev')] }即开发运行时强制使用独立的marktext-dev用户数据目录,避免开发数据污染日常使用的配置,同时屏蔽 Electron 自身附加的开发参数。相关行为可参考 e2e 测试 issue-5407-debug-mode.spec.ts 与 issue-5053-node-env-development.spec.ts。
平台差异与便捷别名
marktext命令的具体路径因平台而异:
- macOS:安装后位于应用包内,官方文档建议创建别名,例如:
alias marktext="/Applications/marktext.app/Contents/MacOS/marktext"将这一行写入
~/.zshrc或~/.bashrc后,即可在终端直接使用marktext命令。 - Linux:取决于安装方式(AppImage、deb/rpm 包或源码运行),可执行文件一般位于 PATH 中的安装目录。
- Windows:安装后可在 PowerShell 或 CMD 中使用完整路径,或把安装目录加入系统 PATH。
平台差异也体现在应用行为上:
- macOS 下应用常驻(关闭所有窗口不退出,
window-all-closed时仅非 macOS 平台退出,见 main/index.ts); - 单实例锁仅在非 macOS(且非开发模式、非 MAS 打包)下启用,macOS 更多依赖其原生的
open-file事件来接收文件打开请求(见 app/index.ts); - 拼写检查的语言支持上,macOS 使用系统拼写检查器且语言自动检测,其他平台才返回可用词典列表(见 spellchecker/index.ts)。
测试验证与典型排查流程
仓库的 e2e 测试直接印证了上述命令行行为,可作为功能参考:
- issue-3020-second-instance-args.spec.ts:验证第二实例携带
--user-data-dir启动时,文件能被正确转交并打开在已运行实例中——这正是second-instance事件通过additionalData传递原始 argv 的原因(详见 app/index.ts 的注释与实现)。 - helpers.ts:e2e 测试框架本身就以
--user-data-dir为每个测试隔离用户数据目录。 - issue-5407-debug-mode.spec.ts:验证调试模式相关行为。
一个典型的 CLI 排查流程可以是:
- 运行
marktext --version记录版本与运行环境; - 出现渲染异常时用
marktext --disable-gpu确认是否 GPU 相关; - 遇到由用户配置导致的问题时用
marktext --safe以默认配置启动; - 需要定位日志时用
marktext -vv或marktext -vvv开启更细粒度的日志,再查看用户数据目录下的日志文件; - 希望隔离数据时用
marktext --user-data-dir <dir>指定独立目录,或利用便携模式让 MarkText 自动读取安装目录旁的marktext-user-data。
小结
MarkText 的命令行接口覆盖了启动定位(文件/目录路径)、环境隔离(--user-data-dir、便携模式)、诊断(--debug、--verbose、--version)、渲染问题规避(--disable-gpu)以及会话级功能开关(--safe、--disable-spellcheck、--new-window)等场景。其实现集中在 cli/parser.ts、cli/index.ts、app/env.ts 与 app/index.ts 四个主进程模块中,理解这些源码可以帮你更精准地组合参数,快速定位和解决实际使用中的问题。
【免费下载链接】marktext📝A simple and elegant markdown editor, available for Linux, macOS and Windows.项目地址: https://gitcode.com/gh_mirrors/ma/marktext
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考