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

Código fonte

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.

Script rápido navegação em diretórios usando fzf

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.

Cesar Gimenes

Última modificação