长话短说:如果断点随着代码的变化而移动,那就太好了。
更详细地说:最好有对线条持续存在的线条句柄。 这个功能对于编辑体验来说似乎有点核心,断点和错误消息都应该绑定到行句柄。
在 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);
}
}
})
最有用的评论
我找到了一个解决方案,但它只适用于我的情况,因为我一次只允许一个断点。 通过一些改进也可以适用于一般情况。
我在编辑器实例上使用了 on change 监听器,并检查了触发事件的操作修改的行数。 如果这些不止一个,我们会遇到添加或删除一行或多行的情况。 事件的动作参数帮助我们了解我们在哪种情况下。
要查看是否必须移动断点,我检查是否在修改的开始行和结束行之间。 如果它在这个范围内,我必须移动。
代码(快速编写)如下:
希望对某人有所帮助!