Cider: يتم قفل CIDER عند طباعة سلاسل كبيرة

تم إنشاؤها على ٥ يونيو ٢٠١٥  ·  56تعليقات  ·  مصدر: clojure-emacs/cider

لقد ضحت مؤخرًا بالعديد من Emacsen لطباعة الإقفال. إما بسبب أوقات نقل شبكة nREPL أو مشكلات الأداء المعروفة لدى Emacs مع الأسطر الطويلة ، فمن الممكن أن يقوم بديل CIDER بتجميد Emacs تمامًا بحيث لا يمكن حتى أن يقوم (kbd C-c C-c) أو (kbd C-c C-b) بإيقاف الطباعة في تقدم. من الواضح أن قتل Emacs يمثل تقلصًا كبيرًا في سير عملي وسيكون رائعًا إذا لم يحدث هذا.

<3

bug stale

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

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

الآن في الرد ، لدي سطر إخراج واحد بأكثر من مليون حرف ، وببساطة فإن الترحيل للخلف باستخدام M-v يستغرق حوالي 0.8 ثانية لكل ضغطة مفتاح. هذا دون استدعاء أي وظيفة عصير التفاح على الإطلاق.

عندما أستخدم cider-repl-return يظهر التتبع أنه تم استدعاء cider-repl--show-maximum-output ثلاث مرات ، وداخل هذه الوظيفة يوجد استدعاء لـ recenter (وهو مكتوب بالمصادفة في c وبالتالي حيث توقف ملف التعريف -انتهى) أيضًا حوالي 0.8 ثانية لكل استدعاء. هذا يعني ببساطة أن التقييم سيستغرق 2-3 ثوانٍ - وهذا بعيدًا عن وقت التقييم نفسه.

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

كعلاج قصير المدى ، أوصي الأشخاص بتعطيل القرص الدوار ، وكذلك التفكير في تعطيل سلوك التمرير التلقائي:

(setq cider-repl-scroll-on-output nil)
(setq cider-show-eval-spinner nil)

ال 56 كومينتر

قد تكون مرتبطة بالرقم 228. يجب أن تحل هذه المشكلة حالة موثوقة ووقتًا ممتعًا مع مصحح الأخطاء / برنامج التعريف.

arrdem حول المفاتيح التي ذكرتها ، هل جربت C-g أيضًا؟

bbatsov يشتهر Emacs بكونه بطيئًا في قفل الخطوط الطويلة. أود أن أقول إن أول شيء يجب تجربته هو عدم قفل سلسلة الإخراج إذا كانت طويلة جدًا (لا أعرف ما إذا كان هذا قد تم تجربته بعد).

Malabarba أود أن أوافق على أن هذا من المرجح أن يكون مشاكل الخطوط الطويلة المختلفة لدى Emacs أكثر من CIDER في مزيد من المراجعة. C-g يُغلق عند مواجهة هذا.

لا أعتقد أن المشكلة تتعلق فقط بقفل الخط ، على الرغم من أنه من المحتمل أن يتم تعطيل قفل الخطوط للحصول على نتائج أكبر. هناك شيء خاطئ يحدث في REPL فيما يتعلق بالإخراج - نتيجة / ناتج أكبر ويصبح غير قابل للاستخدام تقريبًا. وكان هذا يحدث قبل إدخال قفل الخطوط "الهوى" للنتائج والمخرجات.

حول المفاتيح التي ذكرتها ، هل جربت Cg أيضًا؟

لقد تمكنت سابقًا من إيقاف هذا عن طريق إرسال بريد عشوائي إلى Cg مع مقاطعة عصير التفاح ، لكن الأمر استغرق وقتًا طويلاً قبل أن يسجل رغبتي في أن تنفجر هذه العملية وتموت.

arrdem Btw ، هل تواجه هذه المشكلة فقط في REPL أو لنتائج التقييم التفاعلي أيضًا؟

أكد هذا

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

لا أعتقد أن الأمر يتعلق بـ REPL ، إنها نفس مشكلة الخطوط الطويلة emacs ، أو مرتبطة بطريقة ما بها. يدرج المخزن المؤقت REPL النتيجة بدون أسطر جديدة. على سبيل المثال ، إذا قمت بإجراء cider-eval-last-sexp ، فيمكنني إرسال بريد عشوائي على C-g عدة مرات لمقاطعة العملية. لكن إذا جربت cider-eval-last-sexp-and-replace ، فسيكون الموقف هو نفسه ، مثلما قمت بتقييمه في المخزن المؤقت لـ REPL - لا يمكنني المقاطعة ... لقد حاولت slurp 1,5M binary ، وبعد الانتظار بعض الوقت مع Emacs المجمد ، رأيت النتيجة - نتيجة طويلة في REPL ، و Emacs متأخر بسببها. لذا ، فإن المشكلة قابلة للتكرار ليس فقط في المخزن المؤقت REPL.

سأحاول اختبار المقاطعة بنص كبير ولكن بدون أسطر طويلة.

أواجه هذه المشكلة أيضًا على أساس أسبوعي أو نحو ذلك. مزعج جدا.

شيء واحد يجب ملاحظته هو أنه يتحسن (على سبيل المثال ، يظل emacs أكثر استجابة قليلاً) ، عندما يتم تعيين truncate-lines على t . يؤدي هذا إلى تعطيل التفاف الخط المرئي.

إذا كانت الأسطر الجديدة المفقودة هي المشكلة ، فإن الحل البسيط هو استخدام clojure.pprint / pprint لطباعة القيمة الناتجة. كيف يمكنني تغيير رد (عصير التفاح) للقيام بذلك؟

ههههههههههه

M-x cider-repl-toggle-pretty-printing RET

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

عيد ميلاد سعيد متأخر لهذه القضية>.>

أنا شخصياً أتفق مع zarkone ، فقد تكون هذه مشكلة Emacs المعروفة مع الخطوط الطويلة للغاية. يستحق الاختبار لمعرفة ما إذا كان هذا _ أسوأ _ من ذلك ، على الرغم من حقيقة أنه من الممكن الهروب من هذا الانقطاع باستخدام kbd C-g يشير إلى أنه قد يكون جزءًا من رمز REPL ، بدلاً من تقديم Emacs أو رمز تنفيذ المخزن المؤقت.

راجع للشغل ، هل لدينا بعض بيانات التنميط بخصوص هذا؟ سيكون من الجيد معرفة ما يجب أن نهدف إلى الإسراع / التحسين ...

حتى مع تبديل الخطوط المقطوعة وطباعة cider-repl-toggle-pretty-printing ، فقد عادت هذه المشكلة إلى الظهور مع أخطاء المواصفات. لا توجد طريقة لطباعة هذه الأشياء بشكل جميل ، وإذا كان: arg أو: ret هي بنية بيانات ضخمة ، فإن emacs يموت.

sooheon هل يمكنك إعطاء مثال على مثل هذا الخطأ في المواصفات؟

gganley فقط قم بإنشاء مواصفات تتطلب على سبيل المثال int ، ثم مررها على خريطة clojure ضخمة. ستتم طباعة الخريطة بأكملها لإظهار القيمة الخاطئة.

