Ace Editor (javascript): desencadenar un evento de prensa de tabulación para los controladores de eventos de Ace Editors (no solo insertar '/ t' o espacios)

Estoy usando Ace Editor para construir un programa de reproducción de código. Guardo todas las teclas presionadas cuando escribe código, y luego las reproduzco en Ace Editor. He terminado de almacenar y reproducir todas las entradas del teclado / mouse, pero tengo problemas para volver a presionar las pestañas.

Ace Editor maneja pestañas dentro de un DOM de área de texto. El comportamiento predeterminado para un área de texto cuando se presiona la pestaña es moverse al siguiente DOM, por lo que sé que están usando preventDefault () y que usan su propio controlador para permitir softTab (inserción de 1,2,3 o 4 espacios antes todo el texto resaltado).

Mi objetivo es hacer que el editor Ace active el evento de tabulación, de modo que todo lo que esté resaltado actualmente en el editor Ace se tabule sobre el número correcto de espacios. ¿Alguien sabe como hacer esto?

Aquí hay una lista de opciones que he probado y por qué no funcionan:

La pestaña Almacenar presiona la tecla y luego calcula el valor de la columna e inserta los espacios en esa ubicación. PERO: esto falla cuando tienes algo de texto medio resaltado. La funcionalidad correcta debería cambiar la palabra completa, pero esto solo insertaría espacios en el medio de la palabra.Almacene la ubicación y las teclas presionadas cada vez que se active editor.on ('change', some_event_handler), lo que me da exactamente lo que se ingresó y la ubicación (perfecta para la reproducción), excepto que no me dice si se presionó la pestaña o la barra espaciadora (se disparará por ambos y la barra espaciadora ya está manejada). Además, esto todavía inserta espacios en la ubicación (potencialmente en el medio de una palabra en lugar de cambiar la palabra) como en el número 1.

Por ejemplo:

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.
Intenta engañar a Ace Editor para activar una pestaña almacenando '/ t' e insertándola en el Ace Editor.

Por ejemplo (código de almacenamiento):

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 ejemplo (código de reproducción):

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

En este punto, estaba empezando a pensar en construir una pestaña desde cero (cuándo cambiar varias cosas si se seleccionan varias líneas, qué tan lejos cambiar, cómo manejar si una palabra está a medias resaltada cuando se presiona la pestaña), pero Ace claramente ya hace esto cuando se presiona la pestaña, por lo que me gustaría activar la presión de la pestaña. Normalmente para activar una pestaña presionar, simplemente haría:

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

Pero esto causa resultados en ningún comportamiento. ¿Alguna sugerencia?

Respuestas a la pregunta(2)

Su respuesta a la pregunta