Quando pressiono ctrl-z
no terminal (enviando SIGSTOP), ele apenas coloca ≤
na linha de entrada. Não sei por que e como, mas o programa deve parar e retornar ao shell. Então, com o comando fg
, devo poder voltar ao processo.
┬─[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
como você faz seu prompt ficar assim 0,0
é peixe
@ krux02 Vejo que você está usando c ++, @yhirose tem um linenoise que foi portado para c ++: https://github.com/yhirose/cpp-linenoise. Também está habilitado para UTF8.
Você pode compartilhar uma essência do seu código linenoise_example?
Na verdade, não estou usando c ++. Eu costumava programar muito em C ++, mas agora faço Nim . Apenas para o exemplo, eu queria ter certeza de que meu problema não vem de nada relacionado ao Nim, então criei um projeto c ++.
Pela minha experiência, a API C está bem, não preciso de uma versão c ++. Além disso, não tive problemas para usar utf8 nesta biblioteca. O que estou perdendo são muitos comandos de teclado com os quais já estou muito familiarizado no readline.
Eu uso uma versão empacotada do linenoise, então não tenho certeza se realmente vale muito para você, mas este é o exemplo que eu uso e não é orientado para linenoise: https://github.com/krux02/opengl -sandbox / blob / master / examples / console.nim
A ideia nesse arquivo é usar o sistema macro do Nim para disponibilizar uma função arbitrária no interpretador de comandos. Mas, por baixo do capô, o interpretador de comandos é o ruído da linha.
@ krux02
Bem, profissionalmente sou agnóstico quanto ao idioma, mas, pessoalmente, também sou um C esnobe: blush: eu amo C.
Lembre-se, Linenoise é uma biblioteca básica, sem frescuras, que é um objetivo de design.
Eu quero olhar para isso, infelizmente não terei tempo até este fim de semana, deixe em aberto a menos que alguém resolva para você.
Ei! Você está na primeira página do Nim! Bom trabalho, Arne!
@ krux02
Ok, este projeto C mostra o comportamento que você está descrevendo:
https://github.com/Sonophoto/shellnoise
Ctrl-C e Ctrl-D, entretanto, se comportam normalmente.
Linenoise parece estar capturando o Ctrl-Z como entrada (e, neste exemplo, ele é simplesmente ecoado no terminal como uma string) em vez de passá-lo para o shell.
Ah, e observe que este projeto está usando entrada de linha múltipla de ruído de linha.
@ krux02
Meu melhor palpite, com um pouco de pesquisa, é que o ruído de linha coloca o terminal em modo bruto e essa configuração está fazendo com que ele capture Ctrl-Z como um caractere em vez de um código de controle ASCII.
https://github.com/antirez/linenoise/blob/master/linenoise.c#L217 -L251
e U + 001A É o código Ctrl-Z quando impresso em UTF8
@hoelzro veio com este patch, mas ele não controla o Ctrl-C corretamente. No entanto, isso também poderia ser capturado e simplesmente tratado com ruído de linha.
https://github.com/hoelzro/p6-linenoise/commit/7d0bb83cab34ca58f7a487b5df30736d058112cf
Há uma maneira muito simples de implementar a funcionalidade CTRL + Z, conforme mostrado por Steve Bennett em seu fork do linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291
Eu adaptei o patch para que se aplique sobre o mestre atual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) e este é o resultado:
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);
Comentários muito úteis
Há uma maneira muito simples de implementar a funcionalidade CTRL + Z, conforme mostrado por Steve Bennett em seu fork do linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291
Eu adaptei o patch para que se aplique sobre o mestre atual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) e este é o resultado: