Ace Editor (javascript): запуск события нажатия вкладки для обработчиков событий Ace Editors (не просто вставка '/ t' или пробелов)

Я использую Ace Editor для создания программы воспроизведения кода. Я сохраняю все клавиши, нажимаемые при вводе кода, а затем переигрываю их в Ace Editor. Я закончил сохранять и воспроизводить все вводимые данные с клавиатуры / мыши, но у меня возникают проблемы при воспроизведении нажатий вкладок.

Ace Editor обрабатывает вкладки в текстовой области DOM. Поведение по умолчанию для текстовой области при нажатии клавиши tab - переход к следующему DOM, так что я знаю, что они используют protectDefault () и используют свой собственный обработчик, чтобы разрешить softTab (вставка 1,2,3 или 4 пробелов перед весь выделенный текст).

Моя цель состоит в том, чтобы редактор Ace вызывал событие табуляции - так, чтобы все, что в данный момент выделено в редакторе Ace, было вставлено на правильное количество пробелов. Кто-нибудь знает как это сделать?

Вот список опций, которые я пробовал, и почему они не работают:

Вкладка «Сохранить» нажимает клавишу «keydown», а затем вычисляет значение столбца и вставляет пробелы в это место. НО - это терпит неудачу, когда у вас есть некоторый текст, выделенный наполовину Правильная функциональность должна сдвигать все слово, но это будет просто вставить пробелы в середине слова.Сохраняйте местоположение и клавиши, нажимаемые всякий раз, когда сработает editor.on ('change', some_event_handler), который дает мне именно то, что было введено, и местоположение (идеально подходит для воспроизведения), за исключением того, что он не сообщает мне, была ли нажата вкладка или пробел (он будет срабатывать для и пробел уже обработан). Плюс это все еще вставляет пробелы в месте (потенциально в середине слова вместо сдвига слова) как в числе 1.

Например:

editor.getSession().on('change', function(e) {
    if (handlers) {
        var text = e.data.text;
        if (text == ' ' || text == '  ' || text == '   ' || text == '    ') {
           //FAILS because it doesn't know if its space or a single space tab.
Попробуйте обмануть Ace Editor, чтобы вызвать вкладку, сохранив '/ t' и вставив ее в туз Editor.

Например (код хранения):

function keypress_handler(e) {
    var key = e.which;
    var text = String.fromCharCode(key);
    switch(key) {
        case 9: //Tab
            text = '\t'; // manually add tab
            //Code to store this event for replay later
            break;        
    }

Например (код воспроизведения):

// Assuming the cursor/selection is in the correct position
editor.insert(log.text);

В этот момент я начал задумываться о создании вкладки с нуля (когда сдвигать несколько элементов, если выделено несколько строк, как далеко сдвигаться, как обрабатывать, если слово подсвечивается наполовину при нажатии клавиши Tab), но Ace уже ясно делает это, когда нажата вкладка, поэтому я хотел бы просто вызвать нажатие вкладки. Обычно, чтобы вызвать нажатие вкладки, я бы просто сделал:

// trigger an artificial Tab Keydown event for Ace Editor using jQuery
var tab_press= $.Event('keydown');
tab_press = 9; // Tab keycode
$('.editor').trigger(tab_press);

Но это приводит к результатам без поведения. Какие-либо предложения?

Ответы на вопрос(2)

Ваш ответ на вопрос