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