鸿蒙 PC Markdown 编辑器桌面效率:查找面板焦点与快捷键路由

鸿蒙 PC Markdown 编辑器桌面效率:查找面板焦点与快捷键路由
PC适配不是把手机页面拉宽。用户按 Ctrl+F后会立即输入查询,按 Ctrl+S期待保存当前标签,按 Ctrl+O期待系统选择器;如果焦点仍在 CodeMirror,字母会写进正文。混合 ArkUI与 ArkWeb应用还可能两边同时处理快捷键,导致一次按键触发两次命令。
本文基于 OhMarkdown,分析 Web键盘监听、原生命令路由、搜索面板挂载后聚焦、默认行为阻止和跨平台 Ctrl/Command兼容。代码位于 https://gitcode.com/VON-/codex_md_oh,对应提交 3a9146e。
快捷键入口靠近编辑焦点
用户大部分时间焦点在 ArkWeb CodeMirror,因此 Web层监听:
window.addEventListener('keydown', (event) => {
if (!(event.ctrlKey || event.metaKey) ||
event.altKey) {
return;
}
const key = event.key.toLowerCase();
if (key === 's' || key === 'o' || key === 'f') {
event.preventDefault();
window.OhMarkdownEditor?.requestCommand(
key === 's'
? 'save'
: key === 'o'
? 'open'
: 'find'
);
}
});
Ctrl适配常规 PC键盘,meta为将来平台键位兼容;Alt组合直接排除,避免与系统/输入法快捷键冲突。key转小写兼容 Shift状态。
只拦截已实现的 S、O、F。其他 Ctrl组合继续交给 CodeMirror,如复制、粘贴、撤销。全局监听不能无条件 preventDefault,否则会破坏编辑器内建键盘能力。
preventDefault 是数据安全
浏览器默认 Ctrl+F可能打开 ArkWeb自身查找,Ctrl+S可能触发网页保存,Ctrl+O可能打开浏览器文件行为。应用有原生面板和 Core File Kit流程,必须阻止默认动作。
阻止发生在确认 key属于白名单之后。调用 requestCommand前完成,避免异步 Bridge期间浏览器默认行为仍执行。若编辑器 API未初始化,可选链不会抛错,但默认已被阻止;页面 ready测试应保证正常入口存在。
Web 命令先刷新状态
requestCommand: (command) => {
flushToNative();
if (command === 'save') {
flushRecoverySnapshot();
pendingSaveDocument = editor.state.doc;
}
const content = command === 'save'
? editor.state.sliceDoc()
: '';
window.ohMarkdownBridge?.onCommand(
command,
content
);
}
快捷键不是只发送字符串。先刷新延迟的 dirty与字数;保存还立即写恢复快照并固定保存基线 Text,向原生携带当前全文。这样 Ctrl+S不会因为 Bridge防抖遗漏最后几个字符。
Open和 Find不传正文,减少跨边界数据。新建命令同理。命令协议限制为联合类型,Web不能请求任意原生方法。
原生层统一分发
private onEditorCommand(
command: string,
content: string
): void {
if (command === 'save') {
if (this.documentDirty ||
this.documentUri.length === 0) {
this.documentContent = content;
}
this.syncActiveDocumentSession(
this.documentContent
);
this.saveDocument(this.documentRevision);
} else if (command === 'open') {
this.requestOpenDocument();
} else if (command === 'new') {
this.requestCreateDocument();
} else if (command === 'find') {
this.openSearchPanel();
}
}
文件选择器、保存和 ArkUI面板都留在原生层。Web不直接调用系统 API。工具栏按钮也走相同 request方法,鼠标和键盘共享业务路径,避免两个保存实现。
未知 command没有动作。更严格版本可用枚举和运行时白名单记录协议错误,但不能动态执行方法名。
Ctrl+F 的关键是下一个按键
打开搜索面板:
private openSearchPanel(): void {
this.activePanel = 'search';
this.sidebarOpen = true;
setTimeout(() => {
focusControl.requestFocus(
'search-query-input'
);
}, 100);
}
设置状态后 ArkUI需要一轮渲染,输入框才挂载。同步 requestFocus可能找不到目标,因此短延迟后聚焦。真正验收不是“面板出现”,而是按 Ctrl+F后直接输入 alpha,文字进入查询框而非正文。
固定100毫秒是务实方案,仍有设备调度差异。更稳定方式是输入组件 onAppear后请求焦点,或用框架布局完成回调;后续应减少时间猜测。
输入框声明稳定 id
TextInput({
placeholder: $r(
'app.string.search_query_placeholder'
),
text: this.searchQuery
})
.id('search-query-input')
.onChange((value: string) => {
this.searchQuery = value;
this.searchMatchCount = 0;
})
.onSubmit(() => this.executeSearch())
id是 focusControl目标。onSubmit让回车执行下一个匹配,查询改变后清零旧计数,避免面板显示与新字符串不符。
向前、向后按钮保留独立命令。键盘 Enter/Shift+Enter的完整语义仍可增强;当前回车为正向查找。
面板已经打开时也要重新聚焦
活动栏点击 search或 Ctrl+F可能在面板已显示时发生。选择面板逻辑再次延迟聚焦:
if (panel === 'search') {
setTimeout(() => {
focusControl.requestFocus(
'search-query-input'
);
}, 100);
}
用户在编辑器继续输入后再次 Ctrl+F,焦点应回到现有查询框,不需要先关闭面板。面板可见状态与焦点状态是两个维度。
文件操作期间的快捷键
saveDocument和 openDocument检查 operationInProgress。系统选择器打开或保存进行中,再按快捷键不会启动第二笔操作。防止两个选择器叠加和活动会话被异步返回覆盖。
当前被拒命令没有声音或显式提示,状态栏保持进行中。后续可对重复保存合并最新 revision,而不是简单忽略,但要确保保存完成后新输入仍脏。
焦点返回编辑器
查找选中匹配后:
editor.dispatch({
selection: {
anchor: match.from,
head: match.to
},
effects: EditorView.scrollIntoView(
match.from,
{ y: 'center' }
)
});
editor.focus();
用户执行查找后,编辑器获得焦点,可复制或替换当前结果。与此同时,若用户继续在查询框输入,ArkUI仍持有焦点。当前面板按钮调用 Web后会把焦点转到编辑器,这是一项明确交互选择;成熟产品可让 F3定位但查询框保持输入焦点,需用户测试决定。
切换源码/分栏后也在下一动画帧 focus编辑器,避免布局变化时聚焦失败。纯预览模式没有可编辑焦点。
中文输入法不能被快捷键干扰
输入法组合期间 event.isComposing可用于避免把组合键误识别为命令。当前监听只处理带 Ctrl/meta的 S/O/F,正常中文候选输入不会带控制键;仍应在真实中文输入法下测试 Ctrl组合是否先提交候选。
不要监听普通字母作为单键命令,编辑器核心场景就是文本输入。全局快捷键还应避开 AltGr和系统输入法切换,所以显式排除 altKey。
鸿蒙 PC 搜索焦点界面
下图来自 MateBook Pro 2in1模拟器,左侧搜索面板与 CodeMirror同屏。Ctrl+F打开后查询框可直接输入,匹配计数与编辑器选区联动。

