No description
  • Shell 89.4%
  • Ruby 10.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-07 09:13:28 +02:00
home fix(vim): lever le veto skip_defaults_vim du vimrc système macOS (syntaxe + souris) 2026-10-07 09:13:28 +02:00
os/macos feat: support macOS (Homebrew) en plus de Debian/Ubuntu 2026-09-09 11:56:53 +02:00
.gitignore Ajouter ~/.vimrc et ignorer les résidus d'édition 2026-07-27 07:05:31 +00:00
Brewfile feat: support macOS (Homebrew) en plus de Debian/Ubuntu 2026-09-09 11:56:53 +02:00
install.sh feat: support macOS (Homebrew) en plus de Debian/Ubuntu 2026-09-09 11:56:53 +02:00
packages.txt Ajoute procs (complément de ps) 2026-07-28 08:22:15 +00:00
README.md feat: support macOS (Homebrew) en plus de Debian/Ubuntu 2026-09-09 11:56:53 +02:00

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 par install.sh selon la plateforme.
  • 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

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.