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: <<baixar>>
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:
1 2 3 4 5 6 |
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:
1 2 |
local term = inclua'terminal'; term.defPadrao(); |
5 – Limpando a tela (cls no Win e clear no Linux):
1 2 |
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):
1 2 |
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) );
1 2 |
local term = inclua'terminal'; term.cursorInicio(); |
8 – Obtendo o tamanho do terminal:
1 2 3 4 |
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:
1 2 3 |
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:
1 2 3 |
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.
1 2 |
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.
1 |
term.ad_historico("comando string a ser gravado"); |
Exemplo de histórico:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//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:
Mesmo sem ter o readline é possível simular o histórico usando apenas as funções básicas do terminal, veja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
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.