Как разрешить два отдельных сопоставления клавиш для одного ключа (скажем, Up) в CodeMirror, в зависимости от сценария

Я создаю расширение Chrome, которое добавляет автозаполнение к экземпляру CodeMirror (по какой-то причине развернуло мою собственную версию автозаполнения), а рассматриваемый экземпляр CodeMirror - v2.37, поэтому он довольно старый.

Все работает, за исключением того, что я хочу использовать "Ввод", "Вверх" и "Вниз" для отображения автозаполнения и, таким образом, выбрать запись или переместиться вверх / вниз по списку. Проблема, с которой я столкнулся, заключается в том, что, хотя это легко включить, когда отображается автозаполнение, в настоящее время оно также предотвращает действие по умолчанию, когда оно не отображается. Вот код, который у меня есть:

editor.setOption("extraKeys", {
  "Enter": function(){
    if($('.CodeMirror-completions').length > 0) {
      var str = $('.CodeMirror-completions li.selected').text();
      var from = $('.CodeMirror-completions ul').data('from');
      var to = $('.CodeMirror-completions ul').data('to');
      editor.replaceRange(str, from, to);
      $('.CodeMirror-completions').remove();
      setTimeout(function(){editor.focus();}, 50);
      return editor.PASS;
    } else {
      CodeMirror.commands.newlineAndIndent(cm);
    }
  },
  "Up": function(){
    if($('.CodeMirror-completions').length > 0) {
      var divSelected = $('.CodeMirror-completions li.selected');
      var next = divSelected.prev('li');
      divSelected.removeClass('selected');
      if (next.length > 0){
        divSelected = next.addClass('selected');
      }
      return editor.PASS;
    } else {
      CodeMirror.commands.goLineUp(cm);
    }
  }
});

Интересно, что "Enter" работает нормально, а "Up" - нет.

Сначала я думал, что это будет работать (в псевдокоде), но это не так:

"Enter": function(){
    if(autocomplete showing) {
      replaceRange()
      return editor.PASS;
    }
  }

Есть ли эквивалент файла editor.PASS, в котором говорится, что для этого ключа используется действие по умолчанию?

1 ответ

Похоже, я сделал одну простую ошибку, опуская объект 'cm' из первой функции >> "Up": function(cm){ скорее, чем "Up": function(){ так что это не было передано.

полный код:

"Up": function(cm){
  if($('.CodeMirror-completions').length > 0) {
    var divSelected = $('.CodeMirror-completions li.selected');
    var next = divSelected.prev('li');
    divSelected.removeClass('selected');
    if (next.length > 0){
      divSelected = next.addClass('selected');
    }
    return editor.PASS;
    }
    CodeMirror.commands.goLineUp(cm);
  }

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

Другие вопросы по тегам