قضاء بعض الوقت في ملف التعريف مع عصير التفاح (سيد https://github.com/clojure-emacs/cider/commit/18ed7615245a3ece51215d3ddc9332feb58971f2) على Emacs 25.3.

في Emacs ، قم بالتبديل

(toggle-truncate-lines)
(cider-repl-toggle-pretty-printing)

في الرد ، قم بتعطيل

(set! *print-length* nil)
(set! *print-level* nil)

إخراج خط طويل

ابدأ ملف التعريف. توليد خط طويل في الرد

(range 10000)

هذا هو ملف تعريف الذاكرة

screen shot 2018-03-10 at 8 00 28 am

وملف تعريف وحدة المعالجة المركزية

screen shot 2018-03-10 at 8 00 46 am

ملاحظات:

  • يمكن تعطيل cider-repl-show-maximum-output باستخدام (setq cider-repl-scroll-on-output nil) . يؤدي التعطيل إلى التخلص من معظم الوقت المدقع واستخدام الذاكرة.
  • لا شيء يعزى إلى قفل الخط؟

تأخير عند وجود خطوط طويلة في REPL

الآن بعد أن وجد هذا الخط الطويل في REPL ، هناك تأخر مألوف. بمجرد كتابة "رجوع" في رسالة المطالبة ، تحصل على قرص دوار [=== ] ، وتقوم Emacs بتثبيت وحدة المعالجة المركزية بنسبة 100٪ ، ويبدو أن هذا يتوقف إلى ما لا نهاية

screen shot 2018-03-10 at 8 19 55 am

اكتشفت أنه يمكنني مقاطعة هذا التعليق عن طريق كتابة أي بادئة يعرفها which-key كيفية إكمالها ، مثل C-x أو M- أو أيًا كان. عند هذه النقطة تعود المطالبة على الفور .

في ملف التعريف الذي يبدو مثل هذا. سأقوم بكتابة return ، وانتظر بضع ثوانٍ ، واكتب M- ثم C-g لإلغاء النافذة المنبثقة which-key .

screen shot 2018-03-10 at 8 36 49 am

screen shot 2018-03-10 at 8 36 57 am

لست مقتنعًا أن ido-kill-buffer له علاقة بهذا. إذا قمت باستدعاء swiper عند الاستدعاء أثناء دوران القرص الدوار ، متبوعًا بـ M- لإيقاف القرص الدوار ، فإن الملف الشخصي سيبدو هكذا.

screen shot 2018-03-10 at 8 42 10 am

يمكن تعطيل cider-repl-show-max-output باستخدام (setq cider-repl-scroll-on-output nil). يؤدي التعطيل إلى التخلص من معظم الوقت المدقع واستخدام الذاكرة.

ولكن على حساب الآن التمرير إلى نهاية طويلة الإخراج. :-)

الآن بعد أن وجد هذا الخط الطويل في REPL ، هناك تأخر مألوف. بمجرد كتابة "رجوع" عند المطالبة ، تحصل على [===] القرص الدوار ، ويقوم Emacs بتثبيت وحدة المعالجة المركزية بنسبة 100٪ ، ويبدو أن هذا يتوقف إلى أجل غير مسمى

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

بالنسبة للإصلاح ، كنت أفكر في ما يلي:

يتم بث النتائج والمخرجات في أجزاء بواسطة nREPL (راجع https://github.com/clojure-emacs/cider/blob/master/cider-repl.el#L805). يمكننا ببساطة إضافة عدادات تشغيل بحجم النتيجة / المخرجات حتى الآن وعندما تصل إلى حد أقصى يمكننا أن نعرض على المستخدمين اقتطاع النتيجة الطويلة (وربما عرض من ينتج عنه مخزن مؤقت مخصص يمكن التخلص منه. يمكننا أيضًا اقترح على المستخدمين إزالة آخر إخراج / نتيجة بعد طباعته إذا كان شيئًا كبيرًا.

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

أوه ، الذي يذكرني. لقد اكتشفت أنه يمكنني مسحه بواسطة M-< إلى الأعلى ثم مسح المخزن المؤقت من هناك. هذه هي الطريقة التي أعيد بها بين الاختبارات. . تجاهل هذا. كنت مجرد كثيفة.

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

حسنًا ، لسبب ما يؤدي إلى إجراء تقييم (للسطر الجديد؟) ، انظر هنا

)
(-->
  id         "42"
  op         "eval"
  session    "3a9eedb7-77e7-48d0-840a-0e2c3f789dce"
  time-stamp "2018-03-10 11:48:54.055113000"
  code       "
"
  column     7
  file       "*cider-repl localhost*"
  line       57
  ns         "user"
)
(<--
  id         "42"
  session    "3a9eedb7-77e7-48d0-840a-0e2c3f789dce"
  time-stamp "2018-03-10 11:49:13.510875000"
  status     ("done")
)
(<--
  id                 "42"
  session            "3a9eedb7-77e7-48d0-840a-0e2c3f789dce"
  time-stamp         "2018-03-10 11:49:13.511287000"
  changed-namespaces (dict)
  repl-type          "clj"
  status             ("state")
)

سأذهب لتعقب ذلك.

إذن ، هذا ما أجده حول التأخر عند وجود خطوط طويلة في REPL . إذا شاهدت المخزن المؤقت *nrepl-messages...* أثناء فترات التأخير الطويلة هذه ، فأنا أرى فقط رسالة "Eval" الصادرة ولكن لا أرى أي استجابة. فقط عندما أقوم بتشغيل إكمال which-key كما هو مذكور من قبل ، فأخيرًا أرى رسائل مرتجعة تحتوي على نتيجة التقييم و "تم" و "الحالة". أقوم بتقييم ثوابت الأعداد الصحيحة البسيطة مثل "1" ، لذلك لا يوجد سبب يجب أن تستغرق التقييمات أي وقت على الإطلاق.

حسنًا ، هذا غريب للغاية. قد يكون مرتبطًا بطريقة ما بحقيقة أن المخزن المؤقت لـ REPL هو أيضًا مخزن الاتصال المؤقت ، لكن لا يمكنني التفكير في سبب توقف معالجة الاستجابات واستمرارها عند كتابة شيء ما.

بطريقة ما تتعلق بالغزل نفسه. لقد جربت للتو (setq cider-show-eval-spinner nil) مع كل شيء آخر كما هو موضح سابقًا (بما في ذلك سطر الإخراج الطويل في المخزن المؤقت للإعادة) ، وحتى الآن لا يمكنني إعادة إنتاج التعليق. @ Malabarba ، هل هناك أي أفكار هنا؟

عندما تقول أنه لا يوجد "تعليق" ، فأنت تعني أنه يتم تسجيل البيانات على الفور في مخزن الرسائل المؤقت ويتم عرض النتيجة على الفور في REPL ، أليس كذلك؟

بالنظر إلى الوقت الذي أرسل فيه

متابعة هذا باهتمام كبير. شكرًا جزيلاً على العمل التفصيلي @ gonewest818

إذا كان هذا هو السبب ، فهناك بعض السخرية الرهيبة في حقيقة أن قرص التحميل يتسبب في حدوث تعليق.

عندما تقول أنه لا يوجد "تعليق" ، فأنت تعني أنه يتم تسجيل البيانات على الفور في مخزن الرسائل المؤقت ويتم عرض النتيجة على الفور في REPL ، أليس كذلك؟

حق. ويطبع بيان الطباعة الخاص بي في معالج الرسالة للإعادة أيضًا.

