Ace Editor (Javascript): Auslösen eines Tab-Press-Ereignisses für Event-Handler von Ace Editors (nicht nur das Einfügen von '/ t' oder Leerzeichen)

Ich benutze Ace Editor, um ein Programm zur Code-Wiedergabe zu erstellen. Ich speichere alle Tasten, die beim Eingeben des Codes gedrückt wurden, und spiele sie dann im Ace Editor ab. Ich habe alle Tastatur- / Mauseingaben gespeichert und wiedergegeben, habe jedoch Probleme beim Wiedergeben von Tabulatortasten.

Der Ass-Editor verwaltet Registerkarten in einem Textfeld-DOM. Das Standardverhalten für ein Textfeld, wenn die Tabulatortaste gedrückt wird, besteht darin, zum nächsten DOM zu wechseln. Ich weiß also, dass sie preventDefault () und ihren eigenen Handler verwenden, um softTab zuzulassen (Einfügen von 1,2,3 oder 4 Leerzeichen zuvor) alle markierten Texte).

Mein Ziel ist es, den Ace-Editor zu veranlassen, das Tabulator-Ereignis auszulösen - so dass alles, was aktuell im Ace-Editor markiert ist, über der richtigen Anzahl von Leerzeichen mit einem Tabulator versehen wird. Weiß jemand, wie man das macht?

Hier ist eine Liste der Optionen, die ich ausprobiert habe und warum sie nicht funktionieren:

Drücken Sie die Tabulatortaste bei gedrückter Taste, berechnen Sie den Spaltenwert und fügen Sie die Leerzeichen an dieser Stelle ein. ABER - dies schlägt fehl, wenn Sie eine Texthälfte markiert haben. Die richtige Funktion sollte das gesamte Wort verschieben, aber dies würde nur Leerzeichen in der Mitte des Wortes einfügen.Speichern Sie die Position und die Tasten, die beim Auslösen von editor.on ('change', some_event_handler) gedrückt wurden. Dies gibt genau an, was eingegeben wurde, und die Position (perfekt für die Wiedergabe), außer es wird nicht angegeben, ob die Tabulatortaste oder die Leertaste gedrückt wurde (es wird für ausgelöst) beide und Leertaste wird bereits behandelt). Außerdem werden an der Stelle weiterhin Leerzeichen eingefügt (möglicherweise in der Mitte eines Wortes, anstatt das Wort zu verschieben), wie in Nummer 1.

Zum Beispiel:

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.
Versuchen Sie, den Ass-Editor zu überlisten, um einen Tabulator auszulösen, indem Sie '/ t' speichern und in den Ass-Editor einfügen.

Zum Beispiel (Speichercode):

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

Zum Beispiel (Wiederholungscode):

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

Zu diesem Zeitpunkt begann ich darüber nachzudenken, ein Tab von Grund auf neu zu erstellen (wenn mehrere Dinge verschoben werden sollen, wenn mehrere Zeilen ausgewählt sind, wie weit verschoben werden sollen, wie damit umgegangen werden soll, wenn ein Wort halb hervorgehoben ist, wenn die Tabulatortaste gedrückt wird), aber Ass schon klar Tut dies, wenn die Tabulatortaste gedrückt wird, so möchte ich nur die Tabulatortaste drücken auslösen. Normalerweise würde ich zum Auslösen einer Tabulatortaste einfach Folgendes tun:

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

Dies führt jedoch zu keinem Verhalten. Irgendwelche Vorschläge?