ターミナルで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
プロンプトを0.0のようにするにはどうすればよいですか
:@ krux02私@yhiroseていhttps://github.com/yhirose/cpp-linenoiseを。 UTF8も有効になっています。
linenoise_exampleコードの要点を共有できますか?
実際、私はc ++を使用していません。 以前は多くのC ++をプログラムしていましたが、現在はNimを使用しています。 例として、問題がNimに関連するものに起因しないことを確認したかったので、c ++プロジェクトを作成しました。
私の経験から、C APIは問題なく、C ++バージョンは必要ありません。 また、このライブラリでutf8を使用してもまったく問題はありませんでした。 私が見逃しているのは、readlineですでによく知っている多くのキーボードコマンドです。
私はラップされたバージョンのlinenoiseを使用しているので、それが本当にあなたにとって多くの価値があるかどうかはわかりませんが、これは私が使用する例であり、linenoise指向ではありません: https :
そのファイルのアイデアは、Nimのマクロシステムを使用して、コマンドインタープリターで任意の関数を使用できるようにすることです。 しかし、内部では、コマンドインタープリターはラインノイズです。
@ krux02
ええと、私は専門的には言語にとらわれませんが、個人的にはCのスノッブでもあります:blush:私はCが大好きです。
Linenoiseは必要最低限のものであり、飾り気のないライブラリではなく、設計目標であることを忘れないでください。
残念ながら、これを調べたいのですが、今週末まで時間がありません。誰かが解決しない限り、これを開いたままにしておきます。
おい! あなたはニムのトップページにいます! グッドジョブアルネ!
@ krux02
わかりました。このCプロジェクトは、あなたが説明している動作を示しています。
https://github.com/Sonophoto/shellnoise
ただし、Ctrl-CおよびCtrl-Dは正常に動作します。
Linenoiseは、Ctrl-Zをシェルに渡すのではなく、入力としてキャプチャしているように見えます(この例では、単に文字列として端末にエコーされます)。
ああ、このプロジェクトはラインノイズマルチライン入力を使用していることに注意してください。
@ krux02
少し掘り下げてみると、ラインノイズによって端末がrawモードになり、セットアップによってCtrl-ZがASCII制御コードではなく文字としてキャプチャされるようになっていると思います。
https://github.com/antirez/linenoise/blob/master/linenoise.c#L217 -L251
U + 001Aは、UTF8で印刷された場合のCtrl-Zコードです。
@hoelzroはこのパッチを思いついたが、Ctrl-Cを正しく処理しない。 ただし、それもキャプチャして、ラインノイズで簡単に処理できます。
https://github.com/hoelzro/p6-linenoise/commit/7d0bb83cab34ca58f7a487b5df30736d058112cf
スティーブ・ベネットがラインノイズのフォークで示したように、CTRL + Z機能を実装する非常に簡単な方法があります: //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);
最も参考になるコメント
スティーブ・ベネットがラインノイズのフォークで示したように、CTRL + Z機能を実装する非常に簡単な方法があります: //github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291
現在のマスター(https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422)に適用されるようにパッチを調整しました。これは、次の結果です。