Monaco编辑器 - `Action`和`Command`之间的区别是什么?

7
在 monaco 编辑器实例 中,您可以调用 addActionaddCommand,两者都提供了基于键事件执行函数的能力。
在线游乐场提供了如何 添加命令 或如何 添加操作 到编辑器实例的示例。 操作示例
editor.addAction({
    id: 'my-unique-id',
    label: 'My Label!!!',
    keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter],
    run: function() { alert('action called') }
});

命令示例

editor.addCommand(
  monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter,
  function() { alert('called command') }
)

文档描述了类型定义、属性和方法。
然而,在提供每个内容的上下文、它们在编辑器中的显示位置以及每个内容所提供的方面方面存在缺失。
动作和指令之间有什么区别?
2个回答

6

我个人的印象是,操作有点像演化出来的命令。命令首先被引入,后来意识到需要更多功能(例如上下文菜单集成),因此创建了 Action。由于兼容性原因,那时候无法删除 Command,所以两者今天仍然存在。


2
我基本上同意,但我发现了一个奇怪的边缘情况。如果页面上有多个编辑器,则addCommand无法正常工作-它会从错误的编辑器触发事件。切换到addAction对我解决了这个问题。 - larister
2
又是一個表明行動比命令更好的例證 :-) - Mike Lischke

0
ActionCommand之间有一些关键的区别:
  • Action是特定于编辑器的。您可以使用monaco.editor.IStandaloneCodeEditoraddAction方法添加一个动作。Command也可以使用IStandaloneCodeEditoraddCommand方法添加,这也使它特定于编辑器(添加的命令是匿名的,只能通过键绑定触发);然而,还有另一种(更常见的)注册命令的方式:通过全局的monaco.editor.registerCommand函数。这样,您可以为所有编辑器注册一个命名命令
  • Action会出现在命令面板中,并可以从中触发(在monaco编辑器中是F1,或者在vscode中是Ctrl+Shift+P),而Command则不会(尽管它被称为命令面板);
  • 一些语言提供者,例如monaco.languages.CodeActionProvider,只能使用Command。例如,要提供自定义重构功能,您必须注册一个Command并在CodeActionProvider中提供它,以使其出现在重构菜单中。
因此,ActionCommand是不同的抽象,一个不能替代另一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接