مرحبا بالجميع ،
مع نضوج xterm.js
، أعتقد أن الميزة الرائعة لتوسيع نطاق التطبيقات xterm.js
يمكن أن تكون مفيدة لإضفاء الطابع الرسمي على الوضع بدون رأس. ماذا اقصد؟ حسنًا ، بشكل أساسي ، من أجل القدرة على:
في الوقت الحالي ، الطريقة الوحيدة لـ "ضبط" حالة العميل بشكل موثوق هي إعادة تشغيل مجموعة جميع الأوامر التي أنتجت حالة ذلك المحرر (على الأقل عبر واجهة برمجة التطبيقات العامة). ومع ذلك ، يمكنك بسهولة تخيل رغبتك في القيام بأشياء مثل:
يكون الكثير من هذا ممكنًا في الأساس تقريبًا إذا قمت فقط بتسلسل term.rows
وأعلام الدولة المتنوعة ، لكن اعتماد واجهة برمجة تطبيقات رسمية سيساعد كثيرًا. قد يساعد أيضًا في تحسين قابلية الاختبار وقوة المكتبة الأساسية أيضًا!
أفكار؟
فنسنت
vincentwoo يمكنني أن أرى أن هذا مفيد جدًا ، هل لديك فكرة عن الشكل الذي ستبدو عليه واجهة برمجة التطبيقات؟
أعتقد أنك قد ترغب على الأرجح في مُنشئ آخر مثل term.Headless
، وطريقة جديدة على كل من المحطات الطرفية العادية وغير العادية مثل getState()
والتي يمكن إدخالها بعد ذلك في reset
.
vincentwoo هل ستعمل طريقة ما لتسلسل الحالة على الخادم وإرسالها عبر السلك إلى العميل أيضًا؟ لقد قمت بذلك مؤخرًا حتى لا تحتاج إلى فتح xterm على عنصر ما للاحتفاظ بالمخزن المؤقت ، لذلك قد يكون ذلك كافيًا؟
نعم ، التسلسل هو في الأساس ما أعنيه بـ "getState" ، طالما أن ما يتم إنتاجه يمكن أن يستهلكه العميل.
فيما يتعلق فقط باستخدام xterm العادي بدون عنصر ، فقد ينجح ذلك. يمكنني أن أجربها على العقدة لاحقًا.
أعتقد أن https://github.com/sourcelair/xterm.js/issues/266 يعني أنه يعمل بشكل أساسي بدون رأس قبل استدعاء Terminal.open
.
رائع. أي أفكار حول كيفية عمل الدولة المصدرة؟
يعتمد على ما يجب الاحتفاظ به ، فقط المخزن المؤقت والمؤشر؟
لست متأكدًا من نفسي ، ولهذا السبب كان هذا طلبًا. لا أعرف كيف تبدو آلة الحالة xterm داخليًا ، ولا بالضبط ما تعنيه بكلمة "عازلة" و "مؤشر".
هذا اقتراح رائع @ vincentwoo ، شكرًا! أعتقد أن أفضل جزء منه هو تسلسل الدولة (وهو الجزء الرئيسي من هذا النقاش أيضًا).
IMO بداية جيدة نحو هذا هو تقديم خاصية خاصة (على سبيل المثال تسمى state
) ، حيث سنخزن "بيانات" المحطة مثل:
يجب استخدام هذه الخاصية داخليًا "لتعيين" حالة الجهاز الطرفي في كل مرة (ويتم استشارتها من قِبل الأقسام الداخلية للمحطة لمعرفة ما يحدث عند الحاجة) ، ولكن يجب أن تكون للقراءة فقط بواسطة العالم الخارجي (على سبيل المثال term.getState()
).
ما رأيك؟
يبدو أمرا جيدا لي! لست خبيراً في معرفة بالضبط كل متغير حالة يحدد بشكل فريد حالة xterm.js
، لكنني سعيد بركل الإطارات. أعتقد أن محاولة الخروج بالقائمة واختبارها طريقة رائعة لإيجاد سلوك غريب الأطوار في المكتبة أيضًا.
بعض الأشياء الأخرى التي ربما نريد إجراء تسلسل لها:
parisk كنت أفكر في أن وظيفة getState
أو serialize
ستؤدي التسلسل في تلك المرحلة ، يمكننا وضع كل شيء في كائن json وإرجاع json بسهولة تامة. قد لا تكون كل الولاية التي ذكرتها مملوكة لكائن Terminal ، على سبيل المثال ، يعيش المخزن المؤقت في CircularList
. سيكون من المنطقي أن تخبر CircularList
أن تسلسل نفسها على استدعاء للدالة. شيء من هذا القبيل:
Terminal.prototype.getState() {
const state = {};
// this.serializableComponents is an ISerializable[] which ensures they
// have componentKey/getState()
this.serializableComponents.forEach(c => {
state[c.componentKey] = c.getState();
});
// TODO: Add anything owned by Terminal to state
// ...
return state;
}
// Restore using something like this which would do the reverse
Terminal.prototype.restoreState(state: Object): void;
// A static method that returns a Terminal might be better:
Terminal.restoreTerminal(state: Object): Terminal;
هذا نهج مثير للاهتمام 👍. أنا أقوم بفتح فرع لإجراء هذا الأمر.
هل من تحديث لهذا؟ لدي أيضًا حالة استخدام مماثلة.
نسخ ولصق الاقتراح لإصلاح هذه المشكلة من https://github.com/xtermjs/xterm.js/pull/2213#issuecomment -500233758 أدناه
لقد أجريت محادثة مع jerch حول هذا الأمر ونرى هذه المشكلات في النهج الحالي
بالنظر إلى ذلك ، نعتقد أن أفضل طريقة للتعامل مع هذه الميزة هي استخدام ملحق (مثال xterm-addon-serialize
) يقوم بترتيب الحالة باستخدام واجهة برمجة تطبيقات المخزن المؤقت الجديدة ( Terminal.buffer.*
). يمكن أن تبدو طريقة التسلسل كما يلي:
/**
* Serializes terminal rows into a string that can be written back to the terminal
* to restore the state. The cursor will also be positioned to the correct cell.
* When restoring a terminal it is best to do before `Terminal.open` is called
* to avoid wasting CPU cycles rendering incomplete frames.
* <strong i="16">@param</strong> rows The number of rows to serialize, starting from the bottom of the
* terminal. This defaults to the number of rows in the viewport.
*/
serialize(rows?: number): string;
إذا لم تكن معتادًا على المحطات الطرفية ، فستبدو السلسلة الناتجة مثل هذا "\x1b[Hfoo\n\rbar\x1b[2;4H"
لصف بسيط (حرك المؤشر إلى الصف 1 ، العمود 1 ، اطبع "foo"
، انتقل إلى السطر التالي واطبع "bar"
ثم ضع المؤشر على الصف 2 والعمود 4).
هذا له مجموعة من الفوائد:
لاحظ أن هذا لن يكون قادرًا على دعم اللون أو الأنماط الأخرى حتى نكشف السمات في واجهة برمجة التطبيقات ولكن هذا شيء نريد القيام به ويمكننا تحسينه في وقت لاحق.
تمت إزالة وضع مقطوعة الرأس من العنوان حيث أن xterm.js يدعم ذلك بالفعل من خلال العمل بشكل جيد دون استدعاء open
.
التعليق الأكثر فائدة
هل من تحديث لهذا؟ لدي أيضًا حالة استخدام مماثلة.