Este é um módulo prisma em C com funções básicas para o terminal (ou cmd do Win);
Funções como mudança de título, de cor, coordenada do cursor, captura de tecla sem precisar pressionar o Enter etc.
Está incluso em Prisma-1.0.102 ou superior (Linux e Win)
Caso queira baixar os fontes clique aqui: http://www.mediafire.com/file/fzzp1em3pzk902b/terminal.7z (http://www.mediafire.com/file/fzzp1em3pzk902b/terminal.7z)
Obs. Se já baixou Prisma-1.0.102 ou superior para Windows não precisará compilar pois já está disponível terminal.dll, em Linux é preciso, visto que só está disponível os fontes da versão 1.0.104.
Para compilar em Linux, descompacte o arquivo terminal.7z entre na pasta terminal e execute compila.sh. Necessita ter instalado a lib em C Readline para as funções term.leia() e term.ad_historico(). Caso não queira compilar usando o Readline, abra o arquivo terminal.c, na linha 37 apague as duas barras // em //#define _NO_READLINE. Abra também o script compila.sh e apague -lreadline em libs=" -lreadline "; deixando assim: libs=" ";
Vamos aos exemplos:
Para incluir use: local term = inclua'terminal';
1 - Imprimindo a versão da lib:
imprima(term.versao) //--> lib terminal-1.0.2
2 - Mudando o título da janela do terminal:
term.defTitulo('Mudei o Título');
Observe que mudou o título do terminal.
3 - Mudando a cor de fundo e da letra:
local term = inclua'terminal'
term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');
Obs.: veja as cores disponíveis no final no item 11.
4 - Voltando ao padrão - cor da letra e cor de fundo default:
local term = inclua'terminal';
term.defPadrao();
5 - Limpando a tela (cls no Win e clear no Linux):
local term = inclua'terminal';
term.limpeTela();
6 - Definindo uma nova posição para o cursor do terminal (cursor de escrita, não o do mouse):
local term = inclua'terminal';
term.cursorPos(1,2); //posiciona o cursor em 1x2
Coloca o cursor na linha: 1 e na segunda letra.
7 - Colocando o cursor no início: (o mesmo que term.cursorPos(1,1) );
local term = inclua'terminal';
term.cursorInicio();
8 - Obtendo o tamanho do terminal:
local term = inclua'terminal';
alt, larg = term.tamanho();
imprima("Altura:",alt, "Largura:",larg);
leia();
Obs.: Alt = número de linhas na escrita. Larg = número de letras na horizontal. Portanto não é o tamanho da janela, mas do espaço de escrita.
9 - Obtendo uma tecla pressionada (semelhante ao leia() ) sem precisar pressionar ENTER, a tecla aparece digitada no terminal:
local term = inclua'terminal';
s = term.obtCari(); //obtem a tecla
imprima('-->',car(s));
Esta função deixa visível a tecla pressionada.
10 - Obtendo uma tecla pressionada sem precisar pressionar ENTER, a tecla não aparece no terminal:
local term = inclua'terminal';
s = term.obtCar(); //obtem a tecla
imprima('-->',car(s));
Detalhe: o retorno é um número da tecla, portanto use a função car(s) para converter para caractere.
Caso você tenha compilado com a lib Readline estará disponível (somente em Linux) duas funções extras:
Extra 1: função term.leia(); igual a função leia() mas permite passar um texto como prompt e além disso torna possível buscar um histórico de comandos digitados usando as teclas: cima / baixo. (up, down) do teclado.
x = term.leia('Digite seu nome:>>> ');
//--> Digite seu nome: >>>|
Extra 2: função para criar um histórico dos textos digitados anteriormente, sem ele não é possível usar as teclas cima/baixo para buscar o histórico.
term.ad_historico("comando string a ser gravado");
Exemplo de histórico:
local term = inclua'term'
local imprima=imprima;
se sis.nome:procure'win' entao
local win=inclua'win';
//win.poe'dentro';
local conv_c = conv_c;
imprima=funcao(...)
//poe'dentro';
local t = {...};
para i,v em ipares(t) inicio
es.escreva(conv_c(v),'\t');
fim
poe'';
fim
fim
//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux
//vou tentar fazer para windows no futuro.
//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.
//essas funções não surtem efeito no windows, apenas para compatibilidade;
enquanto c <> 's' e c <> 'S' inicio
c = term.leia('digite algo: ');
term.ad_historico(c);//com as teclas seta acima e seta abaixo é possivel pegar os ultimos comandos digitados.
imprima('\nuse seta acima ou abaixo para ver o histórico\n');
imprima('Você digitou:', c);
fim
11 - Cores disponíveis:
term.preto.
term.azulclaro
term.verdeclaro
term.cianoclaro
term.vermelhoclaro
term.magentaclaro
term.amareloclaro
term.cinzaclaro
term.cinza
term.azul
term.verde
term.ciano
term.vermelho
term.magenta
term.amarelo
term.branco
Exemplo de código:
//teste da biblioteca
inclua'terminal'; //esta biblioteca inclui também a terminal
local imprima=imprima;
se sis.nome:procure('win') entao
local win=inclua'win';
//win.poe'dentro';
local conv_c = conv_c;
imprima=funcao(...)
//poe'dentro';
local t = {...};
para i,v em ipares(t) inicio
es.escreva(conv_c(v),'\t');
fim
poe'';
fim
fim
//poe(conv_c('olá'));
//leia();
term.defCorfundo(term.branco);
term.defCorletra(term.preto);
imprima('Cor de fundo branco');
term.defCorletra(term.verde);
imprima('Letra em cor verde');
term.defCorletra(term.vermelho);
imprima("Letra em cor Vermelha");
term.defPadrao(); //volta a cor padrao
imprima('Cmd voltou ao padrão');
term.cursorPos(1,2); //posiciona o cursor em 1x2
leia(); //pressione enter para sair;
Recorte de tela:
(http://i2.wp.com/linguagemprisma.br4.biz/blog/wp-content/uploads/2017/09/terminal.png?resize=238%2C120)
Mesmo sem ter o readline é possível simular o histórico usando apenas as funções básicas do terminal, veja:
local term = inclua'terminal'
local index=1;
local tab={};
funcao AdHistorico(s)
tab[#tab+1]=s;
index = #tab;
fim
funcao Prompt(s)
es.escreva(s);
local tam = #s;
local ret, x = '';
enquanto 1 inicio
x = term.obtCar();
se x == 27 entao
x = term.obtCar();
se x == 91 entao
x = term.obtCar();
se car(x) == 'A' entao
se index < 1 entao index = 1; fim
se index > #tab entao index = #tab; fim
local ss = string.nconcat(' ',tam);
es.escreva('\r' .. ss);
es.esvazie();
es.escreva(string.formate("\r%s%s",s,tab[index]));
es.esvazie();
tam = #s + #tab[index];
index = index + 1;
senaose car(x) =='B' entao
se index < 1 entao index = 1; fim
se index > #tab entao index = #tab; fim
local ss = string.nconcat(' ',tam);
es.escreva('\r' .. ss);
es.esvazie();
es.escreva(string.formate("\r%s%s",s,tab[index]));
es.esvazie();
tam = #s + #tab[index];
index = index - 1;
fim
fim
senaose car(x) == '\n' ou x == '\r' entao
poe'';
retorne ret;
senaose x == 127 entao
ret = string.corte(ret,1,#ret -1);
local ss = string.nconcat(' ',tam);
es.escreva('\r' .. ss);
es.esvazie();
es.escreva(string.formate("\r%s%s",s,ret));
es.esvazie();
tam = #s + #ret;
senao
es.escreva(car(x));
ret = ret .. car(x);
tam = #s + #ret;
fim
fim
fim
enquanto 1 inicio
a = Prompt("Digite algo: ");
AdHistorico(a);//guarda no histórico
poe(a);
fim
Usamos uma tabela prisma para formar o histórico.
Use as teclas cima/baixo do teclado para ver o histórico digitado anteriormente.
Criando uma função que lê senhas:
local term = inclua'term';
//a lib term.pris é uma biblioteca feita em prisma com funções para mudar cor do terminal.
//quando ela é incluída, inclui automaticamente a lib terminal.so
//essa biblioteca devera crescer e conter funcoes para manipulacao em terminal linux
//vou tentar fazer para windows no futuro.
//uma funcao interessante é obter um caractere digitado sem precisar pressionar enter.
funcao leia_senha(s,dig)
local dig = dig ou '*';
local tam = #s;
local novalin = 10;
se sis.nome=='win32' entao novalin=13; fim
es.escreva(s);
local senha = '';
enquanto 1 inicio
local x = term.obtcar();//não aparece a letra quando você digita no terminal
//imprima(x);
se (x >= 97 e x <= 122 ) ou (x>=32 e x<=90) entao
//poe'dentro';
senha = senha .. car(x);
tam = #s + #senha;
es.escreva(dig);
senaose x == 127 entao //backspace
senha = string.corte(senha,1,#senha -1);
local ss = string.nconcat(' ',tam);
local sss = string.nconcat(dig,#senha);
es.escreva('\r' .. ss);
es.esvazie();
es.escreva(string.formate("\r%s%s",s,sss));
es.esvazie();
tam = #s + #senha;
senaose x == novalin entao
retorne senha;
fim
fim
fim //fim função
imprima('\n\nSua senha é:', leia_senha("Digite sua senha: ",'*') );
Por enquanto é isso.
Falou, pessoal, até a próxima.
Muito, bom.
é bem útil para montar ferramentas de trabalho rapidamente e visualmente intuitiva.