Linenoise: Ctrl-z (SIGSTOP) tidak ditangani dengan benar.

Dibuat pada 18 Mei 2017  ·  8Komentar  ·  Sumber: antirez/linenoise

Ketika saya menekan ctrl-z pada terminal (mengirim SIGSTOP) itu hanya menempatkan pada baris input. Saya tidak tahu mengapa dan bagaimana, tetapi program seharusnya berhenti dan kembali ke shell. Kemudian dengan perintah fg saya harus dapat kembali ke proses.

┬─[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

Komentar yang paling membantu

Ada cara yang sangat sederhana untuk mengimplementasikan fungsionalitas CTRL+Z, seperti yang ditunjukkan oleh Steve Bennett di fork of linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Saya telah mengadaptasi tambalan sehingga berlaku di atas master saat ini (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) dan inilah hasilnya:

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);

Semua 8 komentar

bagaimana Anda membuat prompt Anda terlihat seperti itu 0.0

itu ikan

@krux02 Saya melihat Anda menggunakan c++, @yhirose memiliki linenoise yang telah di-porting ke c++ : https://github.com/yhirose/cpp-linenoise. Ini juga mengaktifkan UTF8.

Bisakah Anda membagikan inti dari kode linenoise_example Anda?

Sebenarnya saya tidak menggunakan c++. Saya dulu memprogram banyak C++ tetapi sekarang saya melakukan Nim . Sebagai contoh saya ingin memastikan bahwa masalah saya tidak berasal dari apa pun yang terkait dengan Nim, jadi saya membuat proyek c++.

Dari pengalaman saya, C API baik-baik saja, saya tidak memerlukan versi c++. Saya juga tidak punya masalah sama sekali untuk menggunakan utf8 di perpustakaan ini. Apa yang saya lewatkan adalah banyak perintah keyboard yang sudah sangat saya kenal di readline.

Saya menggunakan versi linenoise yang dibungkus, jadi saya tidak begitu yakin apakah itu benar-benar bernilai banyak untuk Anda, tetapi ini adalah contoh yang saya gunakan dan tidak berorientasi pada linenoise: https://github.com/krux02/opengl -sandbox/blob/master/examples/console.nim

Gagasan dalam file itu untuk menggunakan sistem makro Nim untuk membuat fungsi sewenang-wenang tersedia di penerjemah perintah. Tetapi di bawah tenda penerjemah perintah adalah linenoise.

@krux02

Yah, saya agnostik bahasa secara profesional tetapi secara pribadi saya juga sombong C :blush: Saya suka C.

Ingat, Linenoise adalah tulang telanjang, perpustakaan tanpa embel-embel, itu adalah tujuan desain.

Saya ingin memeriksa ini sayangnya saya tidak akan punya waktu sampai akhir pekan ini, biarkan ini terbuka kecuali seseorang menyelesaikannya untuk Anda.

Hai! Anda berada di halaman depan Nim! Kerja bagus Arne!

@krux02

Oke, proyek C ini menunjukkan perilaku yang Anda gambarkan:

https://github.com/Sonophoto/shellnoise

Ctrl-C dan Ctrl-D namun berperilaku normal.

Linenoise tampaknya menangkap Ctrl-Z sebagai input (dan dalam contoh ini hanya digaungkan ke terminal sebagai string) alih-alih meneruskannya ke shell.

Oh dan perhatikan bahwa proyek ini menggunakan input multi-baris linenoise.

@krux02

Tebakan terbaik saya dengan sedikit penggalian adalah bahwa linenoise menempatkan terminal ke mode mentah dan pengaturan itu menyebabkannya menangkap Ctrl-Z sebagai karakter alih-alih sebagai kode kontrol ASCII.

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

dan U+001A ADALAH kode Ctrl-Z saat dicetak dalam UTF8

@hoelzro datang dengan tambalan ini tetapi tidak menangani Ctrl-C dengan benar. Namun itu bisa ditangkap juga dan hanya ditangani di linenoise.

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

Ada cara yang sangat sederhana untuk mengimplementasikan fungsionalitas CTRL+Z, seperti yang ditunjukkan oleh Steve Bennett di fork of linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Saya telah mengadaptasi tambalan sehingga berlaku di atas master saat ini (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) dan inilah hasilnya:

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);

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ghost picture ghost  ·  4Komentar

fatcerberus picture fatcerberus  ·  5Komentar

ozancaglayan picture ozancaglayan  ·  21Komentar

JelteF picture JelteF  ·  8Komentar

denisvm picture denisvm  ·  9Komentar