[{"data":1,"prerenderedAt":226},["ShallowReactive",2],{"quirekit-doc:\u002Fconcepts\u002Fcommands":3},{"id":4,"title":5,"body":6,"description":215,"extension":216,"keywords":217,"locale":218,"meta":219,"navigation":220,"order":209,"path":221,"section":222,"seo":223,"stem":224,"__hash__":225},"docs\u002Fconcepts\u002Fcommands.zh-CN.md","命令与事务",{"type":7,"value":8,"toc":208},"minimark",[9,13,17,20,47,50,53,56,87,94,107,110,147,161,167,170,191,204],[10,11,12],"p",{},"命令是编辑器提供给界面的动作，例如加粗、插入内容和撤销。工具栏、快捷键与业务代码都通过命令修改同一份文档。",[14,15,16],"h2",{"id":16},"执行一个命令",[10,18,19],{},"安装粗体扩展或 StarterKit 后，可以调用：",[21,22,28],"pre",{"className":23,"code":24,"filename":25,"language":26,"meta":27,"style":27},"language-ts shiki shiki-themes github-light github-light github-dark","editor.commands.toggleBold()\n","立即切换粗体","ts","",[29,30,31],"code",{"__ignoreMap":27},[32,33,36,40,44],"span",{"class":34,"line":35},"line",1,[32,37,39],{"class":38},"sVPnS","editor.commands.",[32,41,43],{"class":42},"sgQzM","toggleBold",[32,45,46],{"class":38},"()\n",[10,48,49],{},"它作用于当前选区。返回的布尔值表示动作是否被处理，不代表内容已经写入存储。",[14,51,52],{"id":52},"把几个动作连起来",[10,54,55],{},"点击工具栏后，通常希望先把焦点还给编辑器，再修改格式：",[21,57,60],{"className":23,"code":58,"filename":59,"language":26,"meta":27,"style":27},"editor.chain().focus().toggleBold().run()\n","组合命令",[29,61,62],{"__ignoreMap":27},[32,63,64,67,70,73,76,78,80,82,85],{"class":34,"line":35},[32,65,66],{"class":38},"editor.",[32,68,69],{"class":42},"chain",[32,71,72],{"class":38},"().",[32,74,75],{"class":42},"focus",[32,77,72],{"class":38},[32,79,43],{"class":42},[32,81,72],{"class":38},[32,83,84],{"class":42},"run",[32,86,46],{"class":38},[10,88,89,90,93],{},"链中的动作使用同一个事务上下文，最后由 ",[29,91,92],{},"run()"," 提交。事务描述这一次修改包含的内容与选区变化，历史记录据此支持撤销和重做。",[10,95,96,98,99,102,103,106],{},[29,97,92],{}," 返回所有动作是否都报告处理成功。它不是自动回滚开关：某个动作返回 false，不会撤回其他动作已写入共享事务的步骤。需要先判断可执行性时，使用同样的 ",[29,100,101],{},"can().chain()","；自定义命令在拒绝时不应先修改 ",[29,104,105],{},"tr","。",[14,108,109],{"id":109},"先检查能否执行",[21,111,114],{"className":23,"code":112,"filename":113,"language":26,"meta":27,"style":27},"const enabled = editor.isEditable && editor.can().toggleBold()\n","不修改内容的检查",[29,115,116],{"__ignoreMap":27},[32,117,118,122,126,129,132,135,138,141,143,145],{"class":34,"line":35},[32,119,121],{"class":120},"sDD9d","const",[32,123,125],{"class":124},"sUNQB"," enabled",[32,127,128],{"class":120}," =",[32,130,131],{"class":38}," editor.isEditable ",[32,133,134],{"class":120},"&&",[32,136,137],{"class":38}," editor.",[32,139,140],{"class":42},"can",[32,142,72],{"class":38},[32,144,43],{"class":42},[32,146,46],{"class":38},[10,148,149,152,153,156,157,160],{},[29,150,151],{},"can()"," 在当前状态下检查动作，不提交修改。它不检查应用的写权限，也不保证只读时返回 false。按钮通常组合 ",[29,154,155],{},"editor.isEditable && editor.can().toggleBold()","；粗体是否“选中”则通过 ",[29,158,159],{},"isActive('bold')"," 查询。",[10,162,163,166],{},[29,164,165],{},"setEditable(false)"," 控制 View 的用户输入，业务命令和协作事务仍可能写入。应用的按钮、AI、异步服务与自动化入口应在最后调用命令前检查自己的写权限、目标和当前可编辑状态，不能仅依靠隐藏按钮。",[14,168,169],{"id":169},"开发自己的命令",[10,171,172,173,176,177,180,181,183,184,187,188,190],{},"在扩展的 ",[29,174,175],{},"addCommands()"," 中注册动作，复用回调提供的 ",[29,178,179],{},"commands","、",[29,182,105],{}," 与 ",[29,185,186],{},"dispatch","。这样直接调用、命令链和 ",[29,189,151],{}," 使用相同逻辑。检查模式里不能触发请求、弹窗或修改外部状态。",[10,192,193,194,199,200,106],{},"按步骤接入按钮见",[195,196,198],"a",{"href":197},"\u002Fbuild\u002Fcommands","工具栏教程","，定义新动作见",[195,201,203],{"href":202},"\u002Fbuild\u002Fextension","内容扩展",[205,206,207],"style",{},"html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sDD9d, html code.shiki .sDD9d{--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}",{"title":27,"searchDepth":209,"depth":209,"links":210},2,[211,212,213,214],{"id":16,"depth":209,"text":16},{"id":52,"depth":209,"text":52},{"id":109,"depth":209,"text":109},{"id":169,"depth":209,"text":169},"先使用命令，再理解修改如何进入同一份历史记录。","md",null,"zh-CN",{},true,"\u002Fconcepts\u002Fcommands","核心概念",{"title":5,"description":215},"concepts\u002Fcommands.zh-CN","_wSFjUWZlkQRjYAqEXlgsI1EgHLDK8fpS3sI6QPbg5c",1793045209087]