Codemirror 3使用simpleHint复用模式

时间:2012-12-19 19:58:13

标签: codemirror

所以我正在尝试创建一个SCXML编辑器,它基本上是带有JavaScript块的XML(状态机)。我很接近,但我在添加提示时遇到了麻烦。它似乎归结为我不知道我提到的编辑模式是什么时候提示。我查看了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, ''); }
    }
});

注意在XML提示工作的extraKeys中,如何在那里获得JavaScript提示?从JavaScript提示帮助来看,似乎我会做一些事情:

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

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

但不管怎样,我需要知道我所使用的模式(XML或JavaScript)才能使用simpleHintxmlHint。任何人都知道如何做到这一点?

编辑:cm.getMode().namecm.getOption('mode')当我在任一部分时,只返回scxml

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您应该能够CodeMirror.innerMode(cm.getMode(), cm.getTokenAt(POS).state).mode.name发送,其中POS是您感兴趣的{line, ch}位置。它会返回"xml"之类的名称或"javascript",描述该位置的内部模式。