- Shell 89.4%
- Ruby 10.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| home | ||
| os/macos | ||
| .gitignore | ||
| Brewfile | ||
| install.sh | ||
| packages.txt | ||
| README.md | ||
dotfiles
Configuration shell pour Debian/Ubuntu (apt) et macOS (Homebrew). 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 # macOS : Homebrew doit déjà être installé
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é.
install.sh détecte l'OS : apt + packages.txt sur Linux, brew bundle +
Brewfile sur macOS. Les rares divergences (noms batcat/fdfind, chemins des
plugins zsh, symboles du prompt) sont gérées dans les fichiers eux-mêmes.
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, symboles texte (sans Nerd Font) |
os/macos/starship.toml |
même prompt, symboles Nerd Font — posé par install.sh sur macOS |
packages.txt / Brewfile |
listes de paquets (apt / brew) — c'est elles qu'on oublie sinon |
install.sh |
déploiement (Linux + macOS) |
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. Ce qui dépend de
l'OS (pas de la machine) reste versionné aussi : c'est
os/macos/, choisi parinstall.shselon la plateforme. - Non versionné —
~/.zshrc.localet~/.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*.localdu.gitignoren'est qu'un garde-fou, au cas où l'un d'eux atterrirait un jour danshome/. É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
Sur macOS, ~/.config/starship.toml pointe vers os/macos/starship.toml : si tu
touches à la structure du prompt, pense à répercuter dans
home/.config/starship.toml (starship ne fusionne pas deux fichiers).
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.