Skip to content

Instantly share code, notes, and snippets.

@debxp
Created December 7, 2019 18:30
Show Gist options
  • Save debxp/2ee358f0bdc0467b6332551d08b9f61f to your computer and use it in GitHub Desktop.
Save debxp/2ee358f0bdc0467b6332551d08b9f61f to your computer and use it in GitHub Desktop.
LIVE CODING - Script: FuzzyFM
#!/usr/bin/env bash
# -----------------------------------------------------------
# Script : f2m.sh
# Description : Suckless file manager for CLI and GE
# Author : Blau Araujo <debxp.linux@gmail.com>
# Version : 0.01 (dev)
# Date : Dec 07, 2019
# License : GNU/GPL v3.0
# -----------------------------------------------------------
# Copyright Note:
#
# This program is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any
# later version.
#
# This program is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
# PURPOSE.
#
# See the GNU General Public License for more details:
#
# https://www.gnu.org/licenses/gpl-3.0.txt
# -----------------------------------------------------------
# Dependencies: bash, fzf, dmenu (suckless-tools)
# -----------------------------------------------------------
# [Sandbox] -------------------------------------------------
# fzf --reverse -e -i --tiebreak=begin <<< $fm_menu
# dmenu -i -l 15 -p "~/" <<< $fm_menu
# fm_home="$HOME"
# fm_root="/"
# fm_topmenu="\
# <: Pasta anterior --> só se existir um histórico de navegação
# >: Próxima pasta --> só se existir um histórico de navegação
# p: Pasta acima --> só se não estiver na raiz
# m: Marcadores --> só se existir algum marcador
# /: Raiz do sistema de arquivos
# h: Exibir/Ocultar arquivos invisíveis
# q: Sair
# "
# fm_dirs=$(for f in *; do [[ -d "$f" ]] && echo "$f/"; done)
# fm_dotdirs=$(for f in .*; do [[ -d "$f" ]] && echo "$f/"; done)
# fm_files=$(for f in *; do [[ -f "$f" ]] && echo "$f"; done)
# fm_dotfiles=$(for f in *; do [[ -f "$f" ]] && echo "$f"; done)
# PARA 11/12/2019 - 20:00H
#
# TODO #1 - Fazer a montagem das variáveis de arquivos e pastas
# numa passada só do FOR.
# TODO #2 - Evitar que listagens vazias insiram nova linha
# em branco no menu.
caminho="$HOME"
fm_dirs=$(for f in $caminho/*; do [[ -d "$f" ]] && echo "${f##*/}/"; done)
fm_dotdirs=$(for f in $caminho/.*; do [[ -d "$f" ]] && echo "${f##*/}/"; done)
fm_files=$(for f in $caminho/*; do [[ -f "$f" ]] && echo "${f##*/}"; done)
fm_dotfiles=$(for f in $caminho/.*; do [[ -f "$f" ]] && echo "${f##*/}"; done)
fm_menu="\
$fm_dotdirs
$fm_dirs
$fm_files
$fm_dotfiles
"
# dmenu -i -l 15 -fn "Monaco-16" -p "$caminho/" <<< $fm_menu
fzf --reverse -e -i --tiebreak=begin <<< $fm_menu
# [Help] ----------------------------------------------------
# [Checks] --------------------------------------------------
# [ ] UID - Não pode executar como root!
# [ ] Dependências
# [ ] Arquivo de configurações
# [ ] Argumentos
# [Sources] -------------------------------------------------
# [Environment] ---------------------------------------------
# [Functions] -----------------------------------------------
# [Modules] -------------------------------------------------
# [Main] ----------------------------------------------------

Fuzzy File Manager (f2m.sh)

Um gerenciador de arquivos "suckless" para terminal e ambientes gráficos.

Módulos básicos

[ ] Navegar entre as pastas
[ ] Bookmarks (pastas)
[ ] Raiz do sistema (navegação)
[ ] Abrir pasta no terminal
[ ] Abrir pasta no FM gráfico
[ ] Abrir arquivos de tipos conhecidos
[ ] Abrir com...
[ ] Histórico
[ ] Busca de pastas e arquivos

Módulos de gerenciamento

[ ] Abrir como root
[ ] Seleção múltipla
[ ] Criar pastas e arquivos (inc. a partir de modelos)
[ ] Mover pastas e arquivos
[ ] Renomear pastas e arquivos
[ ] Mover pastas e arquivos para a lixeira
[ ] Compactar arquivos (tar, zip e rar)
[ ] Descompactar arquivos

Módulo de configuração (~/.config/f2m/config)

[ ] Preferências (basicamente pastas)
[ ] Bookmarks
[ ] Aplicativos (abrir com, compactar, etc...)
[ ] Fontes e cores (dmenu)

Decisões do projeto

* Usar lib externa ao script?
* Menu de ações apenas após seleção?
* Como lidar com a opção de exibição de arquivos ocultos?
* Como lidar com as pastas pai (..)
* Ao sair, eliminar opções marcadas pendentes?
* Teremos uma opção "Desfazer"?
* O menu sempre abre na HOME?
* Que tal navegar máquinas remotas via SSH?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment