Codemirror keymap vim <esc>无法正常工作

时间:2015-06-28 20:08:26

标签: javascript vim codemirror keymapping

我在我的项目中使用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);
    }
  }
});

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

我检查了脚本并找到了这个函数,

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;
  }
}

现在,我认为我必须将我的声明修改为类似的内容,

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()
          }
        }
      }

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

终于想出了一个快速的出路。我删除了“Esc”键映射并使用了Codemirror的keydown事件,如下所示,

CodeMirror.on(editor, 'keydown', function(cm,event) {
      if(event.keyCode==27){
        if(editor.getOption("fullScreen"))
          toggleFullScreen();//exit full screen
      }
    });

通过这种方式,我不必使用extraKeys方法,因此vim“Esc”不会被覆盖并且仍在工作。