模拟器验证还包括 Ctrl+S、Ctrl+O和中文输入法。自动化通过键盘事件触发 Ctrl/Meta+F,应该断言 document.activeElement或 ArkUI焦点目标;跨 ArkUI/ArkWeb焦点最终仍需设备行为。
快捷键映射的扩展
下一批桌面命令包括新建、关闭标签、切换标签、撤销重做、源码/分栏/预览模式和命令面板。应建立中央命令注册表,包含 id、默认快捷键、可用条件和执行函数;ArkUI菜单、工具栏、Web事件都调用同一命令。
但不要过早引入大型命令框架。当前四个命令用联合类型和分发函数足够。出现用户自定义快捷键、菜单展示和冲突检测需求时,再提取抽象。
可访问性与状态
搜索箭头、活动栏图标和关闭按钮使用系统 symbol并提供 accessibilityText。焦点必须有可见样式,键盘用户能判断当前在查询框、按钮还是正文。Toggle使用真实开关语义,不用文字颜色假装状态。
快捷键不应只写在界面说明文字中,菜单项可在系统支持时显示组合键。用户要求文章技术型,应用界面本身不需要堆叠教程。
当前边界
标签切换与关闭快捷键未完成;固定100毫秒聚焦仍有时序假设;没有快捷键自定义和冲突管理;ArkUI侧焦点时的 Ctrl+S/O/F全局路由需要更全面覆盖;输入法组合状态尚未显式判断。
核心路径已经保证编辑焦点下 Ctrl+S/O/F进入原生命令,并且 Ctrl+F后可立即输入。后续扩展应保持单一命令语义,不让 Web和原生各自执行一遍。
结语
桌面快捷键是跨运行时焦点系统。OhMarkdown在最接近 CodeMirror焦点的 Web层识别组合键,阻止浏览器默认行为,刷新编辑状态后通过窄 Bridge交给 ArkTS;原生负责文件和面板,ArkUI挂载后再把焦点送到查询框。
PC体验的衡量标准不是有没有 Ctrl+F图标,而是用户按键后下一串字符是否到达正确位置、命令是否只执行一次、失败是否保留正文。把这些细节做实,鸿蒙 PC编辑器才真正适合键盘主导的持续工作。
更多推荐




所有评论(0)