Codemirror 键盘映射 vim <Esc> 不起作用

dsa*_*ket 5 javascript vim keymapping codemirror

我在我的项目中使用 CodeMirror 编辑器。我同时使用了/addon/display/fullscreen.js/keymap/vim.js脚本并像这样声明了 CodeMirror 实例,

var editor = CodeMirror.fromTextArea(document.getElementById("code"), {
  keyMap: "vim",
  extraKeys: {
    "F11": function(cm) {
      cm.setOption("fullScreen", !cm.getOption("fullScreen"));
    },
    "Esc": function(cm) {
      if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

如图所示,我映射了“Esc”键来退出全屏显示。现在,此键映射将覆盖脚本中定义的“Esc”键映射/keymap/vim.js,以将模式从 更改insertvisual

我检查了脚本并发现了这个函数,

function handleEsc() {
  if (key == '<Esc>') {
    // Clear input state and get back to normal mode.
    clearInputState(cm);
    if (vim.visualMode) {
      exitVisualMode(cm);
    } else if (vim.insertMode) {
      exitInsertMode(cm);
    }
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想我必须将我的声明修改为这样的内容,

extraKeys: {
        "F11": function(cm) {
          cm.setOption("fullScreen", !cm.getOption("fullScreen"));
        },
        "Esc": function(cm) {
          if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false);
          if (cm.getOption("keyMap") == "vim"){ 
             //Call handleEsc()
          }
        }
      }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何让它发挥作用。任何帮助将不胜感激。

Mar*_*ijn 1

如果您CodeMirror.Pass从密钥处理程序返回,将尝试其他处理程序。因此,在这种情况下,只需在您的条件(全屏)不成立时执行此操作即可。

extraKeys: { Esc: function(cm) { if (cm.getOption("fullScreen")) cm.setOption("fullScreen", false); else return CodeMirror.Pass; } }