Ace: نقل نقاط التوقف مع تغير التعليمات البرمجية.

تم إنشاؤها على ٦ مارس ٢٠١٣  ·  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 يستخدم مصفوفة من السلاسل ، فأنا لست متأكدًا من أفضل طريقة لتنفيذ مقابض الخطوط ، سواء كانت مجموعة كاملة من الكائنات متزامنة مع الخطوط ، أو استخدام نطاقات مشابهة للتعامل مع خطوط الطيات في جلسة التحرير. الجزء الصعب هو التعامل مع الأسطر التي يتم تقسيمها أو دمجها ، نظرًا لأن الأنواع المختلفة من التعليقات التوضيحية للسطر تحتاج إلى سلوك مختلف.

أعتقد أن حلك لنقاط التوقف سيعمل بشكل جيد مع التعليقات التوضيحية.

الجزء الصعب هو التعامل مع الأسطر التي يتم تقسيمها أو دمجها ، نظرًا لأن الأنواع المختلفة من التعليقات التوضيحية للسطر تحتاج إلى سلوك مختلف.

حسنًا .. لا يمكنني اختلاق مثال واحد. سأكون ممتنا إذا قمت بمشاركة بعض :)

لقد وجدت حلاً ولكنه يعمل فقط في حالتي لأنني أسمح بنقطة توقف واحدة فقط في وقت واحد. مع بعض التحسينات يمكن أن تناسب أيضًا الحالة العامة.
لقد استخدمت أداة الاستماع عند التغيير في نسخة المحرر وتحققت من عدد الأسطر التي تم تعديلها بواسطة الإجراء الذي أطلق الحدث. إذا كانت هذه أكثر من سطر ، فنحن في حالة إضافة أو إزالة سطر واحد أو أكثر. تساعدنا معلمة الإجراء الخاصة بالحدث على فهم هذه الحالة.
لمعرفة ما إذا كان يتعين علي نقل نقطة (نقاط) التوقف ، أتحقق مما إذا كانت تقع بين صف البداية والنهاية للتعديل. إذا كان في هذا النطاق ، يجب أن أتحرك.

الكود (مكتوب بسرعة) هو كالتالي:

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 التقييمات