MarkText 命令行接口(CLI)完全指南:全部命令参数与源码级实现解析
2026/9/18 21:19:52 网站建设 项目流程

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/clipackages/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

也就是说,只要满足以下任一条件即进入调试模式:

  1. 命令行传入--debug
  2. 环境变量MARKTEXT_DEBUG被设置为非空值;
  3. 应用运行在开发模式(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(-vverbose
2(-vvdebug
≥ 3(-vvvsilly

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 排查流程可以是:

  1. 运行marktext --version记录版本与运行环境;
  2. 出现渲染异常时用marktext --disable-gpu确认是否 GPU 相关;
  3. 遇到由用户配置导致的问题时用marktext --safe以默认配置启动;
  4. 需要定位日志时用marktext -vvmarktext -vvv开启更细粒度的日志,再查看用户数据目录下的日志文件;
  5. 希望隔离数据时用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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询