王牌编辑器(JavaScript的):用于触发王牌编辑事件处理程序标签按压事件(不只是插入“/ t”

2019-10-20 09:47发布

我使用的王牌编辑器构建一个码重播节目。 我店当你输入代码按下所有按键,然后我重播他们的王牌编辑器。 我已经完成存储和重放所有的键盘/鼠标输入,但我有回放选项卡机的问题。

王牌编辑处理一个textarea DOM中的多个标签。 对于当按下标签textarea中的默认行为是移动到下一个DOM,所以我知道他们正在使用的preventDefault(),并为了让softTab(1,2,3插入,或4个空格前,用自己的处理程序所有突出显示的文本)。

我的目标是使王牌编辑器来触发标签事件 - 例如,无论是目前的王牌编辑聚焦的标签在正确数量的空格。 有谁知道如何做到这一点?

这里有一个选项列表我试过,为什么他们不工作:

  1. 商店标签印刷机上的keydown,然后计算该列的值,并插入在该位置的空间。 但是 - 当你有一些文字一半突出失败。 正确的功能应该转移到整个字,但是这也只是插入空格在单词中间。
  2. 按存放位置和按键每当editor.on(“变化”,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.
  1. 试图欺骗埃斯编辑器通过存储“/ T”并将其插入到所述王牌编辑器来触发一个标签。

例如(存储代码):

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

在这一点上,我开始想从头开始构建选项卡(在转向多的事情,如果选择了多条线路,在多大程度上转移,如何处理如果按下标签当一个字半高亮显示),但王牌显然已经这是否被按下标签时,所以我想只是触发标签印刷机。 通常情况下触发选项卡机,我会简单地做:

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

但是,这会导致没有行为的结果。 有什么建议么?

Answer 1:

我经历的源代码在这里阅读:

https://github.com/ajaxorg/ace/blob/master/lib/ace/commands/default_commands.js

发现下面的代码片段:

{
    name: "indent",
    bindKey: bindKey("Tab", "Tab"),
    exec: function(editor) { editor.indent(); },
    multiSelectAction: "forEach",
    scrollIntoView: "selectionPart"
}

因此,触发选项卡(在所有情况下工作),只需拨打:

editor.indent();

如何令人难以置信的简单 - 希望有一些文件在那里这使很多时间本来可以幸免。



Answer 2:

在ACE中所有从键盘输入的用户经由命令处理。 这是在王牌用于记录和重放宏看到https://github.com/ajaxorg/ace/blob/v1.1.4/lib/ace/commands/command_manager.js#L52-L96 。

如果你想记录用户输入,然后重播,你可以使用

// record
commands=[]
editor.commands.on("afterExec", function(e) {
   commands.push({name: e.command.name, args: e.args})
});

// replay
commands.forEach(function(e) {editor.execCommand(e.name, e.args)})

捕获鼠标输入有一些技巧,但问题似乎你已经知道如何做到这一点。

这拉要求具有一定的相关提问。 它允许通过调用模仿用户输入simulateKeys("a", "b", "ctrl-Left", "Tab")



文章来源: Ace Editor (javascript): Triggering a tab press event for Ace Editors event handlers (not just inserting '/t' or spaces)