Votre terminal est bête : voici comment le rendre intelligent
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é.
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 :
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.
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.
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
Cet alias utiliseBash
alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --"rsyncpour 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 brnchet que ça plante, je tapefuck(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.