Aller au contenu principal

Votre terminal est bête : voici comment le rendre intelligent

Historique contextuel, autocomplétion Docker, switch PHP automatique... Découvrez comment transformer une fenêtre noire en véritable assistant de code.

Publié le

Temps de lecture 4 min

Le terminal n'est pas juste une fenêtre noire avec du texte blanc, il en devient presque une voix dans votre tête tellement vous en attendez beaucoup. Après des années à peaufiner mon environnement, mon fichier .zshrc est passé du simple fichier de configuration à une véritable oeuvre d’art.

Aujourd’hui, je vous propose de découvrir les scripts qui automatisent la pénibilité (PHP, Node), des alias qui corrigent vos erreurs, et des intégrations qui rendent Docker enfin agréable à utiliser.

L’historique intelligent

La première source de frustration dans un terminal par défaut est sa mémoire de poisson rouge. Je vais vous donner quelques scripts que j’utilise au quotidien.

La recherche comme votre âme soeur qui termine vos phrases

Vous connaissez la douleur d'appuyer 50 fois sur la flèche du haut pour retrouver une commande ? J'ai mappé les flèches pour qu'elles cherchent en fonction de ce que j'ai déjà tapé.

Bash
autoload -U up-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search  # Flèche Haut

Si je tape git commit et que j'appuie sur Flèche Haut, Zsh ignore les 50 commandes cd ou ls récentes et me retrouve instantanément mon dernier commit, même s'il date d'il y a 3 jours.

L'autocomplétion tolérante

Fini d'appuyer sur TAB à l'aveugle. J'ai activé le menu select et l'insensibilité à la casse.

  • Je tape cd doc ➔ Il trouve Documents.
  • Une liste interactive s'affiche, et je peux naviguer dedans avec les flèches.

Docker + FZF

Docker est puissant, mais devoir copier-coller des ID de conteneurs (a1b2c3d4...) est une torture. J'ai résolu ça en combinant Docker avec FZF (Fuzzy Finder).

Regardez cet alias, c'est probablement le plus utile du fichier pour un utilisateur Docker :

Bash
alias dexec='docker exec -it $(docker ps --format "{{.Names}}" | fzf) sh'

Comment ça marche ?

  • Je tape dexec.
  • La liste de mes conteneurs actifs s'affiche.
  • Je tape quelques lettres du nom (ex: "postg").
  • Je valide, je suis connecté en shell dans le conteneur.

J'ai appliqué la même logique pour le nettoyage avec drm. Grâce au flag -m de FZF, je peux même sélectionner plusieurs conteneurs avec la touche TAB et tous les supprimer d'un coup.

L’automatisation invisible : Node.js et PHP

C'est ici que le .zshrc passe du statut "pratique" au statut "magique". Pourquoi changer de version de langage manuellement ?

NVM

Je ne tape jamais nvm use. J'ai ajouté un hook sur la commande chpwd (qui se déclenche quand on change de dossier).

Le script détecte si un fichier .nvmrc est présent dans le dossier où j'arrive.

  • Si oui : Il bascule automatiquement sur la bonne version de Node (et l'installe si besoin).
  • Si non : Il revient à la version par défaut si je quitte le projet.
Bash
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
autoload -U add-zsh-hook
load-nvmrc() {
    local node_version="$(nvm version)"
    local nvmrc_path="$(nvm_find_nvmrc)"
    if [ -n "$nvmrc_path" ]; then
        local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
        if [ "$nvmrc_node_version" = "N/A" ]; then
            nvm install
        elif [ "$nvmrc_node_version" != "$node_version" ]; then
            nvm use
        fi
    elif [ "$node_version" != "$(nvm version default)" ]; then
        echo "Reverting to nvm default version"
        nvm use default
    fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc

Fini les erreurs de build parce que vous étiez resté sur Node 14.

Le sélecteur PHP dynamique

Gérer les versions PHP avec Homebrew (brew link/unlink) est fastidieux. J'ai une boucle qui scanne les versions installées et génère dynamiquement des alias.

Bash
if command -v brew >/dev/null 2>&1 && command -v ggrep >/dev/null 2>&1; then
    installedPhpVersions=($(brew ls --versions | ggrep -E 'php(@.*)?\s' | ggrep -oP '(?<=\s)\d\.\d' | uniq | sort))
    for phpVersion in ${installedPhpVersions[*]}; do
        value="{"
        for otherPhpVersion in ${installedPhpVersions[*]}; do
            if [ "${otherPhpVersion}" = "${phpVersion}" ]; then
                continue;
            fi
            value="${value} brew unlink php@${otherPhpVersion};"
        done
        value="${value} brew link php@${phpVersion} --force --overwrite; } &> /dev/null && php -v"
        alias "${phpVersion}"="${value}"
    done
fi

Si j'ai PHP 7.4 et 8.2 installés, le script crée automatiquement les commandes 7.4 et 8.2. En tapant simplement 8.2, le script :

  • Délie toutes les autres versions.
  • Lie la version 8.2.
  • M’affiche la version active.

La boîte à outils

Pour finir, voici quelques alias pour dompter macOS et le quotidien :

  • cpv
    Bash
    alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --"
    
    Cet alias utilise rsync pour afficher une barre de progression. Le détail qui tue ? L'option --backup-dir : si j'écrase un fichier par erreur, une copie de l'original est sauvegardée dans /tmp.
  • update : La routine café du matin. Met à jour macOS, Homebrew, nettoie les caches et vérifie la santé du système en une seule commande.
    Bash
    alias update='sudo softwareupdate -i -a; brew update; brew upgrade; brew cleanup; brew doctor;'
    
  • flushdns : Indispensable pour les développeurs web quand le réseau local fait des siennes.
    Bash
    alias flushdns="sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder"
    

Le droit à l'erreur

On est humains, on fait des fautes de frappe.

  • The Fuck : Si je tape git brnch et que ça plante, je tape fuck (aliasé via l'outil). Il analyse l'erreur, devine ce que je voulais dire ("Did you mean git branch?"), corrige et exécute.
  • Zsh Autosuggestions : Il m'affiche en gris clair la fin de la commande que je suis en train de taper, basé sur mon historique. C'est comme de l'autocomplétion prédictive.

Le mot de la fin

Ce .zshrc est le résultat de centaines de petites frustrations transformées en solutions. Il utilise Oh My Posh avec le thème Catppuccin Frappe pour le look, mais le vrai trésor réside dans ces scripts.

N'hésitez pas à copier le script NVM ou l'alias Docker. Votre terminal doit travailler pour vous, pas l'inverse.

Le code est dans la boîte !

Recevez les nouveaux billets directement dans votre boîte mail. Juste l'essentiel, promis.

Désinscription possible à tout moment.