bash/desafios/05/README.org
2025-08-17 10:17:15 -03:00

3.2 KiB

Shell Script na Prática

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:

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.

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:

DEFAULT_EDITOR=nano  # Editor padrão.
MENU=default         # O padrão é 'select' ou 'fzf' (se instalado).

# Configurações do menu com 'fzf':
fzf_options=(
...
)

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').