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