No description
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
vlebert d1f2dbc81e zsh: disable EXTENDED_GLOB (more bugs than benefits)
EXTENDED_GLOB (^pattern, ~pattern, (#i)…) n'est utilisé nulle part dans les
dotfiles ni les alias. En revanche il transforme grep ^FOO (pattern non-quoté)
en glob « tout sauf FOO » → échec silencieux, variables vides, bugs difficiles
à diagnostiquer. Pour le globbing avancé on utilise fd/rg/find, pas le shell.
2026-08-27 22:32:12 +02:00
home zsh: disable EXTENDED_GLOB (more bugs than benefits) 2026-08-27 22:32:12 +02:00
.gitignore Ajouter ~/.vimrc et ignorer les résidus d'édition 2026-07-27 07:05:31 +00:00
install.sh Config shell : zsh, starship, fzf, zoxide, tmux 2026-07-24 21:14:09 +00:00
packages.txt Ajoute procs (complément de ps) 2026-07-28 08:22:15 +00:00
README.md Ajoute procs (complément de ps) 2026-07-28 08:22:15 +00:00

dotfiles

Configuration shell pour Debian/Ubuntu. Tout vient d'apt — aucun curl | sh, aucun framework (pas d'oh-my-zsh, pas de TPM), aucune dépendance à compiler.

Déployer sur une machine neuve

git clone <ce-dépôt> ~/.dotfiles
~/.dotfiles/install.sh
exec zsh

Le script installe les paquets, pose les liens symboliques, crée les fichiers locaux et bascule le shell par défaut. Il est idempotent : relançable sans risque. Un fichier existant qui gênerait est sauvegardé en .backup-<date>, jamais écrasé.

Contenu

Fichier Rôle
home/.zshrc zsh : historique, complétion, raccourcis, alias, aide-mémoire cheat
home/.tmux.conf tmux : préfixe Ctrl-A, souris, découpes | et -, barre de statut
home/.config/starship.toml prompt sur 2 lignes, sans Nerd Font requise
packages.txt la liste des paquets — c'est elle qu'on oublie sinon
install.sh déploiement

Outils : starship (prompt), fzf (recherche floue), zoxide (z = saut de dossier), eza / bat / fd / ripgrep (remplaçants de ls / cat / find / grep), procs (complément de ps, en commande directe — volontairement pas d'alias, voir plus bas).

Universel contre spécifique à la machine

C'est la règle qui fait tenir l'ensemble dans la durée :

  • Versionné — ce qui vaut sur n'importe quelle machine.
  • Non versionné~/.zshrc.local et ~/.tmux.conf.local, sourcés en fin de config. Ils vivent dans $HOME, hors de ce dépôt : c'est ce qui les tient à l'écart de git. Le motif *.local du .gitignore n'est qu'un garde-fou, au cas où l'un d'eux atterrirait un jour dans home/. Étiquette de machine, tokens, chemins propres au serveur, alias liés à un projet hébergé là.

Concrètement, l'étiquette [vps-digi] du prompt et de la barre tmux vient de ces fichiers locaux. Sur une autre machine, install.sh la remplit avec le hostname réel — pas de « vps-digi » qui suit d'un serveur à l'autre.

Ne jamais versionner : ~/.ssh/ (clés privées), ~/.zsh_history (contient souvent des secrets passés en argument), ~/.local/share/zoxide/db.zo, ~/.cache/.

Alias et agents (Claude Code & assimilés)

Ces outils exécutent leurs commandes dans un shell qui source cette config, via un « shell snapshot » régénéré à chaque session. Le snapshot bash purge les alias (unalias -a en tête) ; le snapshot zsh, non.

D'où le bloc if [[ -z $CLAUDECODE ]] autour des alias qui remplacent ls et cat : côté agent, le format de sortie reste celui de coreutils.

Aucun alias de confirmation ici (rm -I, cp -i, mv -i), et c'est délibéré. Mesuré sur cette machine, l'entrée standard d'un agent n'étant pas un terminal, la question reçoit EOF — ce qui vaut « non » :

Commande Code de sortie Effet
rm -I sur 1 à 3 fichiers 0 supprimés
rm -I sur 4 fichiers ou plus 0 aucun supprimé
cp -i sur une cible existante 1 non écrasée

Pas de blocage donc, mais pire : un rm qui échoue en annonçant un succès. set -e ne se déclenche pas, l'appelant enchaîne sur un dossier qu'il croit vide.

Ça vaut au-delà des agents — cron, CI, tout script sourçant cette config. Règle générale : un alias qui rend une commande destructrice dépendante d'un humain est un piège en automatisation, puisque son code de sortie prétend l'inverse.

D'où le bloc conditionnel dans .zshrc :

if [[ -z $CLAUDECODE ]]; then
  alias rm='rm -I'   # et cp -i, mv -i, ls→eza, cat→bat
fi

La règle générale : tout alias qui pose une question ou change un format de sortie va dans ce bloc. Les raccourcis inoffensifs (.., gs, df -h) restent en dehors. À garder en tête en ajoutant un alias.

Exception délibérée : procs n'est pas aliasé sur ps. Contrairement à eza/bat qui acceptent globalement les mêmes flags que ls/cat, procs a sa propre syntaxe (ps aux, ps -ef -o pid,cmd n'ont pas d'équivalent direct). Un alias casserait tout réflexe ou script tapant ps aux | grep foo ou kill $(ps aux | grep foo | awk '{print $2}'). procs reste donc une commande à part, jamais un remplacement transparent.

Modifier la config

Les fichiers de $HOME sont des liens vers ce dépôt. Éditer ~/.zshrc édite donc directement ~/.dotfiles/home/.zshrc — il ne reste qu'à commiter.

cd ~/.dotfiles && git add -A && git commit -m "..." && git push

Mémo

cheat dans le terminal affiche les raccourcis. Il s'adapte au contexte : hors tmux il rappelle comment démarrer une session, dedans il liste les raccourcis de panneaux.