Ace: рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд░реВрдк рдореЗрдВ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд▓реЗ рдЬрд╛рдПрдБред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдорд╛рд░реНрдЪ 2013  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: ajaxorg/ace

рд▓рдВрдмреА рдХрд╣рд╛рдиреА рдХреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдореЗрдВ рдмрддрд╛рдирд╛: рдпрджрд┐ рдХреЛрдб рдмрджрд▓рддреЗ рд╣реА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдЪрд▓рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред

рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдореЗрдВ: рд▓рд╛рдЗрди рд╣реИрдВрдбрд▓ рд╣реЛрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╕рдВрдкрд╛рджрди рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ рдореВрд▓ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ, рдФрд░ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЛрдиреЛрдВ рд▓рд╛рдЗрди рд╣реИрдВрдбрд▓ рд╕реЗ рдмрдВрдзреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕рдВрдкрд╛рджрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдШрдЯрдирд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдпрджрд┐ рдпреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ рддреЛ рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬрдм рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдпрд╛ рд╣рдЯрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдШрдЯрдирд╛ рдХрд╛ рдХреНрд░рд┐рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИрдВред
рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдореИрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрд╢реЛрдзрди рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдкрдВрдХреНрддрд┐ рдХреЗ рдмреАрдЪ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рд╕реАрдорд╛ рдореЗрдВ рд╣реИ рддреЛ рдореБрдЭреЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдХреЛрдб (рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

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

рдЪреВрдВрдХрд┐ рдРрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓рд╛рдЗрди рд╣реИрдВрдбрд▓ рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╛ рддреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦреА рдЧрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рдкреВрд░реА рд╕рд░рдгреА, рдпрд╛ рдПрдбрд┐рдЯ_рд╕реЗрд╢рди рдореЗрдВ рдлреЛрд▓реНрдбрд▓рд╛рдЗрди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╕рдорд╛рди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдЙрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдпрд╛ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЖрдкрдХрд╛ рд╕рдорд╛рдзрд╛рди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдЙрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдпрд╛ рд╡рд┐рд▓рдп рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд▓рд╛рдЗрди рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ> рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рд╣рдореНрдо.. рдореИрдВ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ред рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ :)

рдореБрдЭреЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реВрдВред рдХреБрдЫ рд╕реБрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рднреА рдлрд┐рдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ рд╕рдВрдкрд╛рджрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╢реНрд░реЛрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ рдШрдЯрдирд╛ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рд╡рд╛рд▓реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдпрджрд┐ рдпреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ рддреЛ рд╣рдо рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИрдВ рдЬрдм рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реА рдпрд╛ рд╣рдЯрд╛рдИ рдЬрд╛рддреА рд╣реИрдВред рдШрдЯрдирд╛ рдХрд╛ рдХреНрд░рд┐рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИрдВред
рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдореИрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рдВрд╢реЛрдзрди рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдкрдВрдХреНрддрд┐ рдХреЗ рдмреАрдЪ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдЧрд░ рдпрд╣ рдЗрд╕ рд╕реАрдорд╛ рдореЗрдВ рд╣реИ рддреЛ рдореБрдЭреЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдХреЛрдб (рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ:

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

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдорджрдж рдХреА рд╣реЛрдЧреА!

рдореИрдВрдиреЗ рдХрдИ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдПрд▓реЗрд╕реЗрдВрдбреНрд░реЛрдХреИрдкреНрд░рд╛рд░реЗрд▓реА рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛, рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

akosyakov picture akosyakov  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dimroc picture dimroc  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jakub-zawislak picture jakub-zawislak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

codeofnode picture codeofnode  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

xfix picture xfix  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