Skip to content

editor ​

原文链接

https://microsoft.github.io/monaco-editor/docs.html#modules/editor.html

editor 是 Monaco Editor 的核心模块,提供了编辑器实例的创建、销毁、获取、设置等功能。

快捷链接 ​

FaddCommand
FaddEditorAction
FaddKeybindingRule
FaddKeybindingRules
Fcolorize
FcolorizeElement
FcolorizeModelLine
Fcreate
FcreateDiffEditor
FcreateModel
FcreateMultiFileDiffEditor
FcreateWebWorker
FdefineTheme
FgetDiffEditors
FgetEditors
FgetModel
FgetModelMarkers
FgetModels
FregisterCommand
FregisterEditorOpener
FregisterLinkOpener
FremeasureFonts
FremoveAllMarkers
FsetModelLanguage
FsetModelMarkers
FsetTheme
Ftokenize

addCommand ​

  • 语法:addCommand(descriptor:ICommandDescriptor): IDisposable

  • 参数:descriptor: ICommandDescriptor

  • 返回值:IDisposable:IDisposable

    返回值是一个IDisposable对象,调用dispose()方法可以移除命令。

  • 描述:向编辑器命令服务添加命令处理器。

  • 示例:

js
// addCommand
editor.addCommand({
  id: "command-123",
  run: (...args) => {
    console.log("执行了 command-123", args);
  },
});

/**
 * Directly trigger a handler or an editor action.
 * @param source The source of the call.
 * @param handlerId The id of the handler or the id of a contribution.
 * @param payload Extra data to be sent to the handler.
 */
myEditor.trigger(null, "command-123", { a: 100 });
  • 输出:

WARNING

目前我也还未知 source 的作用哈!

create 的返回值也有一个 addCommand 方法,用法是完全不一样的,大家注意区分!后面会详细说

addEditorAction ​

  • 语法:addEditorAction(descriptor): IDisposable

  • 参数:descriptor: IActionDescriptor

  • 返回值:IDisposable:IDisposable

    返回值是一个IDisposable对象,调用dispose()方法可以移除命令。

  • 描述:向所有编辑器添加一个操作。

  • 示例:

js
editor.addEditorAction({
    id: "action123", // 唯一ID
    label: "action123", // 显示的名称
    keybindings: [KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KeyM),],   // 快捷键
    contextMenuOrder: 2, // 操作在菜单中的显示顺序
    // 指定操作应显示在上下文菜单的哪个组中 navigation表示默认组 
    // 可选值 navigation | 1_modification | 9_cutcopypaste
    contextMenuGroupId: "navigation",
    run: (...args) => {
      console.log("执行了 action123", args);
    },
  });
  • 输出:

KeyMod 传送门

KeyMod.chord 快捷键

addKeybindingRule ​

  • 语法:addKeybindingRule(rule): void

  • 参数:rule:IKeybindingRule

  • 返回值:IDisposable:IDisposable

    返回值是一个IDisposable对象,调用dispose()方法可以移除命令。

  • 描述:添加一个快捷键规则。

  • 示例:

js
editor.addKeybindingRule({
    keybinding: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KeyM),
    // command?: string | null;  // 暂未理解字段含义及用法
    // commandArgs?: any;  // 暂未理解字段含义及用法
    // when?: string | null;  // 暂未理解字段含义及用法
});

addKeybindingRules ​

  • 语法:addKeybindingRules(rules): void

  • 参数:rules:IKeybindingRule[]

  • 返回值:IDisposable:IDisposable

    返回值是一个IDisposable对象,调用dispose()方法可以移除命令。

  • 描述:添加一组快捷键规则。

  • 示例:

js
editor.addKeybindingRules([
  {
    keybinding: KeyMod.chord(KeyMod.CtrlCmd | KeyCode.KeyM),
    // command?: string | null;  // 暂未理解字段含义及用法
    // commandArgs?: any;  // 暂未理解字段含义及用法
    // when?: string | null;  // 暂未理解字段含义及用法
  },
  {
    keybinding: KeyCode.KeyM,
  },
]);

