#+title: Shell Script na Prática #+author: Blau Araujo #+email: blau@debxp.org * Desafio 5: Menu de favoritos ** Objetivos - Manipulação de arquivos (inclusão, edição e exclusão de linhas) - Casamento de padrões de texto - Separação de linhas em campos ** Enunciado Criar um programa que gerencie uma lista de arquivos frequentemente editados no terminal, como arquivos de configurações, anotações ou scripts. O programa será chamado de ~bm~ (de /bookmark/) e deve implementar as seguintes instruções de uso: #+begin_example Bookmark (bm) - Gerenciador de arquivos favoritos USO: bm [OPÇÕES] [PADRÃO] Quando executado sem argumentos, exibe o menu para seleção do arquivo que deverá ser aberto no editor de texto. Sem OPÇÕES, abre no editor de texto o arquivo cujo nome casar com PADRÃO. Se houver mais de um casamento, o menu de seleção será exibido listando apenas os casamentos encontrados. OPÇÕES: -a CAMINHO[:DESCRIÇÃO] Inclui o arquivo em CAMINHO com uma DESCRIÇÃO opcional. -l [PADRÃO] Lista os arquivos que casam com o PADRÃO. Se não for informado um PADRÃO, todos os arquivos serão listados. -e [PADRÃO] Edita a entrada que casa com o PADRÃO. Caso não seja informado um PADRÃO, ou se houver mais de um casamento, o menu de seleção será exibido. -r [PADRÃO] Remove a entrada que casa com PADRÃO. Caso não seja informado um PADRÃO, ou se houver mais de um casamento, o menu de seleção será exibido. -h, --help Exibe esta ajuda. -v, --version Exibe informações de versão e licença. #+end_example ** Sobre o menu de seleção Este desafio não tem evoluções. Em vez disso, o programa deve ser capaz de utilizar os seguintes menus: *** Se invocado no terminal - Menu ~select~ (padrão) - Menu com ~fzf~ (padrão, se instalado) *** Se invocado no ambiente gráfico No ambiente gráfico (por exemplo, invocado por um lançador), só será dada a opção de selecionar uma entrada para abertura no editor. Selecionada a entrada, o terminal será aberto com o arquivo carregado no editor padrão. Neste caso, o menu poderá ser: - Abre um terminal e exibe o menu (padrão) - Menu ~dmenu~ (se instalado) - Menu ~rofi~ (se instalado) Para uso no ambiente gráfico com ~rofi~ ou ~dmenu~ (ou qualquer outro, como um diálogo do YAD, por exemplo), será necessário definir uma configuração no arquivo =~/.config/bm/config=. ** Opções de configuração O arquivo de configuração (=~/.config/bm/config=) deve conter as seguintes definições: #+begin_example DEFAULT_EDITOR=nano # Editor padrão. MENU=default # O padrão é 'select' ou 'fzf' (se instalado). # Configurações do menu com 'fzf': fzf_options=( ... ) #+end_example Para utilizar outros menus, além dos nomes de seus executáveis em ~MENU~, deve ser criado um vetor com as sus opções de linha de comando (como feito para o 'fzf').