يبدو أن إجمالي حجم المخزن المؤقت يريد أن يكون <viewport rows> + <scrollback>
، ولكن عندما أقوم بتوصيله في vscode ليكون 10
، لاحظت أن مقدار التمرير المتوفر ليس 10 ويبدو أنه يتناوب بين 2 القيم.
عند تشغيل ll
للحصول على جزء كبير من المخرجات ، أحصل على 6 أسطر من التمرير للخلف في المرة الأولى ، و 8 في المرة الثانية ، و 5 في المرة الثالثة ، و 7 في الرابعة ، وما إلى ذلك ، يجب أن تكون 10 أسطر بالضبط في كل مرة.
يبدو أن هذا يحدث بسبب هذا المنطق في scroll
:
if (++this.ybase === this.scrollback) {
this.ybase = this.ybase / 2 | 0;
this.lines = this.lines.slice(-(this.ybase + this.rows) + 1);
}
فيما يلي بعض الملاحظات / الأسئلة:
| 0
)scrollback
scroll
، ألا يجب أن يتم ذلك عندما يتم إلحاق this.lines
؟slice
حدوث مشكلات في الأداء لأنه ينتج مصفوفة جديدة ويتجاهل القديمماذا لو بدلاً من هذا النموذج حيث يتم إعادة بناء Terminal.lines
بشكل مستمر ، قمنا بتنفيذ مصفوفة دائرية وقمنا بتجريد التعقيد داخل الفصل؟ لذا ، دائمًا ما يكون حجم المصفوفة Terminal.rows + Terminal.scrollback
، مما يعني أنه لا توجد إعادة بناء مصفوفة أو shift
ing (والتي يمكن أن تحتوي على مشكلات في المصفوفات الكبيرة بما يكفي) ويتم التعامل مع scrollback
لنا كـ سيتم تجاوز إدخالات المصفوفة القديمة.
قد يكون من الأفضل استخدام Terminal.scrollback
، بهذه الطريقة Terminal.lines
لن تحتاج إلى تغيير حجمها إلا عند تغيير Terminal.scrollback
(على عكس عندما Terminal.rows
يتغير bufferSize
أو bufferLength
إذا قمنا بذلك.
لدي فرع ويب يعمل على تنفيذ هذا النموذج الجديد باستخدام فئة CircularList
، وهو لا يعمل بنسبة 100٪ حتى الآن وسأضعه قيد الانتظار الآن للتركيز على بعض الأشياء الأخرى. https://github.com/Tyriar/xterm.js/tree/361_circular_list_scrollback
Tyriar يسعدني إجراء بعض الاختبارات على فرعك وتقديم ملاحظات إذا كنت تعتقد أن الوقت مناسب 🆗.
إنه مكسور قليلاً حاليًا ، وسيتعين عليك إيجاد بعض الوقت لإنهائه