Script para rápida navegação em diretórios usando fzf
Este artigo apresenta um script para tornar a navegação em diretórios mais rápida, continuando a série sobre redução da complexidade cognitiva.
Frequentemente, é necessário navegar entre vários diretórios de um ou múltiplos projetos. Lembrar os caminhos e localizar arquivos torna-se um esforço desnecessário.
Uma solução é manter uma lista dos últimos diretórios acessados para alternar rapidamente entre eles. Dave Eddy implementou essa ideia em seu cdstack.
Inspirado nessa abordagem, criei minha versão mais adequada ao meu modo de trabalho.
#!/usr/bin/env bash
CD_STACK_MAX="${CD_STACK_MAX:-15}"
CD_STACK_LAST=""
declare -a _CD_STACK=("$PWD")
_cd_save_env() {
{
declare -p _CD_STACK
declare -p CD_STACK_LAST
} > ~/.cd_stack_fzf.tmp && \
mv ~/.cd_stack_fzf.tmp ~/.cd_stack_fzf
}
_cd_load_env() {
[[ -f ~/.cd_stack_fzf ]] && \
source ~/.cd_stack_fzf
}
cd() {
CD_STACK_LAST=${PWD}
builtin cd "$@" || return "$?"
_CD_STACK=("$CD_STACK_LAST" "${_CD_STACK[@]}")
[ "${#_CD_STACK[@]}" -gt "$CD_STACK_MAX" ] && \
unset '_CD_STACK[-1]'
_CD_STACK=($(printf "%s\n" "${_CD_STACK[@]}" | \
awk '!x[$0]++'))
_cd_save_env
return 0
}
b() {
_cd_load_env
cd "${CD_STACK_LAST}" || return "$?"
_cd_save_env
}
s() {
_cd_load_env
local selected
local formatted_dirs=()
for dir in "${_CD_STACK[@]}"; do
formatted_dirs+=("${dir/#"$HOME"/~}")
done
selected=$(printf '%s\n' "${formatted_dirs[@]}" | \
fzf --prompt=": " \
--height 40% \
--layout=reverse)
[[ -z "$selected" ]] && return 0
local dir="${selected/#\~/$HOME}"
cd "$dir" || return "$?"
return 0
}
_initialize_cd_stack_fzf() {
_CD_STACK=(
"/Users/crg"
"/Users/crg/Projects"
)
_cd_load_env
}
_initialize_cd_stack_fzf
Minha versão usa fzf para criar um menu, permitindo digitar alguns caracteres para selecionar o diretório desejado. Aliás, o fzf é uma ótima ferramenta para criar menus rápidos em shell script.
Para usar o script, coloque-o em um arquivo cd_stack_fzf.sh e carregue-o com o comando source na inicialização do terminal.
Após carregar o script, dois novos comandos estarão disponíveis:
- s: abre o menu com os últimos diretórios acessados.
- b: retorna ao diretório acessado anteriormente.
É possível alterar a variável _CD_STACK para definir uma lista de diretórios pré-carregada.
Existem várias maneiras de agilizar a navegação em diretórios, mas este script oferece uma solução eficiente e agradável em comparação com outras opções.