مع إيقاف التشغيل ، يمكنني القيام بأشياء مثل (range 100000) في الرد وما زلت أتفاعل بمجرد وجود هذا الخط في البديل. الرد أبطأ قليلاً ولكنه لا يزال قابلاً للاستخدام. من المحتمل أن يكشف التنميط عن شيء يتعلق بمعالجة المخزن المؤقت. على سبيل المثال ، cider-repl-return calls cider-repl—show-maximum-output .

موافق. لا أعتقد أن Malabarba تعمل على الدوار بعد الآن ، لذلك ربما يتعين علينا إزالته. إنها ليست مشكلة كبيرة أن نعيش بدونها ، ويمكننا دائمًا إضافة شيء محلي إلى النموذج إذا قررنا ذلك.

حسنًا ، لكن قبل أن أفعل ذلك. يعمل القرص الدوار كحلقة غير محجوبة (تذكر أن Emacs يثبّت وحدة المعالجة المركزية بنسبة 100٪؟) مما يشير إلى أن تحديث القرص الدوار قد يستغرق وقتًا أطول من معدل الإطارات.
في الاختبار الذي أجريته ، يمكنني استخدام which-key لمقاطعة الحلقة ، وأنا أعلم تحت الغطاء أن which-key يستخدم مؤقتات مماثلة. يبدو أن هذا أكثر من مجرد مصادفة.

سأحاول إبطاء معدل الإطارات للدوران ، وأيضًا تحديد ما يحدث عندما يُطلب من النموذج إعادة الرسم.

تبدو فكرة جيدة!

في الثلاثاء ، 13 مارس 2018 الساعة 01:33 ، كتب نيل أوكاموتو [email protected] :

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

سأحاول إبطاء معدل الإطارات للدوران ، وأيضًا
تحديد ما يحدث عندما يُطلب من النموذج إعادة الرسم.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/clojure-emacs/cider/issues/1115#issuecomment-372417058 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/AAGVyljLLD7HsPcD4DyyNNvtZUfoAZ_Gks5tdr9jgaJpZM4E58Wa
.

>

تحياتي الحارة،
بوزيدار باتسوف

http://www.batsov.com

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

الآن في الرد ، لدي سطر إخراج واحد بأكثر من مليون حرف ، وببساطة فإن الترحيل للخلف باستخدام M-v يستغرق حوالي 0.8 ثانية لكل ضغطة مفتاح. هذا دون استدعاء أي وظيفة عصير التفاح على الإطلاق.

عندما أستخدم cider-repl-return يظهر التتبع أنه تم استدعاء cider-repl--show-maximum-output ثلاث مرات ، وداخل هذه الوظيفة يوجد استدعاء لـ recenter (وهو مكتوب بالمصادفة في c وبالتالي حيث توقف ملف التعريف -انتهى) أيضًا حوالي 0.8 ثانية لكل استدعاء. هذا يعني ببساطة أن التقييم سيستغرق 2-3 ثوانٍ - وهذا بعيدًا عن وقت التقييم نفسه.

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

كعلاج قصير المدى ، أوصي الأشخاص بتعطيل القرص الدوار ، وكذلك التفكير في تعطيل سلوك التمرير التلقائي:

(setq cider-repl-scroll-on-output nil)
(setq cider-show-eval-spinner nil)

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

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

عندما أقوم في الواقع بإرجاع عصير التفاح ، يظهر التتبع cider-repl - show-max-output تم استدعاءه ثلاث مرات ، وداخل هذه الوظيفة يوجد استدعاء لإعادة التوسيط (والذي يتم كتابته بالمصادفة في c وبالتالي حيث توجد نهايات نهائية لملف التعريف ) أيضًا حوالي 0.8 ثانية لكل طلب. هذا يعني ببساطة أن التقييم سيستغرق 2-3 ثوانٍ - وهذا بعيدًا عن وقت التقييم نفسه.

أتساءل عما إذا كان بإمكاننا استبدال السلوك الحالي بالتمرير فقط إلى نهاية المخزن المؤقت. ولكن على أي حال - يبدو لي أنه يجب أن يكون هناك إعادة مركز واحد فقط ، وليس 3. لا تتذكر الكثير عن هذا الرمز ، مثل الكثير من REPL ، قمنا بنسخه / لصقه من SLIME وقمنا بتعديله إلى الحد الأدنى.

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

أعتقد أن السؤال الوحيد المتبقي هو ما إذا كان يجب إجراء اقتطاع من جانب الخادم أو جانب العميل.

كنت أفترض أن الاقتطاع هو جانب العميل حيث أن هناك احتمال أن يكون للتقييم أثر جانبي ..؟

Hummm لقد تمكنت من إعادة تمثيل هذا السلوك باستخدام spinner.el ، في *scratch* القيام بـ (progn (start-spinner) (dotimes (i 100000) (insert-string "a")) (insert-string "\n\n") (stop-spinner)) والذي يستغرق حوالي 7 ثوانٍ وبالتأكيد تعليق emacs طوال المدة. في ظل وجود خطوط طويلة ، يبدو أن الدوار يساهم بشكل كبير في تأخر Emacs إذا سُمح له بالاستمرار ولكني لم أبذل جهدًا للبحث في السبب.

Hummm لقد تمكنت من إعادة تمثيل هذا السلوك باستخدام spinner.el

الكود الذي كتبته لإدخال "a" 100،000 مرة سيغلق Emacs لبعض الوقت حتى بدون غزل ، لذلك لست متأكدًا مما يفترض أن يوضحه.

كنت أفترض أن الاقتطاع هو جانب العميل حيث أن هناك احتمال أن يكون للتقييم أثر جانبي ..؟

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

FWIW هذه مشكلة معروفة مع إعادة عرض emacs عند وجود خطوط طويلة. يحدث في جميع المخازن المؤقتة وهو أسوأ بكثير مع عدم وجود خطوط مقطوعة. ما عليك سوى نسخ إخراج الاستبدال إلى مخزن مؤقت أساسي ويجب أن تلاحظ بطء التحرير. الحل الوحيد (في رأيي) هو اقتطاع الأسطر الطويلة في مرشح العملية.

سبينر ليس السبب الجذري. يقوم فقط بتشغيل إعادة العرض 10 مرات في الثانية. يؤدي تعيين fps إلى 1 إلى إزالة المشكلة.

كبديل للغزل الذي يجعل آخر موجه REPL يعمل باللون الأحمر ، ولكن من فضلك لا تتركنا بدون مؤشر Eval.

تتمثل الميزة الطفيفة للنهج من جانب الخادم في أنه سيقلل من البيانات التي نرسلها إلى Emacs (وعلينا فك تشفيرها) ويمكن للعملاء الآخرين الاستفادة من ذلك.

إنها ميزة كبيرة على أجهزة التحكم عن بعد. تتمثل إحدى مشكلات جانب الخادم في أنه قد يحتاج المرء إلى إدارة التخزين المؤقت. تخزين كل المخرجات حتى الآن لا معنى له. كما أنني لست متأكدًا من أن هذا ينطبق على *cider-results* . يمكن للعميل تعليقها لبعض الوقت وقد يكون مسح ذاكرة التخزين المؤقت من جانب الخادم أمرًا غير سار.

هذا بالتأكيد لا ينبغي أن ينطبق على *cider-results* . يجب بالتأكيد استخدامه في REPL ، وربما للتقييمات التفاعلية أيضًا.

