Ace: Pindahkan breakpoint saat kode berubah.

Dibuat pada 6 Mar 2013  ·  4Komentar  ·  Sumber: ajaxorg/ace

Singkat cerita: akan sangat bagus jika breakpoint bergerak saat kode berubah.

Lebih detail: akan sangat bagus untuk memiliki pegangan garis yang bertahan untuk garis. Fitur ini tampaknya menjadi inti untuk pengalaman pengeditan, dan titik henti sementara dan pesan kesalahan harus diikat ke pegangan baris.

Komentar yang paling membantu

Saya menemukan solusi tetapi hanya berfungsi dalam kasus saya karena saya hanya mengizinkan satu breakpoint sekaligus. Dengan beberapa perbaikan dapat cocok juga untuk kasus umum.
Saya menggunakan pendengar perubahan pada contoh editor dan memeriksa jumlah baris yang dimodifikasi oleh tindakan yang memicu acara. Jika ini lebih dari satu, kita berada dalam kasus ketika satu atau lebih baris ditambahkan atau dihapus. Parameter aksi dari peristiwa membantu kita memahami dalam kasus apa kita berada.
Untuk melihat apakah saya harus memindahkan breakpoint, saya memeriksa apakah ada di antara baris awal dan akhir modifikasi. Jika dalam kisaran ini saya harus pindah.

Kode (ditulis dengan cepat) adalah sebagai berikut:

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

Berharap telah membantu seseorang!

Semua 4 komentar

Di cloud9 kami menggunakan change listener untuk memperbarui breakpoint dalam array terpisah https://github.com/ajaxorg/cloud9/blob/master/plugins-client/ext.debugger/breakpoints.js#L170

Karena ace menggunakan array string, saya tidak yakin cara terbaik untuk mengimplementasikan pegangan garis, baik array penuh objek yang disinkronkan dengan garis, atau menggunakan rentang yang mirip dengan penanganan foldlines di edit_session. Bagian yang sulit adalah penanganan garis yang sedang dipisah atau digabungkan, karena jenis anotasi garis yang berbeda memerlukan perilaku yang berbeda.

Saya percaya bahwa solusi Anda untuk breakpoint akan bekerja dengan baik untuk anotasi.

Bagian yang sulit adalah penanganan garis yang sedang dipisah atau digabungkan, karena jenis anotasi garis yang berbeda memerlukan perilaku > yang berbeda.

Hmm.. Saya tidak bisa membuat satu contoh pun. Saya akan sangat menghargai jika Anda membagikannya :)

Saya menemukan solusi tetapi hanya berfungsi dalam kasus saya karena saya hanya mengizinkan satu breakpoint sekaligus. Dengan beberapa perbaikan dapat cocok juga untuk kasus umum.
Saya menggunakan pendengar perubahan pada contoh editor dan memeriksa jumlah baris yang dimodifikasi oleh tindakan yang memicu acara. Jika ini lebih dari satu, kita berada dalam kasus ketika satu atau lebih baris ditambahkan atau dihapus. Parameter aksi dari peristiwa membantu kita memahami dalam kasus apa kita berada.
Untuk melihat apakah saya harus memindahkan breakpoint, saya memeriksa apakah ada di antara baris awal dan akhir modifikasi. Jika dalam kisaran ini saya harus pindah.

Kode (ditulis dengan cepat) adalah sebagai berikut:

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

Berharap telah membantu seseorang!

Saya memodifikasi solusi alessandrocaprarelli di atas agar berfungsi untuk beberapa breakpoint, mungkin bermanfaat bagi orang lain:

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);
        }
    }
})
Apakah halaman ini membantu?
0 / 5 - 0 peringkat