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 .

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ace ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ массив строк, я Π½Π΅ ΡƒΠ²Π΅Ρ€Π΅Π½, ΠΊΠ°ΠΊ Π»ΡƒΡ‡ΡˆΠ΅ всСго Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ дСскрипторы строк, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², синхронизированный с линиями, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π»ΠΈΠ½ΠΈΠΉ сгиба Π² edit_session. Π‘Π»ΠΎΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° раздСляСмых ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌΡ‹Ρ… строк, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ строк трСбуСтся Ρ€Π°Π·Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ, Ρ‡Ρ‚ΠΎ вашС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для Ρ‚ΠΎΡ‡Π΅ΠΊ останова Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ для Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ.

Π‘Π»ΠΎΠΆΠ½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ являСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ строк трСбуСтся Ρ€Π°Π·Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π₯ΠΌ.. Π― Π½Π΅ ΠΌΠΎΠ³Ρƒ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π― Π±Ρ‹Π» Π±Ρ‹ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚Π΅Π»Π΅Π½, Ссли Π±Ρ‹ Π²Ρ‹ подСлились Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ :)

Π― нашСл Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠ΅ΠΌ случаС, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ я Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ Ρ‚ΠΎΡ‡ΠΊΡƒ останова. Π‘ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ΄ΠΎΠΉΡ‚ΠΈ ΠΈ для ΠΎΠ±Ρ‰Π΅Π³ΠΎ случая.
Π― использовал ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² экзСмплярС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ» количСство строк, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… дСйствиСм, Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ событиС. Если ΠΈΡ… большС ΠΎΠ΄Π½ΠΎΠΉ, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ с Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ»ΠΈ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… строк. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ дСйствия события ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ случаС ΠΌΡ‹ находимся.
Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΌΠ½Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ (Ρ‚ΠΎΡ‡ΠΊΠΈ) останова, я ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽ, находится Π»ΠΈ ΠΎΠ½Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ строкой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Если ΠΎΠ½ находится Π² этом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅, я Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ.

Код (быстро написанный) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

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 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