تتمثل إحدى مشكلات جانب الخادم في أنه قد يحتاج المرء إلى إدارة التخزين المؤقت. تخزين كل المخرجات حتى الآن لا معنى له.

كنت أفكر في تخزين النتائج / المخرجات التي تتجاوز بعض الحدود ، ولكن ربما يمكننا قصر ذلك على النتيجة الأخيرة فقط. تكمن مشكلة عدم تخزين كل شيء (سواء من جانب العميل أو الخادم) في أنك لن تتمكن من توسيع جميع النتائج / المخرجات المقتطعة.

أراهن أن الناس يريدون الوصول إلى نتائج N الأخيرة ، حيث قد لا تكون N "كل نتيجة في جميع الأوقات" ولكن يبدو من المحتمل أن N أكبر من 1 بالنسبة لمعظم الأشخاص.

يقترح لي أن إخلاء ذاكرة التخزين المؤقت يجب أن يوجهه العميل. ثم يكون العميل حرًا في تنفيذ سياسة "النافذة المنزلقة" باستخدام N القابل للتكوين ، واحتفظ بالنتيجة الأخيرة فقط (N = 1) ، واسمح "بتثبيت" النتائج المحددة بغض النظر عن مكانها في السجل ، وتعطيل التخزين المؤقت تمامًا (N = 0) إذا كان لا يريد أن يتضايق ، إلخ.

fwiw أنا أعمل على هذا. لديّ نموذج أولي للبرمجيات الوسيطة التي تعترض الاستجابات التي تحتوي على "قيمة" أو "pprint-out" وتقطع تلك السلاسل إذا تجاوز طولها حدًا معينًا. تحتفظ البرمجيات الوسيطة بخريطة تجزئة للسلاسل كاملة الطول والتي يمكن استرجاعها أو إزالتها عبر عمليات تشغيل البرامج الوسيطة.

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

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

يبدو رائع! 👍

fwiw أنا أعمل على هذا. لديّ نموذج أولي للبرمجيات الوسيطة التي تعترض الاستجابات التي تحتوي على "قيمة" أو "pprint-out" وتقطع تلك السلاسل إذا تجاوز طولها حدًا معينًا. تحتفظ البرمجيات الوسيطة بخريطة تجزئة للسلاسل كاملة الطول والتي يمكن استرجاعها أو إزالتها عبر عمليات تشغيل البرامج الوسيطة.

يجب أن تفكر أيضًا في مفاتيح out و err .

مجرد اعتبار واحد صغير - يجب أن يكون هناك بعض العمليات لتشغيل الاعتراض وإيقافه. أفترض أن الجميع سيرغب في ذلك ، ولكن قد تحتوي النسخة المبكرة على بعض الأخطاء وسيكون من الجيد أن يتمكن المستخدمون من التعامل مع هؤلاء دون الحاجة إلى التدخل في ناقل البرامج الوسيطة.

"pprint-out" واقتطاع تلك السلاسل إذا تجاوز طولها بعض العتبة.

هل يتعلق الأمر بقطع طول الخطوط الفردية أم الناتج بالكامل؟ إذا كان الأخير ، فسيكون من الجيد استبعاد الجزء الأوسط من الإخراج ، مع الاحتفاظ بالبداية والنهاية للتفتيش. مفيد بشكل خاص لأوامر مثل cider-pprint-eval-last-sexp .

شكرا لعملك على هذا!

bbatsov - يتم تعطيل البرامج الوسيطة إذا كان طول الحد صفر.

vspinu أوافق ، هذه ستكون مفيدة. إنه حاليًا يقطع النتيجة بأكملها ، وأعني بذلك أنه يقطع السلسلة الناتجة بشكل أعمى بالطول المحدد. لا يوجد أي ذكاء آخر متضمن: لا يوجد منطق لإلغاء عناصر المجموعة بطريقة منطقية ، ولا محاولة لطي هياكل البيانات المتداخلة ، ولا حتى محاولة الحفاظ على أقواس الإغلاق. سأنهي تمريرة بهذا المخطط المبسط وأتأكد من أن الميكانيكا سليمة. قد أضطر إلى حفظ أي نوع من "elision" المعقدة لإصدار لاحق.

@ gonewest818 شيء يجب مراعاته عند عدم الحفاظ على البنية هو أن أي شخص لديه Smartparens أو lispy أو ما شابه ممكّن سيواجه على الأرجح الكثير من التأخير حيث يحاول المكون الإضافي البحث عن أزواج مطابقة.

نقطة جيدة.

في 26 مارس 2018 ، الساعة 1:49 صباحًا ، كتب Sooheon Kim [email protected] :

@ gonewest818 شيء يجب مراعاته عند عدم الحفاظ على البنية هو أن أي شخص لديه Smartparens أو lispy أو ما شابه ممكّن سيواجه على الأرجح الكثير من التأخير حيث يحاول المكون الإضافي البحث عن أزواج مطابقة.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو اعرضها على GitHub ، أو قم بكتم صوت الموضوع.

شاهدت للتو هذا https://twitter.com/CursiveIDE/status/1023508436443529216 وتم تذكيرك بهذه التذكرة. @ gonewest818 إذا لم يكن لديك الوقت توليه ولن يضيع العمل. هذا بالتأكيد ليس مصدر قلق ملح ، لأن أيدينا مليئة بالمهام الأخرى ، لكنني أعتقد أنه سيكون من الرائع أن يتم التعامل مع شيء مثل هذا مباشرة في nREPL نفسها. والآن أصبح هذا ممكنًا أخيرًا. :-)

فقط تعليق واحد من جانبي

أقوم ببعض أنواع البرمجة اللغوية العصبية باستخدام clojure ، لذا فإن هياكل البيانات الخاصة بي بحكم التعريف طويلة جدًا.
أنا أعمل عليها ، بشكل عام ، بنجاح كبير باستخدام "شبح" وطباعة قطع وملخصات البيانات فقط.

ولكن في كل مرة يظهر فيها خطأ نحوي في تعبير الرد الخاص بي (مثل الأقواس المفقودة) ،
يحاول cider طباعة بنية البيانات بالكامل ، والتي دائمًا ما تتوقف عن استخدام emacs.

هذا مزعج جدا

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

بالنسبة لي ، سيكون من المقبول أن "تقطع" النتيجة "الطويلة" في المنتصف ، دون الالتفات إلى البنية.

لتوضيح انظر هذا:

يحتوي المقتطف التالي على أقواس غير متطابقة:

(sp/select [sp/FIRST :experts sp/FIRST (sp/submap [:name  :cv-text  :doi-text]
                                                                       ] {:nonsense 123})
                                )

محاولة تقييم هذا في emacs فشل بشكل واضح ، و
في رسالة الخطأ "تطبع" بطريقة ما بنية البيانات الكاملة في هذه الحالة.
"{: هراء 123}"
حتى بطريقة غريبة جدًا ، في منتصف أجزاء من تتبع المكدس.

RuntimeException Unmatched delimiter: ]  clojure.lang.Util.runtimeException (Util.java:221)
{:nonsense 123}RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)

مما يؤدي إلى هزال معلق على الفور.

لقد وجدت حلاً آخر محتملًا لحل مشكلة السلاسل الكبيرة-

في عملي باستخدام clojure لتحليل البيانات (النصية) ، لاحظت أنني بالكاد أرغب في طباعة سلاسل كبيرة بالكامل.

لذا فإن إحدى طرق حل مشكلة السلسلة الكبيرة هي التفكير في استخدام طابعة جميلة بشكل افتراضي ،
الذي يطبع السلاسل مقطوعة دائمًا.

لقد غيرت لهذا الغرض تنفيذ fipp ، بحيث يتم اقتطاع جميع السلاسل إلى 10 أحرف ثم طباعة طول السلسلة بين قوسين.

هذا له تأثير جانبي يتمثل في أن معظم الخرائط / الهياكل النصية المتداخلة يمكن قراءتها بشكل كبير ، مثل هذا:

 {:id "684415",
  :name "PLH Panel ...[21],
  :experts ({:name "BRAGARD C ...[16],
             :doi-link "../../../ ...[165],
             :cv-link "../../../ ...[188],
             :doi #object["[B" "0x736e343 ...[12] "[B<strong i="13">@736e34</strong> ...[13]],
             :cv #object["[B" "0x5ba0ad4 ...[12] "[B<strong i="14">@5ba0ad</strong> ...[13]],
             :doi-text "PLH = Pla ...[7546],
             :cv-text "CURRICULU ...[4926]}
            {:name "DEHNEN-SC ...[26],
             :doi-link "../../../ ...[165],
             :cv-link "../../../ ...[188],
             :doi #object["[B" "0x1f56d4f ...[12] "[B<strong i="15">@1f56d4</strong> ...[13]],
             :cv #object["[B" "0x4be0125 ...[12] "[B<strong i="16">@4be012</strong> ...[13]],
             :doi-text "PLH = Pla ...[5553],
             :cv-text "CURRICULU ...[4479]}

إن الجمع بين هذا وبين استخدام مستوى الطباعة وطول الطباعة يضمن تقريبًا أن يبقى الإخراج قصيرًا بشكل معقول.

حتى أنني كنت أفكر في أن clojure.core يجب أن يحصل على فار مثل طول سلسلة الطباعة ،
نظرًا لأن طول الطباعة الحالي ومستوى الطباعة لا يفيان دائمًا بالغرض المتمثل في الحفاظ على حجم هياكل البيانات المطبوعة صغيرة.

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

من الناحية المثالية ، سيكون لمكتبة fipp طريقة قابلة للتكوين في وقت التشغيل للتحكم في اقتطاع السلسلة.

أي رأي في هذا؟

هناك حل آخر سهل لمشكلة السلسلة الكبيرة وهو تعيين "طريقة طباعة" محددة للسلاسل.

الكود التالي يفعل هذا:

(defn shorten-string [s]
   (if (> (count s) 100)
     (str (.substring s 0 100) " ...[" (count s)    "]")
     s))
(defmethod print-method java.lang.String [v ^java.io.Writer w]  (.write w (shorten-string  v)))

أقوم بدمج هذا عادةً مع طريقة لاقتطاع الطول الإجمالي لنتيجة تقييم REPL إلى 1000 ، انظر تعليقي على # 1934

توفر كلتا الطريقتين معًا طريقة مرنة لاستكشاف هياكل البيانات الأكبر بأمان في clojure / cider.

فقط لأعطي استنتاجي حول هذه المشكلة.

لقد جربت كثيرًا في حل مشكلة السلسلة الطويلة ، وتوصلت إلى استنتاج مفاده أنه من خلال الدمج لتعيين * طول الطباعة * ، * مستوى الطباعة * ، استخدام عصير التفاح ، طباعة جميلة وتخصيص وظيفة طريقة الطباعة java.lang.String عبر

(defmethod print-method java.lang.String [v ^java.io.Writer w]  (.write w (shorten-string  v)))

مشكلة مخرجات عصير التفاح الطويلة جدًا (بما في ذلك السلاسل الطويلة جدًا) يمكن التخلص منها تمامًا تقريبًا.

من الملائم بالفعل الآن في الرد تغيير إعدادات

  • * طول الطباعة *
  • * مستوى الطباعة *
  • تبديل الطباعة الجميلة

للحصول على طريقة ملائمة للتحكم في اقتطاع السلسلة ، يمكن استخدام وظيفتين بسيطتين من وظائف elisp ، والتي يتم حقنها في استبدال كود clojure للتحكم في طباعة java.lang.String:

  (defun cider-pr-shorten-string (max)
    (interactive "nShorten strings to ?:  ")
    (insert (format "
(defn shorten-string [s]
   (if (> (count s) %d)
     (str (.substring s 0 %d) \" ...[\" (count s)    \"]\")
     s))
(defmethod print-method java.lang.String [v ^java.io.Writer w]  (.write w (shorten-string  v)))"
            max max)  )

    (cider-repl-return))

  (defun cider-pr-normal-string ()
    (interactive)
    (insert "
(defmethod print-method java.lang.String [v ^java.io.Writer w]  (.write w v))
")
    (cider-repl-return))

يجب أن يضمن هذا تقريبًا ألا يؤدي تقييم تعبيرات clojure إلى إرجاع مخرجات طويلة جدًا.

تقوم وظيفة "shorten" بطباعة طول السلسلة في النهاية ، لذلك من السهل إلى حد ما رؤية المدة التي كان من الممكن أن تستغرقها السلسلة ، إذا تمت طباعتها.
تسمح الوظيفتان المقتطعتان أعلاه بتعيين طول الاقتطاع بسرعة ، حيث تكون الطباعة مطلوبة في بعض الأحيان.

تم وضع علامة على هذه المشكلة تلقائيًا على أنها قديمة نظرًا لعدم وجود نشاط حديث لها. سيتم إغلاقه إذا لم يحدث أي نشاط آخر. شكرا لمساهمتك وتفهمك!

يتم حل هذا في الغالب على CIDER 0.21+ ، لذلك سأغلق هذه التذكرة.

تحديث: cider version 0.22.1-snapshot و Emacs 26.3 ؛ نظام التشغيل Mac OS X 10.14.6 ؛ دينار 11

إذا حاولت طباعة سلسلة طويلة عدة مرات ، فلا يزال REPL يتباطأ بشكل ملحوظ.
جربت هذا للتو:

(println full-github-payload)

(println full-github-payload)

;; this time the evaluation itself took significantly longer!
(println full-github-payload)

;; REPL buffer is almost unusable at this point - even for simple things like:
(+ 10 20)
;;=> ... waiting for many seconds...

full-github-payload للمرجع:

(def full-github-payload
    {:action "synchronize", ;; 'synchronize' when new changes are pushed to the pull request's branch
     :number 1,

     ;; pull request
     :pull_request
     {:html_url "https://github.com/jumarko/poptavka/pull/1",
      :merge_commit_sha "be827754d3af94121d0983bc3b36f3466d089528",
      :mergeable_state "unknown",
      :mergeable nil,
      :patch_url "https://github.com/jumarko/poptavka/pull/1.patch",
      :labels [],
      :assignees [],
      :additions 2735,
      :closed_at nil,
      :merged false,
      :review_comment_url "https://api.github.com/repos/jumarko/poptavka/pulls/comments{/number}",
      :author_association "OWNER",
      :number 1,
      :milestone nil,
      :requested_reviewers [],
      :comments 1,
      :node_id "MDExOlB1bGxSZXF1ZXN0MjkyODY0Mzkx",
      :merged_at nil,
      :statuses_url
      "https://api.github.com/repos/jumarko/poptavka/statuses/c4c5320450381fcd20a980eb8a311910de52f7e2",
      :state "open",
      :changed_files 9,
      :issue_url "https://api.github.com/repos/jumarko/poptavka/issues/1",
      :title "Juraj delta",
      :commits_url "https://api.github.com/repos/jumarko/poptavka/pulls/1/commits",
      :updated_at "2019-07-11T14:10:58Z",
      :head
      {:label "jumarko:juraj-delta",
       :ref "juraj-delta",
       :sha "c4c5320450381fcd20a980eb8a311910de52f7e2",
       :user
       {:html_url "https://github.com/jumarko",
        :gravatar_id "",
        :followers_url "https://api.github.com/users/jumarko/followers",
        :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
        :site_admin false,
        :following_url "https://api.github.com/users/jumarko/following{/other_user}",
        :node_id "MDQ6VXNlcjEwODM2Mjk=",
        :type "User",
        :received_events_url "https://api.github.com/users/jumarko/received_events",
        :login "jumarko",
        :organizations_url "https://api.github.com/users/jumarko/orgs",
        :id 1083629,
        :events_url "https://api.github.com/users/jumarko/events{/privacy}",
        :url "https://api.github.com/users/jumarko",
        :repos_url "https://api.github.com/users/jumarko/repos",
        :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
        :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
        :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
       :repo
       {:html_url "https://github.com/jumarko/poptavka",
        :description "Repository for my former free-time project \"poptavka\"",
        :archived false,
        :open_issues_count 1,
        :watchers 0,
        :ssh_url "[email protected]:jumarko/poptavka.git",
        :hooks_url "https://api.github.com/repos/jumarko/poptavka/hooks",
        :archive_url "https://api.github.com/repos/jumarko/poptavka/{archive_format}{/ref}",
        :keys_url "https://api.github.com/repos/jumarko/poptavka/keys{/key_id}",
        :forks_count 1,
        :languages_url "https://api.github.com/repos/jumarko/poptavka/languages",
        :git_url "git://github.com/jumarko/poptavka.git",
        :issue_comment_url "https://api.github.com/repos/jumarko/poptavka/issues/comments{/number}",
        :git_refs_url "https://api.github.com/repos/jumarko/poptavka/git/refs{/sha}",
        :clone_url "https://github.com/jumarko/poptavka.git",
        :contents_url "https://api.github.com/repos/jumarko/poptavka/contents/{+path}",
        :has_downloads true,
        :teams_url "https://api.github.com/repos/jumarko/poptavka/teams",
        :has_issues true,
        :disabled false,
        :issue_events_url "https://api.github.com/repos/jumarko/poptavka/issues/events{/number}",
        :license nil,
        :private false,
        :watchers_count 0,
        :collaborators_url
        "https://api.github.com/repos/jumarko/poptavka/collaborators{/collaborator}",
        :homepage nil,
        :git_commits_url "https://api.github.com/repos/jumarko/poptavka/git/commits{/sha}",
        :name "poptavka",
        :releases_url "https://api.github.com/repos/jumarko/poptavka/releases{/id}",
        :milestones_url "https://api.github.com/repos/jumarko/poptavka/milestones{/number}",
        :svn_url "https://github.com/jumarko/poptavka",
        :node_id "MDEwOlJlcG9zaXRvcnk4OTI0NDY1MQ==",
        :merges_url "https://api.github.com/repos/jumarko/poptavka/merges",
        :compare_url "https://api.github.com/repos/jumarko/poptavka/compare/{base}...{head}",
        :stargazers_count 0,
        :tags_url "https://api.github.com/repos/jumarko/poptavka/tags",
        :statuses_url "https://api.github.com/repos/jumarko/poptavka/statuses/{sha}",
        :notifications_url
        "https://api.github.com/repos/jumarko/poptavka/notifications{?since,all,participating}",
        :open_issues 1,
        :has_wiki true,
        :size 12974,
        :assignees_url "https://api.github.com/repos/jumarko/poptavka/assignees{/user}",
        :commits_url "https://api.github.com/repos/jumarko/poptavka/commits{/sha}",
        :labels_url "https://api.github.com/repos/jumarko/poptavka/labels{/name}",
        :forks_url "https://api.github.com/repos/jumarko/poptavka/forks",
        :contributors_url "https://api.github.com/repos/jumarko/poptavka/contributors",
        :updated_at "2017-04-24T13:59:28Z",
        :pulls_url "https://api.github.com/repos/jumarko/poptavka/pulls{/number}",
        :has_pages false,
        :default_branch "master",
        :language "Java",
        :comments_url "https://api.github.com/repos/jumarko/poptavka/comments{/number}",
        :id 89244651,
        :stargazers_url "https://api.github.com/repos/jumarko/poptavka/stargazers",
        :issues_url "https://api.github.com/repos/jumarko/poptavka/issues{/number}",
        :trees_url "https://api.github.com/repos/jumarko/poptavka/git/trees{/sha}",
        :events_url "https://api.github.com/repos/jumarko/poptavka/events",
        :branches_url "https://api.github.com/repos/jumarko/poptavka/branches{/branch}",
        :url "https://api.github.com/repos/jumarko/poptavka",
        :downloads_url "https://api.github.com/repos/jumarko/poptavka/downloads",
        :forks 1,
        :subscribers_url "https://api.github.com/repos/jumarko/poptavka/subscribers",
        :full_name "jumarko/poptavka",
        :blobs_url "https://api.github.com/repos/jumarko/poptavka/git/blobs{/sha}",
        :subscription_url "https://api.github.com/repos/jumarko/poptavka/subscription",
        :fork false,
        :deployments_url "https://api.github.com/repos/jumarko/poptavka/deployments",
        :has_projects true,
        :pushed_at "2019-07-11T14:10:58Z",
        :owner
        {:html_url "https://github.com/jumarko",
         :gravatar_id "",
         :followers_url "https://api.github.com/users/jumarko/followers",
         :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
         :site_admin false,
         :following_url "https://api.github.com/users/jumarko/following{/other_user}",
         :node_id "MDQ6VXNlcjEwODM2Mjk=",
         :type "User",
         :received_events_url "https://api.github.com/users/jumarko/received_events",
         :login "jumarko",
         :organizations_url "https://api.github.com/users/jumarko/orgs",
         :id 1083629,
         :events_url "https://api.github.com/users/jumarko/events{/privacy}",
         :url "https://api.github.com/users/jumarko",
         :repos_url "https://api.github.com/users/jumarko/repos",
         :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
         :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
         :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
        :git_tags_url "https://api.github.com/repos/jumarko/poptavka/git/tags{/sha}",
        :created_at "2017-04-24T13:40:09Z",
        :mirror_url nil}},
      :diff_url "https://github.com/jumarko/poptavka/pull/1.diff",
      :draft false,
      :maintainer_can_modify false,
      :comments_url "https://api.github.com/repos/jumarko/poptavka/issues/1/comments",
      :deletions 38,
      :locked false,
      :id 292864391,
      :rebaseable nil,
      :commits 17,
      :url "https://api.github.com/repos/jumarko/poptavka/pulls/1",
      :review_comments 0,
      :base
      {:label "jumarko:master",
       :ref "master",
       :sha "c81331dfd6eec6a248c3e0da76ad4c53494b9f59",
       :user
       {:html_url "https://github.com/jumarko",
        :gravatar_id "",
        :followers_url "https://api.github.com/users/jumarko/followers",
        :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
        :site_admin false,
        :following_url "https://api.github.com/users/jumarko/following{/other_user}",
        :node_id "MDQ6VXNlcjEwODM2Mjk=",
        :type "User",
        :received_events_url "https://api.github.com/users/jumarko/received_events",
        :login "jumarko",
        :organizations_url "https://api.github.com/users/jumarko/orgs",
        :id 1083629,
        :events_url "https://api.github.com/users/jumarko/events{/privacy}",
        :url "https://api.github.com/users/jumarko",
        :repos_url "https://api.github.com/users/jumarko/repos",
        :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
        :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
        :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
       :repo
       {:html_url "https://github.com/jumarko/poptavka",
        :description "Repository for my former free-time project \"poptavka\"",
        :archived false,
        :open_issues_count 1,
        :watchers 0,
        :ssh_url "[email protected]:jumarko/poptavka.git",
        :hooks_url "https://api.github.com/repos/jumarko/poptavka/hooks",
        :archive_url "https://api.github.com/repos/jumarko/poptavka/{archive_format}{/ref}",
        :keys_url "https://api.github.com/repos/jumarko/poptavka/keys{/key_id}",
        :forks_count 1,
        :languages_url "https://api.github.com/repos/jumarko/poptavka/languages",
        :git_url "git://github.com/jumarko/poptavka.git",
        :issue_comment_url "https://api.github.com/repos/jumarko/poptavka/issues/comments{/number}",
        :git_refs_url "https://api.github.com/repos/jumarko/poptavka/git/refs{/sha}",
        :clone_url "https://github.com/jumarko/poptavka.git",
        :contents_url "https://api.github.com/repos/jumarko/poptavka/contents/{+path}",
        :has_downloads true,
        :teams_url "https://api.github.com/repos/jumarko/poptavka/teams",
        :has_issues true,
        :disabled false,
        :issue_events_url "https://api.github.com/repos/jumarko/poptavka/issues/events{/number}",
        :license nil,
        :private false,
        :watchers_count 0,
        :collaborators_url
        "https://api.github.com/repos/jumarko/poptavka/collaborators{/collaborator}",
        :homepage nil,
        :git_commits_url "https://api.github.com/repos/jumarko/poptavka/git/commits{/sha}",
        :name "poptavka",
        :releases_url "https://api.github.com/repos/jumarko/poptavka/releases{/id}",
        :milestones_url "https://api.github.com/repos/jumarko/poptavka/milestones{/number}",
        :svn_url "https://github.com/jumarko/poptavka",
        :node_id "MDEwOlJlcG9zaXRvcnk4OTI0NDY1MQ==",
        :merges_url "https://api.github.com/repos/jumarko/poptavka/merges",
        :compare_url "https://api.github.com/repos/jumarko/poptavka/compare/{base}...{head}",
        :stargazers_count 0,
        :tags_url "https://api.github.com/repos/jumarko/poptavka/tags",
        :statuses_url "https://api.github.com/repos/jumarko/poptavka/statuses/{sha}",
        :notifications_url
        "https://api.github.com/repos/jumarko/poptavka/notifications{?since,all,participating}",
        :open_issues 1,
        :has_wiki true,
        :size 12974,
        :assignees_url "https://api.github.com/repos/jumarko/poptavka/assignees{/user}",
        :commits_url "https://api.github.com/repos/jumarko/poptavka/commits{/sha}",
        :labels_url "https://api.github.com/repos/jumarko/poptavka/labels{/name}",
        :forks_url "https://api.github.com/repos/jumarko/poptavka/forks",
        :contributors_url "https://api.github.com/repos/jumarko/poptavka/contributors",
        :updated_at "2017-04-24T13:59:28Z",
        :pulls_url "https://api.github.com/repos/jumarko/poptavka/pulls{/number}",
        :has_pages false,
        :default_branch "master",
        :language "Java",
        :comments_url "https://api.github.com/repos/jumarko/poptavka/comments{/number}",
        :id 89244651,
        :stargazers_url "https://api.github.com/repos/jumarko/poptavka/stargazers",
        :issues_url "https://api.github.com/repos/jumarko/poptavka/issues{/number}",
        :trees_url "https://api.github.com/repos/jumarko/poptavka/git/trees{/sha}",
        :events_url "https://api.github.com/repos/jumarko/poptavka/events",
        :branches_url "https://api.github.com/repos/jumarko/poptavka/branches{/branch}",
        :url "https://api.github.com/repos/jumarko/poptavka",
        :downloads_url "https://api.github.com/repos/jumarko/poptavka/downloads",
        :forks 1,
        :subscribers_url "https://api.github.com/repos/jumarko/poptavka/subscribers",
        :full_name "jumarko/poptavka",
        :blobs_url "https://api.github.com/repos/jumarko/poptavka/git/blobs{/sha}",
        :subscription_url "https://api.github.com/repos/jumarko/poptavka/subscription",
        :fork false,
        :deployments_url "https://api.github.com/repos/jumarko/poptavka/deployments",
        :has_projects true,
        :pushed_at "2019-07-11T14:10:58Z",
        :owner
        {:html_url "https://github.com/jumarko",
         :gravatar_id "",
         :followers_url "https://api.github.com/users/jumarko/followers",
         :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
         :site_admin false,
         :following_url "https://api.github.com/users/jumarko/following{/other_user}",
         :node_id "MDQ6VXNlcjEwODM2Mjk=",
         :type "User",
         :received_events_url "https://api.github.com/users/jumarko/received_events",
         :login "jumarko",
         :organizations_url "https://api.github.com/users/jumarko/orgs",
         :id 1083629,
         :events_url "https://api.github.com/users/jumarko/events{/privacy}",
         :url "https://api.github.com/users/jumarko",
         :repos_url "https://api.github.com/users/jumarko/repos",
         :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
         :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
         :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
        :git_tags_url "https://api.github.com/repos/jumarko/poptavka/git/tags{/sha}",
        :created_at "2017-04-24T13:40:09Z",
        :mirror_url nil}},
      :_links
      {:self {:href "https://api.github.com/repos/jumarko/poptavka/pulls/1"},
       :html {:href "https://github.com/jumarko/poptavka/pull/1"},
       :issue {:href "https://api.github.com/repos/jumarko/poptavka/issues/1"},
       :comments {:href "https://api.github.com/repos/jumarko/poptavka/issues/1/comments"},
       :review_comments {:href "https://api.github.com/repos/jumarko/poptavka/pulls/1/comments"},
       :review_comment {:href "https://api.github.com/repos/jumarko/poptavka/pulls/comments{/number}"},
       :commits {:href "https://api.github.com/repos/jumarko/poptavka/pulls/1/commits"},
       :statuses
       {:href
        "https://api.github.com/repos/jumarko/poptavka/statuses/c4c5320450381fcd20a980eb8a311910de52f7e2"}},
      :body "Trying to test delta analysis",
      :merged_by nil,
      :user
      {:html_url "https://github.com/jumarko",
       :gravatar_id "",
       :followers_url "https://api.github.com/users/jumarko/followers",
       :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
       :site_admin false,
       :following_url "https://api.github.com/users/jumarko/following{/other_user}",
       :node_id "MDQ6VXNlcjEwODM2Mjk=",
       :type "User",
       :received_events_url "https://api.github.com/users/jumarko/received_events",
       :login "jumarko",
       :organizations_url "https://api.github.com/users/jumarko/orgs",
       :id 1083629,
       :events_url "https://api.github.com/users/jumarko/events{/privacy}",
       :url "https://api.github.com/users/jumarko",
       :repos_url "https://api.github.com/users/jumarko/repos",
       :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
       :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
       :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
      :review_comments_url "https://api.github.com/repos/jumarko/poptavka/pulls/1/comments",
      :requested_teams [],
      :assignee nil,
      :created_at "2019-06-28T14:58:08Z"},

     ;; timestamps
     :before "e42e0bc447064612e73bb5dc416265298accd9b4",
     :after "c4c5320450381fcd20a980eb8a311910de52f7e2",

     ;; repository
     :repository
     {:html_url "https://github.com/jumarko/poptavka",
      :description "Repository for my former free-time project \"poptavka\"",
      :archived false,
      :open_issues_count 1,
      :watchers 0,
      :ssh_url "[email protected]:jumarko/poptavka.git",
      :hooks_url "https://api.github.com/repos/jumarko/poptavka/hooks",
      :archive_url "https://api.github.com/repos/jumarko/poptavka/{archive_format}{/ref}",
      :keys_url "https://api.github.com/repos/jumarko/poptavka/keys{/key_id}",
      :forks_count 1,
      :languages_url "https://api.github.com/repos/jumarko/poptavka/languages",
      :git_url "git://github.com/jumarko/poptavka.git",
      :issue_comment_url "https://api.github.com/repos/jumarko/poptavka/issues/comments{/number}",
      :git_refs_url "https://api.github.com/repos/jumarko/poptavka/git/refs{/sha}",
      :clone_url "https://github.com/jumarko/poptavka.git",
      :contents_url "https://api.github.com/repos/jumarko/poptavka/contents/{+path}",
      :has_downloads true,
      :teams_url "https://api.github.com/repos/jumarko/poptavka/teams",
      :has_issues true,
      :disabled false,
      :issue_events_url "https://api.github.com/repos/jumarko/poptavka/issues/events{/number}",
      :license nil,
      :private false,
      :watchers_count 0,
      :collaborators_url "https://api.github.com/repos/jumarko/poptavka/collaborators{/collaborator}",
      :homepage nil,
      :git_commits_url "https://api.github.com/repos/jumarko/poptavka/git/commits{/sha}",
      :name "poptavka",
      :releases_url "https://api.github.com/repos/jumarko/poptavka/releases{/id}",
      :milestones_url "https://api.github.com/repos/jumarko/poptavka/milestones{/number}",
      :svn_url "https://github.com/jumarko/poptavka",
      :node_id "MDEwOlJlcG9zaXRvcnk4OTI0NDY1MQ==",
      :merges_url "https://api.github.com/repos/jumarko/poptavka/merges",
      :compare_url "https://api.github.com/repos/jumarko/poptavka/compare/{base}...{head}",
      :stargazers_count 0,
      :tags_url "https://api.github.com/repos/jumarko/poptavka/tags",
      :statuses_url "https://api.github.com/repos/jumarko/poptavka/statuses/{sha}",
      :notifications_url
      "https://api.github.com/repos/jumarko/poptavka/notifications{?since,all,participating}",
      :open_issues 1,
      :has_wiki true,
      :size 12974,
      :assignees_url "https://api.github.com/repos/jumarko/poptavka/assignees{/user}",
      :commits_url "https://api.github.com/repos/jumarko/poptavka/commits{/sha}",
      :labels_url "https://api.github.com/repos/jumarko/poptavka/labels{/name}",
      :forks_url "https://api.github.com/repos/jumarko/poptavka/forks",
      :contributors_url "https://api.github.com/repos/jumarko/poptavka/contributors",
      :updated_at "2017-04-24T13:59:28Z",
      :pulls_url "https://api.github.com/repos/jumarko/poptavka/pulls{/number}",
      :has_pages false,
      :default_branch "master",
      :language "Java",
      :comments_url "https://api.github.com/repos/jumarko/poptavka/comments{/number}",
      :id 89244651,
      :stargazers_url "https://api.github.com/repos/jumarko/poptavka/stargazers",
      :issues_url "https://api.github.com/repos/jumarko/poptavka/issues{/number}",
      :trees_url "https://api.github.com/repos/jumarko/poptavka/git/trees{/sha}",
      :events_url "https://api.github.com/repos/jumarko/poptavka/events",
      :branches_url "https://api.github.com/repos/jumarko/poptavka/branches{/branch}",
      :url "https://api.github.com/repos/jumarko/poptavka",
      :downloads_url "https://api.github.com/repos/jumarko/poptavka/downloads",
      :forks 1,
      :subscribers_url "https://api.github.com/repos/jumarko/poptavka/subscribers",
      :full_name "jumarko/poptavka",
      :blobs_url "https://api.github.com/repos/jumarko/poptavka/git/blobs{/sha}",
      :subscription_url "https://api.github.com/repos/jumarko/poptavka/subscription",
      :fork false,
      :deployments_url "https://api.github.com/repos/jumarko/poptavka/deployments",
      :has_projects true,
      :pushed_at "2019-07-11T14:10:58Z",
      :owner
      {:html_url "https://github.com/jumarko",
       :gravatar_id "",
       :followers_url "https://api.github.com/users/jumarko/followers",
       :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
       :site_admin false,
       :following_url "https://api.github.com/users/jumarko/following{/other_user}",
       :node_id "MDQ6VXNlcjEwODM2Mjk=",
       :type "User",
       :received_events_url "https://api.github.com/users/jumarko/received_events",
       :login "jumarko",
       :organizations_url "https://api.github.com/users/jumarko/orgs",
       :id 1083629,
       :events_url "https://api.github.com/users/jumarko/events{/privacy}",
       :url "https://api.github.com/users/jumarko",
       :repos_url "https://api.github.com/users/jumarko/repos",
       :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
       :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
       :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"},
      :git_tags_url "https://api.github.com/repos/jumarko/poptavka/git/tags{/sha}",
      :created_at "2017-04-24T13:40:09Z",
      :mirror_url nil},

     ;; sender
     :sender
     {:html_url "https://github.com/jumarko",
      :gravatar_id "",
      :followers_url "https://api.github.com/users/jumarko/followers",
      :subscriptions_url "https://api.github.com/users/jumarko/subscriptions",
      :site_admin false,
      :following_url "https://api.github.com/users/jumarko/following{/other_user}",
      :node_id "MDQ6VXNlcjEwODM2Mjk=",
      :type "User",
      :received_events_url "https://api.github.com/users/jumarko/received_events",
      :login "jumarko",
      :organizations_url "https://api.github.com/users/jumarko/orgs",
      :id 1083629,
      :events_url "https://api.github.com/users/jumarko/events{/privacy}",
      :url "https://api.github.com/users/jumarko",
      :repos_url "https://api.github.com/users/jumarko/repos",
      :starred_url "https://api.github.com/users/jumarko/starred{/owner}{/repo}",
      :gists_url "https://api.github.com/users/jumarko/gists{/gist_id}",
      :avatar_url "https://avatars0.githubusercontent.com/u/1083629?v=4"}})
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات