Linenoise: لم يتم التعامل مع Ctrl-z (SIGSTOP) بشكل صحيح.

تم إنشاؤها على ١٨ مايو ٢٠١٧  ·  8تعليقات  ·  مصدر: antirez/linenoise

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

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:05:53]
╰─>$ ./linenoise_example 
hello> foo
echo: 'foo'
hello> 
echo: ''
hello> 

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:05:54]
╰─>$ python
Python 3.6.1 (default, Mar 27 2017, 00:27:06) 
[GCC 6.3.1 20170306] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 17
'python' has gestoppt

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:06:07]
│ 1 28968   0%  gestoppt    python
╰─>$ fg
Job 1, 'python' in den Vordergrund schicken

>>> print(foo)
17

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

هناك طريقة بسيطة جدًا لتطبيق وظيفة CTRL + Z ، كما أوضح ستيف بينيت في مفترق لينينوايز الخاص به: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

لقد قمت بتكييف التصحيح بحيث يتم تطبيقه على الجزء الرئيسي الحالي (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) وهذه هي النتيجة:

commit d9400774549967cda04cfa04f56ed956cd79147c
Author: Steve Bennett <[email protected]>
Date:   Mon Jan 1 13:11:16 2018 +1000

    Enable ^Z (SUSP) support

    Allows the current process to be backgrounded and then resumed.

    Signed-off-by: Steve Bennett <[email protected]>

    (adaptations)

    Signed-off-by: Alexander F. Mayer <[email protected]>

diff --git a/linenoise.c b/linenoise.c
index 10ffd71..d861505 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -109,6 +109,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <sys/stat.h>
@@ -168,6 +169,7 @@ enum KEY_ACTION{
    CTRL_T = 20,        /* Ctrl-t */
    CTRL_U = 21,        /* Ctrl+u */
    CTRL_W = 23,        /* Ctrl+w */
+   CTRL_Z = 26,        /* Ctrl+z */
    ESC = 27,           /* Escape */
    BACKSPACE =  127    /* Backspace */
 };
@@ -830,6 +832,16 @@ static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen,
         case CTRL_C:     /* ctrl-c */
             errno = EAGAIN;
             return -1;
+        case CTRL_Z:     /* ctrl-z */
+#ifdef SIGTSTP
+            /* send ourselves SIGSUSP */
+            disableRawMode(STDIN_FILENO);
+            raise(SIGTSTP);
+            /* and resume */
+            enableRawMode(STDIN_FILENO);
+            refreshLine(&l);
+#endif
+            continue;
         case BACKSPACE:   /* backspace */
         case 8:     /* ctrl-h */
             linenoiseEditBackspace(&l);

ال 8 كومينتر

كيف تجعل موجهك يبدو بهذا الشكل 0.0

إنها سمكة

@ krux02 أرى أنك تستخدم ج ++،yhirose ديه linenoise التي تم تصديرها إلى c ++: https://github.com/yhirose/cpp-linenoise. وهو أيضًا مُمكّن لـ UTF8.

هل يمكنك مشاركة جوهر كود linenoise_example الخاص بك؟

في الواقع أنا لا أستخدم c ++. اعتدت على برمجة الكثير من C ++ لكنني الآن أفعل Nim . على سبيل المثال فقط أردت التأكد من أن مشكلتي لا تأتي من أي شيء متعلق بـ Nim ، لذلك قمت بإنشاء مشروع c ++.

من تجربتي ، فإن C API على ما يرام ، لست بحاجة إلى إصدار c ++. كما أنني لم أواجه أي مشاكل على الإطلاق في استخدام utf8 في هذه المكتبة. ما أفتقده هو العديد من أوامر لوحة المفاتيح التي أعرفها بالفعل على readline.

أنا أستخدم نسخة مغلفة من linenoise ، لذا فأنا لست متأكدًا مما إذا كان الأمر يستحق حقًا الكثير بالنسبة لك ، ولكن هذا هو المثال الذي أستخدمه وهو ليس موجهًا نحو Linenoise: https://github.com/krux02/opengl -sandbox / blob / master / أمثلة / console.nim

الفكرة في هذا الملف هي استخدام نظام الماكرو الخاص بـ Nim لإتاحة وظيفة عشوائية في مترجم الأوامر. ولكن تحت غطاء محرك السيارة مترجم الأوامر هو لينويز.

@ krux02

حسنًا ، أنا محايد للغة مهنيًا ولكنني شخصيًا أنا متعجرف أيضًا: أحمر الخدود: أحب C.

تذكر أن Linenoise عبارة عن مكتبة خالية من الزخارف ، بدون زخرفة ، وهذا هدف تصميم.

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

مهلا! أنت في الصفحة الأولى من نيم! عمل جيد آرني!

@ krux02

حسنًا ، يُظهر مشروع C هذا السلوك الذي تصفه:

https://github.com/Sonophoto/shellnoise

ومع ذلك ، فإن Ctrl-C و Ctrl-D يتصرفان بشكل طبيعي.

يبدو أن Linenoise يلتقط Ctrl-Z كمدخل (وفي هذا المثال يتم صدى صدى على الطرف كسلسلة) بدلاً من تمريره إلى الغلاف.

لاحظ أن هذا المشروع يستخدم إدخال لينويز متعدد الخطوط.

@ krux02

أفضل تخميني مع القليل من الحفر هو أن linenoise يضع الجهاز في وضع أولي وأن هذا الإعداد يتسبب في التقاط Ctrl-Z كحرف بدلاً من رمز تحكم ASCII.

https://github.com/antirez/linenoise/blob/master/linenoise.c#L217 -L251

و U + 001A هو رمز Ctrl-Z عند الطباعة بتنسيق UTF8

hoelzro أتى بهذا التصحيح لكنه لا يعالج Ctrl-C بشكل صحيح. ومع ذلك يمكن التقاط ذلك أيضًا والتعامل معه ببساطة في لينويز.

https://github.com/hoelzro/p6-linenoise/commit/7d0bb83cab34ca58f7a487b5df30736d058112cf

هناك طريقة بسيطة جدًا لتطبيق وظيفة CTRL + Z ، كما أوضح ستيف بينيت في مفترق لينينوايز الخاص به: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

لقد قمت بتكييف التصحيح بحيث يتم تطبيقه على الجزء الرئيسي الحالي (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) وهذه هي النتيجة:

commit d9400774549967cda04cfa04f56ed956cd79147c
Author: Steve Bennett <[email protected]>
Date:   Mon Jan 1 13:11:16 2018 +1000

    Enable ^Z (SUSP) support

    Allows the current process to be backgrounded and then resumed.

    Signed-off-by: Steve Bennett <[email protected]>

    (adaptations)

    Signed-off-by: Alexander F. Mayer <[email protected]>

diff --git a/linenoise.c b/linenoise.c
index 10ffd71..d861505 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -109,6 +109,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <sys/stat.h>
@@ -168,6 +169,7 @@ enum KEY_ACTION{
    CTRL_T = 20,        /* Ctrl-t */
    CTRL_U = 21,        /* Ctrl+u */
    CTRL_W = 23,        /* Ctrl+w */
+   CTRL_Z = 26,        /* Ctrl+z */
    ESC = 27,           /* Escape */
    BACKSPACE =  127    /* Backspace */
 };
@@ -830,6 +832,16 @@ static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen,
         case CTRL_C:     /* ctrl-c */
             errno = EAGAIN;
             return -1;
+        case CTRL_Z:     /* ctrl-z */
+#ifdef SIGTSTP
+            /* send ourselves SIGSUSP */
+            disableRawMode(STDIN_FILENO);
+            raise(SIGTSTP);
+            /* and resume */
+            enableRawMode(STDIN_FILENO);
+            refreshLine(&l);
+#endif
+            continue;
         case BACKSPACE:   /* backspace */
         case 8:     /* ctrl-h */
             linenoiseEditBackspace(&l);

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

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

ozancaglayan picture ozancaglayan  ·  21تعليقات

fatcerberus picture fatcerberus  ·  5تعليقات

JelteF picture JelteF  ·  8تعليقات

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

denisvm picture denisvm  ·  9تعليقات