====== Editor de textos ASCII ======
Este projeto consiste em construir um editor de textos em terminal ASCII usando a biblioteca NCurses para gerenciar a interface com o usuário.
===== Funcionalidades =====
O programa deve implementar as seguintes funcionalidades:
* ler e escrever textos em arquivos de texto (''.txt'', ''.c'', ''.h'', etc)
* suportar textos de dimensões arbitrárias (milhares de linhas, centenas de colunas)
* navegar no texto usando as teclas de setas, //page up// e //page down//
* editar diretamente no texto, ao digitar teclas de caracteres
* implementar operações de cortar/copiar/colar usando um //clipboard//
* se adaptar às dimensões do terminal ao iniciar
* não precisa suportar acentos.
===== Controles =====
* Arquivos:
* ^S : salvar arquivo corrente
* ^R: ler novo arquivo
* Setas (←↑↓→) e //page up/down//: mover cursor
* Edição:
* Enter: nova linha
* DEL: deleta caractere sob o cursor
* //backspace//: deleta caractere anterior
* Cortar/Copiar/colar:
* ^space : marcar início do bloco de texto
* ^C: copiar bloco de texto (entre marca e cursor) para o //clipboard//
* ^X: recortar bloco de texto para o //clipboard//
* ^V: colar //clipboard// na posição atual do cursor
* Outros:
* ^F: busca uma string no texto
* ^Q: encerrar o programa (//quit//)
As operações de ler novo arquivo ou encerrar o programa devem perguntar se o usuário deseja salvar o conteúdo atual antes!
===== Forma de chamada =====
* ''mypad'' : abre um texto em branco (sem nome)
* ''mypad arq1.txt'': abre o arquivo ''arq1.txt''
===== Requisitos do código-fonte =====
* Ser escrito em C padrão (C99 ou similar)
* não gerar //warnings// ao usar flags ''-Wall''
* o executável deve se chamar ''mypad'' (de "//my Notepad//")
* o texto deve ser armazenado na memória usando alocação dinâmica (estruturas como listas encadeadas, [[https://en.wikipedia.org/wiki/Rope_(data_structure)|ropes]] ou [[https://en.wikipedia.org/wiki/Gap_buffer|gap buffers]] podem ser usadas).
* o código-fonte deve ser estruturado em vários arquivos. Por exemplo:
* ''mypad.c'' (programa principal)
* ''textfile.c'', ''textfile.h'' (lê/escreve arquivos TXT)
* ''clipboard.c'', ''clipboard.h'' (funções para manipular o //clipboard//)
* ...
* Ter um Makefile:
* alvos ''all'', ''clean'' e ''purge''
* compilação e ligação devem ser separadas
* Ler e tratar estes arquivos de teste:
* ... FIXME
===== Estrutura do código =====
A estrutura geral de programas interativos, como editores, jogos, etc, usa a seguinte estrutura geral:
início
inicializações
repita
desenha tela e posiciona cursor
ler entrada do teclado
processa entrada (atualiza estado interno)
até fim
finalizações
fim
Mais informações a respeito dessa estrutura podem ser obtidas em:
* [[https://web.archive.org/web/20161213145118/http://www.kathekonta.com:80/rlguide/]]
* [[https://gameprogrammingpatterns.com/game-loop.html]]
* [[https://brennan.io/2015/06/12/tetris-reimplementation/]]
* [[https://solarianprogrammer.com/2012/07/12/roguelike-game-cpp-11-part-1/]]
===== Material de apoio =====
Ncurses:
* [[http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/|Ncurses Programming Howto]] (leia **com atenção** a seção sobre inicialização)
* [[http://invisible-island.net/ncurses/ncurses-intro.html|Writing Programs with Ncurses]]
* [[http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html|Ncurses Programming Guide]]
* Exemplos do ncurses no Linux, em ''/usr/lib/ncurses/examples/'' (pacote ''ncurses-examples'')
* [[http://invisible-island.net/ncurses/ncurses-examples.html|Código-fonte]] do pacote ''ncurses-examples'' disponível no Debian e derivados (Ubuntu, Mint, etc).
Instalação da biblioteca NCurses no Linux (Ubuntu, Debian, Mint):
sudo apt-get install libncurses-dev
O código de inicialização da biblioteca NCurses, com as configurações necessárias para este projeto, é o seguinte:
initscr () ; // inicializa a biblioteca ncurses
raw () ; // permite tratar teclas de controle (^C, ^Z, etc)
keypad (stdscr, TRUE) ; // habilita leitura de teclas de setas, Fn, etc
noecho () ; // não escreve as teclas lidas na tela
curs_set (0) ; // esconde o cursor do terminal