Когда я нажимаю 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
Как сделать так, чтобы ur подсказка выглядела так? 0.0
это рыба
@ krux02 Я вижу, вы используете C ++, у @yhirose есть бельевой шум, который был перенесен на C ++: https://github.com/yhirose/cpp-linenoise. Он также поддерживает UTF8.
Не могли бы вы поделиться сутью вашего кода бельеoise_example?
На самом деле я не использую c ++. Раньше я много программировал на C ++, но теперь я занимаюсь Nim . Просто в качестве примера я хотел убедиться, что моя проблема не связана с чем-то связанным с Nim, поэтому я создал проект на C ++.
По моему опыту, C API просто прекрасен, мне не нужна версия на C ++. Также у меня не возникло никаких проблем с использованием utf8 в этой библиотеке. Мне не хватает многих клавиатурных команд, с которыми я уже хорошо знаком в readline.
Я использую обернутую версию льняного шума, поэтому я не уверен, действительно ли он многого стоит для вас, но это тот пример, который я использую, и он не ориентирован на льняной шум: https://github.com/krux02/opengl -sandbox / blob / master / examples / console.nim
Идея в этом файле состоит в том, чтобы использовать макросистему Nim, чтобы сделать произвольную функцию доступной в интерпретаторе команд. Но под капотом командный интерпретатор бесшумный.
@ krux02
Ну, профессионально я языковой агностик, но лично я тоже сноб на Си: blush: Я люблю Си.
Помните, что Linenoise - это простая библиотека без излишеств, и это цель дизайна.
Я хочу разобраться в этом, к сожалению, у меня не будет времени до этих выходных, оставьте это открытым, если кто-то не решит это за вас.
Привет! Вы на главной странице Nim! Хорошая работа, Арне!
@ krux02
Хорошо, этот проект C показывает поведение, которое вы описываете:
https://github.com/Sonophoto/shellnoise
Однако Ctrl-C и Ctrl-D работают нормально.
Linenoise, кажется, захватывает Ctrl-Z в качестве ввода (и в этом примере он просто выводится на терминал в виде строки) вместо того, чтобы передавать его оболочке.
Да, и обратите внимание, что в этом проекте используется многострочный ввод с льняным шумом.
@ krux02
Мое лучшее предположение, немного покопавшись, заключается в том, что леншум переводит терминал в необработанный режим, и эта настройка заставляет его захватывать 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, как показано Стивом Беннетом в его вилке Linenoise: 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);
Самый полезный комментарий
Существует очень простой способ реализовать функциональность CTRL + Z, как показано Стивом Беннетом в его вилке Linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291
Я адаптировал патч, чтобы он применялся поверх текущего мастера (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422), и вот результат: