Notícias:

SMF - Just Installed!

Menu principal

Biblioteca Terminal

Iniciado por adalberto, Setembro 02, 2017, 08:09:52 PM

tópico anterior - próximo tópico

adalberto

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

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:





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.

rafael

#1
Muito, bom.

é bem útil para montar ferramentas de trabalho rapidamente e visualmente intuitiva.