2

所以我正在尝试制作一个 SCXML 编辑器,它基本上是 XML(状态机),其中包含 JavaScript 块。我很接近,但我无法添加提示。似乎归结为我不知道我在提示时所处的编辑模式。我在 CodeMirror 对象中查看了线索,但没有看到。我正在像这样进行多路复用:

CodeMirror.defineMode("scxml", function (config) {
    return CodeMirror.multiplexingMode(
      CodeMirror.getMode(config, "text/xml"),
      {
          open: "<script>", close: "</script>",
          mode: CodeMirror.getMode(config, "text/javascript"),
          delimStyle: "delimit"
      }
    );
});

editorXml = CodeMirror.fromTextArea(document.getElementById("editXmlFile"), {
    lineNumbers: true,
    mode: 'scxml',
    indentUnit: 4,
    autoCloseTags: true,
    matchBrackets: true,
    extraKeys: {
        "'>'": function (cm) { cm.closeTag(cm, '>'); },
        "'/'": function (cm) { cm.closeTag(cm, '/'); },
        "' '": function (cm) { CodeMirror.xmlHint(cm, ' '); },
        "'<'": function (cm) { CodeMirror.xmlHint(cm, '<'); },
        "Ctrl-Space": function (cm) { CodeMirror.xmlHint(cm, ''); }
    }
});

请注意extraKeysXML 提示的工作位置,如何在其中获取 JavaScript 提示?从 JavaScript 提示帮助看来,我会按照以下方式做一些事情:

  CodeMirror.commands.autocomplete = function(cm) {
    CodeMirror.simpleHint(cm, CodeMirror.javascriptHint);
  }

  ... extraKeys: {"Ctrl-Space": "autocomplete"} ...

但无论哪种方式,我都需要知道我所处的模式(XML 或 JavaScript)才能知道使用simpleHintvs xmlHint. 任何人都知道如何做到这一点?

编辑:当我在任何一个部分时才cm.getMode().name回来cm.getOption('mode')scxml

谢谢!

4

1 回答 1

0

我认为您应该可以发送 on ,您感兴趣的位置在CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(POS).state).mode.name哪里。它将返回一个类似or的名称,描述该位置的内部模式。POS{line, ch}"xml""javascript"

于 2012-12-23T08:45:13.587 回答