colorize ​

  • 语法:colorize(text, languageId, options?): Promise<string>

  • 参数:

  • 返回值:Promise<string>

  • 描述:对文本进行语法高亮处理,其中text是需要高亮的文本,languageId是语言类型,options是可选参数。

  • 示例:

js
const myEditor = editor.create(document.querySelector(".editor"), {
  value: `<template>App</template>`,
});

editor.colorize("<template>App</template>", "html").then((html) => {
  document.querySelector(".main").innerHTML = html;
});
  • 输出:

colorizeElement ​

  • 语法:colorizeElement(domNode, options): Promise<void>

  • 参数:

  • 返回值:Promise<void>

  • 描述:对指定的 HTML 元素进行语法高亮处理

  • 示例:

js
// 将普通的 htmlElement 转换为高亮显示
<div class="main">function add(a, b) { return a + b; }</div>

editor.colorizeElement(document.querySelector(".main"), {
  mimeType: "javascript",
});
  • 输出:

colorizeModelLine ​

  • 语法:colorizeModelLine(model, lineNumber, tabSize?): string

  • 参数:

    • model: ITextModel
    • lineNumber: number
    • tabSize: number
  • 返回值:string

  • 描述:对指定的文本模型的指定行进行语法高亮处理

  • 示例:

js
const model = editor.createModel('function add(a, b) { return a + b; }', 'text/javascript');

const html = editor.colorizeModelLine(model, 1, 4);

console.log(html);
  • 输出:

create ​

提示

这是创建编辑器的函数,在日常开发中,常用的是其返回值的属性进行项目开发,大家可以重点关注该方法!

js
const myEditor = editor.create(document.querySelector(".editor"), {
  value: `function add(a, b) { return a + b; }`,
  language: "javascript",
});
  • 输出:

createDiffEditor ​

js
const diffEditor = editor.createDiffEditor(
  document.querySelector(".editor"),
  {
    renderSideBySide: true, // renderSideBySide: false 行内比较
  }
);
diffEditor.setModel({
  original: editor.createModel(
    "function add(a, b) { return a + b; }",
    "javascript"
  ),
  modified: editor.createModel(
    "function add(a, b){ return a + b; }",
    "javascript"
  ),
});
  • 输出:

renderSideBySide: false 行内比较

renderSideBySide: true 并排视图比较

createModel ​

  • 语法:createModel(value, language?, uri?): ITextModel

  • 参数:

    • value: string
    • language: string
    • uri: uri
  • 返回值:ITextModel

  • 描述:创建一个新的文本模型实例

  • 示例:

js
  const myEditor = editor.create(document.querySelector(".editor"));
  // 通过 创建新的模型动态配置
  const model = editor.createModel("function a(){return 1}", "javascript");
  // 通过 setModel 设置模型
  myEditor.setModel(model);

createMultiFileDiffEditor ​

  • 语法:createMultiFileDiffEditor(domElement, override?): any

  • 参数:

  • 返回值:any

  • 描述:未知

  • 示例:

js
editor.createMultiFileDiffEditor(document.querySelector('.editor'))

createWebWorker ​

  • 语法:createWebWorker<T>(opts): MonacoWebWorker<T>

  • 泛型: T extends object

  • 参数: opts: IWebWorkerOptions

  • 返回值:MonacoWebWorker<T>

  • 描述:创建一个新的 Web Worker 实例

  • 示例:

js
const worker = editor.createWebWorker({
  moduleId: "myWorker",
  label: "My Worker",
  createData: {
    languageId: "javascript",
  },
});
console.log(worker);
  • 输出

defineTheme ​

  • 语法:defineTheme(themeName, themeData): void

  • 参数:

  • 返回值:void

  • 描述:定义一个主题

  • 示例:

js
const dom = document.querySelector(".editor");
editor.create(dom, {
  value: "// hello world",
  language: "javascript",
});
editor.defineTheme("myTheme", {
  base: "vs",
  inherit: true,
  rules: [
    { token: "comment", foreground: "ffa500", fontStyle: "italic" },
    { token: "keyword", foreground: "00ff00" },
    { token: "string", foreground: "ff0000" },
  ],
  colors: {
    "editor.background": "#1e1e1e",
    "editor.foreground": "#d4d4d4",
    "editorCursor.foreground": "#d4d4d4",
    "editor.lineHighlightBackground": "#3c3c3c",
    "editorLineNumber.foreground": "#d4d4d4",
    "editor.selectionBackground": "#3c3c3c",
  },
});
editor.setTheme("myTheme");
  • 输出:

getDiffEditors ​

  • 语法:getDiffEditors(): readonly IDiffEditor[]

  • 参数: -

  • 返回值:readonlyIDiffEditor[]

  • 描述:获取所有的差异编辑器实例

  • 示例:

js
const editor1 = monaco.editor.create(document.getElementById('container1'), {
    value: 'function add(a, b) { return a + b; }',
    language: 'javascript'
});

const editor2 = monaco.editor.create(document.getElementById('container2'), {
    value: 'function sub(a, b) { return a - b; }',
    language: 'javascript'
});

const diffEditor = monaco.editor.createDiffEditor(document.getElementById('container3'), {
    original: editor1.getModel(),
    modified: editor2.getModel()
});

const editors = monaco.editor.getDiffEditors();

console.log(editors.length);

getEditors ​

  • 语法:getEditors(): readonly ICodeEditor[]

  • 参数: -

  • 返回值:readonlyICodeEditor[]

  • 描述:获取所有的编辑器实例(非差异,指的是 create 创建的)

  • 示例:

js
const editor1 = editor.create(...)

const editor2 = editor.create(...)

console.log(editor.getEditors()) // [editor1, editor2]

getModel ​

  • 语法:getModel(uri): ITextModel | null

  • 参数: uri

  • 返回值:ITextModel | null

  • 描述:根据指定的 URI 获取对应的文本模型实例,如果不存在对应的文本模型实例,则返回 null.

  • 示例:

js
const uri = Uri.parse('file://path/to/file.js');

const model = editor.getModel(uri);

if (model) {
    console.log(model.getValue());
} else {
    console.log('Model not found');
}

getModelMarkers ​

  • 语法:getModelMarkers(filter): IMarker[]

  • 参数: filter:{owner?string;resource?:Uri;take?: number;}

    • owner: string
    • resource: Uri
    • take: number
  • 返回值:IMarker[]

  • 描述:获取模型标记

getModels ​

  • 语法:getModels(): ITextModel[]

  • 参数:-

  • 返回值:ITextModel[]

  • 描述:获取所有文本模型实例

  • 示例:

查看代码
js
const dom = document.querySelector(".editor");
const myEditor = editor.create(dom, {
  value: "console.log('hello world')",
  language: "javascript",
});

const model = editor.createModel("// demo", "javascript");
const model2 = editor.createModel("// 这是第二次创建model", "javascript");
myEditor.setModel(model); // 如果注释这两行,则 create 的结果也会算 model
myEditor.setModel(model2); // 如果注释这两行,则 create 的结果也会算 model

const diffEditor = editor.createDiffEditor(document.querySelector(".main"), {
  renderSideBySide: true, // renderSideBySide: false 行内比较
});
diffEditor.setModel({
  original: editor.createModel(
    "function add(a, b) { return a + b; }",
    "javascript"
  ),
  modified: editor.createModel(
    "function add(a, b){ return a + b; }",
    "javascript"
  ),
});

console.group("Model 分析");

editor.getModels().forEach((model) => {
  console.log(model.getValue());
});
  • 输出:

onDidChangeMarkers ​

  • 语法:onDidChangeMarkers(listener): IDisposable

  • 参数:listener: ((e) => void)

    • e: readonly Uri[]
  • 返回值:IDisposable:IDisposable

  • 描述:监听编辑器 markers 变化事件。

onDidChangeModelLanguage ​

  • 语法:onDidChangeModelLanguage(listener): IDisposable

  • 参数:listener: ((e) => void)

  • 返回值:IDisposable:IDisposable

  • 描述:监听模型语言变化。

onDidCreateDiffEditor ​

  • 语法:onDidCreateDiffEditor(listener): IDisposable

  • 参数:listener: ((diffEditor) => void)

  • 返回值:IDisposable:IDisposable

  • 描述:监听创建diff编辑器事件。

onDidCreateEditor ​

  • 语法:onDidCreateEditor(listener): IDisposable

  • 参数:listener: ((codeEditor) => void)

  • 返回值:IDisposable:IDisposable

  • 描述:监听代码编辑器创建事件。

onDidCreateModel ​

  • 语法:onDidCreateModel(listener): IDisposable

  • 参数:listener: ((model) => void)

  • 返回值:IDisposable:IDisposable

  • 描述:当model创建之后触发。

onWillDisposeModel ​

  • 语法:onWillDisposeModel(listener): IDisposable

  • 参数:listener: ((model) => void)

  • 返回值:IDisposable:IDisposable

  • 描述:取消model挂载之前触发。

registerCommand ​

  • 语法:registerCommand(id, handler): IDisposable

  • 参数:

    • id: string
    • handler: ((accessor, ...args) => void)
      • accessor: any
      • ...args: any[]
  • 返回值:IDisposable:IDisposable

  • 描述:注册一个命令。

  • 示例:

js
const myEditor = editor.create(dom, {
  value: "// write your code here",
  language: "javascript",
});

editor.registerCommand("commandID", (accessor, ...args) => {
  console.log(accessor, args);
});
myEditor.trigger(null, "commandID", {
  value: 1999,
});
  • 输出:

registerEditorOpener ​

  • 语法:registerEditorOpener(opener): IDisposable

  • 参数:opener: ICodeEditorOpener

  • 返回值:IDisposable:IDisposable

  • 描述:注册一个处理程序,当应在编辑器中打开当前模型以外的资源时调用该处理程序(例如“转到定义”)。如果请求已处理,则处理程序回调应返回 true,否则返回 false。 如果没有注册处理程序,则默认行为是对当前附加的模型以外的模型不执行任何操作。

registerLinkOpener ​

  • 语法:registerLinkOpener(opener): IDisposable

  • 参数:opener: ILinkOpener

  • 返回值:IDisposable:IDisposable

  • 描述:注册在任何编辑器中打开链接时调用的处理程序。如果链接已被处理,则处理程序回调应返回 true,否则返回 false。打开链接时,将最先调用最后注册的处理程序。

  • 示例:

查看代码
js
const myEditor = editor.create(dom, {
  value: "// https://www.baidu.com",
  language: "javascript",
});

editor.registerLinkOpener({
  open(resource) {
    console.log(resource);
    // 只有return false 才能默认打开链接
    // 包括 return false / return Promise.resolve(false)
    // 当然可以手动调用 window.open(resource.toString())
    // return window.open(resource.toString())
    return Promise.resolve(false);
  },
});
  • 输出:

remeasureFonts ​

  • 语法:remeasureFonts(): void

  • 参数:-

  • 返回值:void

  • 描述:清除所有的字体缓存。

removeAllMarkers ​

  • 语法:removeAllMarkers(owner): void

  • 参数:owner: string

  • 返回值:void

  • 描述:移除所有的标记

setModelLanguage ​

  • 语法:setModelLanguage(model, mimeTypeOrLanguageId): void

  • 参数:

  • 返回值:void

  • 描述:设置模型语言。

  • 示例:

js
const model = editor.createModel('Hello world!', 'javascript');
editor.setModelLanguage(model, 'typescript');

setModelMarkers ​

  • 语法:setModelMarkers(model, owner, markers): void

  • 参数:

  • 返回值:void

  • 描述:设置指定文本模型的标记

setTheme ​

  • 语法:setTheme(themeName): void

  • 参数:themeName: string

  • 返回值:void

  • 描述:设置主题

  • 示例:

js
// 也可以是自定义的主题
editor.defineTheme('my-theme', {
    // ...
})
editor.setTheme('vs-dark');

tokenize ​

  • 语法:tokenize(text, languageId): Token[][]

  • 参数:

    • text: string
    • languageId: string
  • 返回值:Token[][]

  • 描述:对指定的文本进行语法分析,返回一个 Token 数组

  • 示例:

js
const text = 'function add(a, b) { return a + b; }';
const languageId = 'javascript';

const tokens = editor.tokenize(text, languageId);

console.log(tokens);

Released under the MIT License.