Как определить режим вставки Vim в редакторе Ace

#ace-editor

#ace-editor

Вопрос:

В моей реализации редактора мне нужно определять, когда люди перемещаются вверх и вниз в редакторе с помощью навигации по клавиатуре. Я могу легко сделать это в режиме редактирования ACE по умолчанию, захватив клавиши up и down.

Однако с 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:

Похоже, я нашел свой ответ сразу после публикации (конечно). Публикую здесь, чтобы другие могли увидеть.

ACE фактически отслеживает vim и его настроенное состояние, и к нему прикреплен объект состояния, editor.state с insertMode помощью an (и других), который можно проверить.

Следующее позволяет мне определять навигационные клавиши и предпринимать действия по этому поводу.

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

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