Capturando uma tecla.

77 views
Skip to first unread message

Marcello Henrique

unread,
Nov 12, 2010, 3:10:01 PM11/12/10
to lua...@googlegroups.com
Olá a todos,

Como poderia finalizar a execução do código ao pressionar ESC (27)?
Como esta abaixo tenho que pressionar ESC e depois ENTER.

#!/usr/bin/lua
while true do
io.write("Entre com um valor:")
input = io.read()

if string.byte(input) == 27 or not string.byte(input) then break end
print(input:byte(1,-1))
io.write("Você disse: ", input ,"\n")
end


Abraços.
--
Marcello Henrique
Blog - http://faraohh.wordpress.com
Associação Software Livre de Goiás (www.aslgo.org.br)
Cercomp - UFG (www.cercomp.ufg.br)

Max de Bayser

unread,
Nov 13, 2010, 4:09:56 PM11/13/10
to lua...@googlegroups.com
Marcello,

Pelo inicio do seu script, presumo que vc esteja no linux.
Para capturar teclas sem enter vc tem que colocar
o terminal em modo nao-bufferizado. Eu nao sei se ja existe
alguma biblioteca que faça isso em Lua, talvez vc tenha que
fazer uma pequena biblioteca em C e carregar ela no Lua.
Alguns exemplos de como fazer em C:
Abraços,

Max

Marcello Henrique

unread,
Nov 13, 2010, 8:57:19 PM11/13/10
to lua...@googlegroups.com
Olá Max,

Me esbarrei em um outro problema, eu gostaria de terminar o fluxo com
ESC (27) e usar as setas para criar um histórico, só que a seta para
cima e para baixo são respectivamente (27 91 65), (27 91 66) e
terminam o fluxo porque inicia com 27, me parece que o getchar captura
um byte de cada vez, tem ideia de uma saída para isso?

Abraços.

2010/11/13 Max de Bayser <maxde...@gmail.com>:

> --
> Lua BR - http://groups.google.com/group/lua-br

Max de Bayser

unread,
Nov 13, 2010, 9:34:43 PM11/13/10
to lua...@googlegroups.com
Posso estar enganado, mas na hora de ler um byte 27
talvez seja necessário fazer um select no standard input
para ver se existem mais caracteres para ler. Se houver,
tem que ler esses caracteres e ver se eles formam uma sequencia
correspondente às teclas das setas. Se não houver, o usuário
apertou esc mesmo. E tem que tomar cuidado com a frequencia
com que vc tenta ler caracteres. Idealmente o tempo entre duas
leituras deveria ser menor que o tempo de  repeticao das teclas

Talvez tenha solucoes mais simples. Achei alguns binds de curses
para lua:
Talvez com isso vc consiga evitar de ficar programando em baixo nivel
(que é muito divertido, mas deixa os programas mais dependentes de plataforma).
Abraços,

Max

Marcello Henrique

unread,
Nov 19, 2010, 6:06:59 AM11/19/10
to lua...@googlegroups.com
Olá Max,

Obrigado pelas respostas, só mais uma coisa, você tem mais referências
de como fazer esse select no input padrão, acho que isso resolve no
meu caso.

Abraços.

2010/11/14 Max de Bayser <maxde...@gmail.com>:

Max de Bayser

unread,
Nov 19, 2010, 7:36:46 AM11/19/10
to lua...@googlegroups.com
Em C é fácil, é só pegar o file descriptor 0 e usar como parâmetro
no select. No linux em geral você consegue ver a documentação
do select com "man select".
Abraços,

Max


Marcello Henrique

unread,
Nov 19, 2010, 7:45:16 AM11/19/10
to lua...@googlegroups.com
Meu "man select" é um manual de comandos SQL select(7)...

2010/11/19 Max de Bayser <maxde...@gmail.com>:

Max de Bayser

unread,
Nov 19, 2010, 8:02:36 AM11/19/10
to lua...@googlegroups.com
Que engraçado, qual é a sua distribuição? O select "certo" está na seção 3. Em geral o
google também procura man pages (eg "man  3 select"). Outra referência muito boa
é o manual da glibc http://www.gnu.org/software/libc/manual/, que em geral tem exemplos
e uma explicação menos minimalista que a man page.


Marcello Henrique

unread,
Nov 19, 2010, 8:27:32 AM11/19/10
to lua...@googlegroups.com
É um debian squeeze, provavelmente deve ter algum pacote que contém
essa man page.

Obrigado pelas referências.

2010/11/19 Max de Bayser <maxde...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages