Dotfiles

Configuration personnelle pour zsh, zellij et spaceship, gérée avec GNU Stow et installée via un script d'automatisation.

Pourquoi ce projet

L'objectif est d'avoir un environnement shell reproductible en une commande sur n'importe quelle machine (Debian/Ubuntu), sans avoir à reconfigurer manuellement :

  • zsh avec une configuration personnalisée (.zshrc.perso) et le prompt Spaceship.
  • Zellij (multiplexeur de terminal, alternative à tmux) avec une config et des layouts prédéfinis, plus un système d'auto-attache à la session précédente à chaque ouverture de terminal (au lieu de repartir d'une session vierge à chaque fois).
  • Une poignée d'outils CLI en Rust (bat, bottom, diskus, procs) installés au passage.

Les fichiers de config sont gérés avec Stow plutôt que copiés directement : Stow crée des liens symboliques depuis ce dépôt vers leur emplacement final (~/.config/..., ~/.zshrc.perso, etc.). Ça permet de modifier les fichiers de config à un seul endroit (ce dépôt), de les versionner avec git, et de les synchroniser facilement entre plusieurs machines.

Contenu du dépôt

.
├── dotfiles/
│   ├── spaceship/
│   │   └── spaceship.zsh       # prompt zsh Spaceship
│   ├── zellij/
│   │   ├── config.kdl          # config principale zellij
│   │   └── layouts/
│   │       └── default.kdl     # layout par défaut
│   └── zsh/
│       └── zshrc.perso         # config zsh perso (linkée en ~/.zshrc.perso)
├── install/
│   └── install.sh              # script d'installation / mise à jour
└── README.md

Note

: dotfiles/ est un dépôt git séparé, à cloner manuellement à côté du dossier install/ avant de lancer le script (voir ci-dessous).

Prérequis

  • Une distribution Debian/Ubuntu (le script utilise apt).
  • Un accès sudo.
  • git installé pour cloner le dépôt dotfiles.

Le script installe lui-même le reste (rust/cargo, zellij, stow, etc.) s'ils sont absents.

Installation

1. Cloner ce dépôt et le dépôt de configuration

git clone <URL_DE_CE_DEPOT> mon-setup
cd mon-setup
git clone <URL_DU_DEPOT_DOTFILES> dotfiles

L'arborescence doit ressembler à celle décrite plus haut, avec dotfiles/ et install/ côte à côte.

2. Lancer le script d'installation

./install/install.sh

Le script est idempotent et non destructif : si une configuration existe déjà à l'endroit ciblé (~/.config/zellij, ~/.zshrc.perso, etc.), il ne touche à rien et passe à l'étape suivante plutôt que d'écraser quoi que ce soit. Pour forcer une réinstallation d'une config donnée, il faut supprimer manuellement le dossier/fichier concerné avant de relancer le script.

Ce que fait le script

  1. Installe les dépendances système (stow, zsh, curl, etc.) via apt.
  2. Installe Rust (rustup) si cargo n'est pas déjà disponible.
  3. Installe Zellij via cargo et lie sa configuration (~/.config/zellij) avec Stow.
  4. Crée le lien symbolique ~/.zshrc.perso vers dotfiles/zsh/zshrc.perso.
  5. Clone (ou met à jour) Spaceship et lie sa configuration (~/.config/spaceship) avec Stow.
  6. Installe des outils Rust additionnels : bat, bottom, diskus, procs, cargo-update.

Activer la config zsh perso

Le script crée le lien ~/.zshrc.perso, mais il faut le sourcer depuis ton ~/.zshrc principal pour qu'il soit pris en compte :

# à ajouter dans ~/.zshrc
[ -f ~/.zshrc.perso ] && source ~/.zshrc.perso

Auto-attache à la session Zellij précédente

Par défaut, ~/.zshrc.perso peut lancer une nouvelle session Zellij à chaque ouverture de terminal. Pour retrouver automatiquement la dernière session en cours (ou choisir parmi plusieurs), ajoute la fonction suivante dans ~/.zshrc.perso (ou dans le fichier zellij de dotfiles/zsh/) à la place d'un simple zellij :

zellij_autostart() {
  [[ -n "$ZELLIJ" ]] && return
  [[ -o interactive ]] || return

  local sessions
  sessions=$(zellij list-sessions --no-formatting 2>/dev/null)

  if [[ -z "$sessions" ]]; then
    zellij
    return
  fi

  local count
  count=$(printf '%s\n' "$sessions" | wc -l)

  if (( count == 1 )); then
    zellij attach "$(printf '%s\n' "$sessions" | cut -d' ' -f1)"
    return
  fi

  if command -v fzf >/dev/null 2>&1; then
    local choice
    choice=$(printf '%s\n' "$sessions" | fzf \
      --tac --height=40% --border \
      --prompt="Session zellij > " \
      --header 'Entrée: attacher | Ctrl-R: supprimer la session surlignée' \
      --bind 'ctrl-r:execute-silent(name=$(echo {} | cut -d" " -f1); zellij kill-session "$name" 2>/dev/null; zellij delete-session "$name" --force 2>/dev/null)+reload(zellij list-sessions --no-formatting 2>/dev/null)' \
      | cut -d' ' -f1)

    if [[ -n "$choice" ]]; then
      zellij attach "$choice"
    else
      zellij
    fi
  else
    print -P "%BSessions zellij disponibles :%b"
    local -a names
    local i=1
    while IFS= read -r line; do
      names+=("${line%% *}")
      printf "  %d) %s\n" "$i" "$line"
      ((i++))
    done <<< "$sessions"
    printf "  n) Nouvelle session\n"
    read "choix?Ton choix : "
    if [[ "$choix" == "n" || -z "$choix" ]]; then
      zellij
    elif (( choix >= 1 && choix <= ${#names[@]} )); then
      zellij attach "${names[$choix]}"
    else
      zellij
    fi
  fi
}

zellij_autostart
  • Une seule session existante → attache automatique, sans interaction.
  • Plusieurs sessions → sélection interactive (menu fzf si installé, sinon menu numéroté en fallback). Dans fzf, Ctrl-R supprime la session surlignée.
  • [[ -n "$ZELLIJ" ]] empêche la fonction de se redéclencher à l'intérieur d'une session déjà active (panneaux/onglets zellij).

fzf est optionnel mais recommandé pour une meilleure expérience :

sudo apt install fzf

Mettre à jour la configuration

Après avoir modifié un fichier dans dotfiles/, les changements sont immédiatement visibles (les fichiers cibles sont des liens symboliques). Il suffit de commit/push dans le dépôt dotfiles pour les partager avec d'autres machines :

cd dotfiles
git add -A
git commit -m "update config"
git push

Sur une autre machine, un git pull dans dotfiles/ suffit à récupérer les changements (pas besoin de relancer install.sh, sauf si un nouveau fichier a été ajouté).

S
Description
No description provided
Readme GPL-3.0
1.1 MiB
Languages
Shell 100%