如何在Ace编辑器中检测Vim插入模式

时间:2019-03-27 20:05:19

标签: ace-editor

在我的编辑器实现中,我需要使用键盘导航检测何时有人在编辑器中上下移动。通过捕获向上和向下键,我可以轻松地在“默认” ACE编辑模式下完成此操作。

但是,使用VIM会更加复杂,因为vim导航键只能在导航模式下捕获。我可以检查编辑器是否正在使用Vim模式,但无法弄清楚如何检测VIM处于哪种模式。

这是关键点导航陷阱:

$("pre[lang]").on("keyup", function(event) {
  updateDocument();

  // up and down handling - force a preview refresh
  if (event.keyCode === 38 || event.keyCode === 40)
    te.previewRefresh();
  else if (te.lastStyle.keyboardHandler === "vim") {
       var vim = require("ace/keyboard/vim").Vim;  
      // How to get active Vim mode in document?
      //
      // if (vim is in navigation mode)
      //    te.previewRefresh();
  }
});

任何帮助将不胜感激。

row更改时,也许有更好的方法来捕获键盘导航。我已经尝试过编辑器change事件和增量,但是看起来比键陷阱更加复杂和不可靠。关于我可能错过的任何建议都是有用的。

1 个答案:

答案 0 :(得分:2)

看起来我在发布后立刻找到了答案(当然)。在此处发布以供其他人查看。

ACE实际上跟踪vim及其配置状态,并且在状态editor.state上附加了一个insertMode(以及其他)可以检查的状态对象。

以下内容使我可以检测导航键并对其进行操作。

// up and down handling - force a preview refresh
if (event.keyCode === 38 || event.keyCode === 40)      
  previewRefresh();

else if (te.editor.$keybindingId === "ace/keyboard/vim"
  && (event.keyCode === 74 || event.keyCode == 75)) {
  if (!te.editor.state.cm.state.vim.insertMode)
    previewRefresh();
}