Ace Editor (javascript): acionando um evento de pressionamento de guia para manipuladores de eventos do Ace Editors (não apenas inserindo '/ t' ou espaços)

Estou usando o Ace Editor para criar um programa de repetição de código. Eu guardo todas as teclas pressionadas quando você digita o código e depois as reproduzo no Ace Editor. Concluí o armazenamento e a reprodução de todas as entradas do teclado / mouse, mas estou tendo problemas para reproduzir as prensas da guia.

O Ace Editor lida com guias em um DOM da área de texto. O comportamento padrão de uma área de texto quando a guia é pressionada é mover para o próximo DOM, então eu sei que eles estão usando preventDefault () e usando seu próprio manipulador para permitir softTab (inserção de 1,2,3 ou 4 espaços antes todo o texto destacado).

Meu objetivo é fazer com que o editor Ace acione o evento tab - de modo que o que está destacado no momento no editor Ace seja tabulado sobre o número correto de espaços. Alguém sabe como fazer isso?

Aqui está uma lista de opções que eu tentei e por que elas não funcionam:

A guia Loja pressiona a tecla pressionada, calcule o valor da coluna e insira os espaços nesse local. MAS - isso falha quando você tem algum texto meio destacado. A funcionalidade correta deve mudar a palavra inteira, mas isso apenas insere espaços no meio da palavra.Armazene o local e as teclas pressionadas sempre que o editor.on ('change', some_event_handler) for acionado, o que me fornece exatamente o que foi inserido e o local (perfeito para a reprodução), exceto que não me diz se a guia ou a barra de espaço foi pressionada (será acionada por a barra de espaço e a barra de espaço já estão sendo tratadas). Além disso, isso ainda insere espaços no local (potencialmente no meio de uma palavra em vez de mudar a palavra) como no número 1.

Por exemplo:

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.
Tente enganar o Ace Editor para ativar uma guia armazenando '/ t' e inserindo-o no Ace Editor.

Por exemplo (código de armazenamento):

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;        
    }

Por exemplo (código de reprodução):

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

Nesse ponto, eu estava começando a pensar em construir uma guia do zero (quando mudar várias coisas se várias linhas forem selecionadas, quão longe mudar, como lidar se uma palavra estiver meio destacada quando a tecla for pressionada), mas Ace claramente já faz isso quando a tecla Tab é pressionada, então eu gostaria de acionar a tecla Tab. Normalmente, para acionar um pressionamento de tabulação, eu simplesmente faria:

// 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);

Mas isso causa resultados em nenhum comportamento. Alguma sugestão?