Xterm.js: دعم حفظ واستعادة الحالة النهائية

تم إنشاؤها على ١٤ مارس ٢٠١٧  ·  15تعليقات  ·  مصدر: xtermjs/xterm.js

مرحبا بالجميع ،

مع نضوج xterm.js ، أعتقد أن الميزة الرائعة لتوسيع نطاق التطبيقات xterm.js يمكن أن تكون مفيدة لإضفاء الطابع الرسمي على الوضع بدون رأس. ماذا اقصد؟ حسنًا ، بشكل أساسي ، من أجل القدرة على:

  1. قم بتشغيل عميل بدون عارض.
  2. أخبر العميل مع العارض بحالة العميل بدون رأس والعكس صحيح.

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

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

يكون الكثير من هذا ممكنًا في الأساس تقريبًا إذا قمت فقط بتسلسل term.rows وأعلام الدولة المتنوعة ، لكن اعتماد واجهة برمجة تطبيقات رسمية سيساعد كثيرًا. قد يساعد أيضًا في تحسين قابلية الاختبار وقوة المكتبة الأساسية أيضًا!

أفكار؟
فنسنت

help wanted typenhancement

التعليق الأكثر فائدة

هل من تحديث لهذا؟ لدي أيضًا حالة استخدام مماثلة.

ال 15 كومينتر

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 حول هذا الأمر ونرى هذه المشكلات في النهج الحالي

  • سنحتاج إلى الكشف عن API لحفظ / استعادة الحالة ولكننا بالتأكيد لا نريد الالتزام بتنسيق معين ، لذلك من المحتمل أن يؤدي ذلك إلى كسر كل إصدارات قليلة
  • إنه يضيف مجموعة من سخام إلى القلب عندما يستخدمه عدد قليل جدًا من المستخدمين

بالنظر إلى ذلك ، نعتقد أن أفضل طريقة للتعامل مع هذه الميزة هي استخدام ملحق (مثال 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).

هذا له مجموعة من الفوائد:

  • لا يحتاج المستهلكون الذين لا يستخدمونها إلى تحميل الكود
  • يمكن للمستهلكين الذين يستخدمونها تحميل الرمز ديناميكيًا
  • يستخدم واجهة برمجة التطبيقات العامة التي تم الإعلان عنها على أنها مستقرة وتتسلسل إلى تنسيق قياسي يمكن استخدامه على أي محطة
  • إنها تستفيد من كل عمل jerch الرائع لتسريع المحلل اللغوي
  • يتم تعيينه افتراضيًا على منفذ العرض فقط والذي سيكون سريعًا للغاية لإجراء تسلسل واستعادة
  • إنه لا يعقد / ينفخ البنية الأساسية

لاحظ أن هذا لن يكون قادرًا على دعم اللون أو الأنماط الأخرى حتى نكشف السمات في واجهة برمجة التطبيقات ولكن هذا شيء نريد القيام به ويمكننا تحسينه في وقت لاحق.

تمت إزالة وضع مقطوعة الرأس من العنوان حيث أن xterm.js يدعم ذلك بالفعل من خلال العمل بشكل جيد دون استدعاء open .

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

chris-tse picture chris-tse  ·  4تعليقات

jerch picture jerch  ·  3تعليقات

fabiospampinato picture fabiospampinato  ·  4تعليقات

circuitry2 picture circuitry2  ·  4تعليقات

kolbe picture kolbe  ·  3تعليقات