Ace: 在代码更改时移动断点。

创建于 2013-03-06  ·  4评论  ·  资料来源: ajaxorg/ace

长话短说:如果断点随着代码的变化而移动,那就太好了。

更详细地说:最好有对线条持续存在的线条句柄。 这个功能对于编辑体验来说似乎有点核心,断点和错误消息都应该绑定到行句柄。

最有用的评论

我找到了一个解决方案,但它只适用于我的情况,因为我一次只允许一个断点。 通过一些改进也可以适用于一般情况。
我在编辑器实例上使用了 on change 监听器,并检查了触发事件的操作修改的行数。 如果这些不止一个,我们会遇到添加或删除一行或多行的情况。 事件的动作参数帮助我们了解我们在哪种情况下。
要查看是否必须移动断点,我检查是否在修改的开始行和结束行之间。 如果它在这个范围内,我必须移动。

代码(快速编写)如下:

aceEditor.on("change", function (e) {
                var breakpointsArray = aceEditor.session.getBreakpoints();
                if(Object.keys(aceEditor.session.getBreakpoints()).length>0){
                    if(e.lines.length>1){
                        var breakpoint = parseInt(Object.keys(breakpointsArray)[0]);
                        var lines = e.lines.length -1;
                        var start = e.start.row;
                        var end = e.end.row;
                        if(e.action==='insert'){
                            console.log('new lines',breakpoint, start , end );
                            if(breakpoint>start ){
                                console.log('breakpoint forward');
                                aceEditor.session.clearBreakpoint(breakpoint);
                                aceEditor.session.setBreakpoint(breakpoint + lines);
                            }
                        } else if(e.action==='remove'){
                            console.log('removed lines',breakpoint, start , end);
                            if(breakpoint>start && breakpoint<end ){
                                console.log('breakpoint remove');
                                aceEditor.session.clearBreakpoint(breakpoint);
                            }
                            if(breakpoint>=end ){
                                console.log('breakpoint behind');
                                aceEditor.session.clearBreakpoint(breakpoint);
                                aceEditor.session.setBreakpoint(breakpoint - lines);
                            }
                        }
                    }
                }
            });

希望对某人有所帮助!

所有4条评论

在 cloud9 中,我们使用更改侦听器来更新单独数组中的断点https://github.com/ajaxorg/cloud9/blob/master/plugins-client/ext.debugger/breakpoints.js#L170

由于 ace 使用字符串数组,我不确定如何最好地实现行句柄,或者与行保持同步的完整对象数组,或者使用类似于在 edit_session 中处理折叠线的范围。 棘手的部分是处理正在拆分或合并的行,因为不同类型的行注释需要不同的行为。

我相信您的断点解决方案适用于注释。

棘手的部分是处理正在拆分或合并的行,因为不同类型的行注释需要不同的>行为。

嗯..我无法举出一个例子。 如果你分享一些,我将不胜感激:)

我找到了一个解决方案,但它只适用于我的情况,因为我一次只允许一个断点。 通过一些改进也可以适用于一般情况。
我在编辑器实例上使用了 on change 监听器,并检查了触发事件的操作修改的行数。 如果这些不止一个,我们会遇到添加或删除一行或多行的情况。 事件的动作参数帮助我们了解我们在哪种情况下。
要查看是否必须移动断点,我检查是否在修改的开始行和结束行之间。 如果它在这个范围内,我必须移动。

代码(快速编写)如下:

aceEditor.on("change", function (e) {
                var breakpointsArray = aceEditor.session.getBreakpoints();
                if(Object.keys(aceEditor.session.getBreakpoints()).length>0){
                    if(e.lines.length>1){
                        var breakpoint = parseInt(Object.keys(breakpointsArray)[0]);
                        var lines = e.lines.length -1;
                        var start = e.start.row;
                        var end = e.end.row;
                        if(e.action==='insert'){
                            console.log('new lines',breakpoint, start , end );
                            if(breakpoint>start ){
                                console.log('breakpoint forward');
                                aceEditor.session.clearBreakpoint(breakpoint);
                                aceEditor.session.setBreakpoint(breakpoint + lines);
                            }
                        } else if(e.action==='remove'){
                            console.log('removed lines',breakpoint, start , end);
                            if(breakpoint>start && breakpoint<end ){
                                console.log('breakpoint remove');
                                aceEditor.session.clearBreakpoint(breakpoint);
                            }
                            if(breakpoint>=end ){
                                console.log('breakpoint behind');
                                aceEditor.session.clearBreakpoint(breakpoint);
                                aceEditor.session.setBreakpoint(breakpoint - lines);
                            }
                        }
                    }
                }
            });

希望对某人有所帮助!

我在上面修改了 alessandrocaprarelli 的解决方案以适用于多个断点,可能对其他人有帮助:

editor.on("change", function (e) {
    if (e.lines.length > 1 && (e.action==='insert' || e.action==='remove')){
        const breakpointsArrayOld = editor.session.getBreakpoints();
        let breakpointsArrayNew = [];

        const amountOfLinesAffected = e.lines.length - 1;
        const startRow = e.start.row;
        const endRow = e.end.row;

        for (const key of Object.keys(breakpointsArrayOld)) {
            let breakpointRow = parseInt(key)

            if (e.action==='insert') {  // new lines
                if (breakpointRow > startRow ){
                    // breakpoint forward
                    breakpointsArrayNew[breakpointRow + amountOfLinesAffected] = "ace_breakpoint"
                }
                else {
                    // unaffected by insert
                    breakpointsArrayNew[breakpointRow] = "ace_breakpoint"
                }
            }
            else if (e.action==='remove') {  // removed lines
                if (breakpointRow > startRow && breakpointRow <= endRow ){
                    // breakpoint removed
                }
                else if (breakpointRow >= endRow ){
                    // breakpoint behind
                    breakpointsArrayNew[breakpointRow - amountOfLinesAffected] = "ace_breakpoint"
                }
                else {
                    // unaffected by remove
                    breakpointsArrayNew[breakpointRow] = "ace_breakpoint"
                }
            }
        }

        // remove all old breakpoints
        for (const key of Object.keys(breakpointsArrayOld)) {
            let breakpointRow = parseInt(key)
            editor.session.clearBreakpoint(breakpointRow);
        }

        // add all new breakpoints
        for (const key of Object.keys(breakpointsArrayNew)) {
            let breakpointRow = parseInt(key)
            editor.session.setBreakpoint(breakpointRow);
        }
    }
})
此页面是否有帮助?
0 / 5 - 0 等级