From a17efb819ff4c31e0b6f6d6410fcbb6dd69bc844 Mon Sep 17 00:00:00 2001 From: Anael Ginder Date: Fri, 18 Sep 2026 15:59:25 +0200 Subject: [PATCH] refractor(dotfile): divers amelioration --- README.md | 126 ++++++++++++++++++++++--------------------- install/install.sh | 130 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 172 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 864bfab..e5280aa 100644 --- a/README.md +++ b/README.md @@ -1,103 +1,107 @@ # Dotfiles -Configuration personnelle pour zsh, zellij et spaceship, gérée avec [GNU Stow](https://www.gnu.org/software/stow/) et installée via un script d'automatisation. +Configuration personnelle de Zsh, Zellij et Spaceship, gérée avec [GNU Stow](https://www.gnu.org/software/stow/) et installée automatiquement sur Debian/Ubuntu. -## Pourquoi ce projet +## Structure -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](https://github.com/spaceship-prompt/spaceship-prompt). -- **[Zellij](https://zellij.dev/)** (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 - -Le dépôt est cloné dans `~/.dotfiles` (dossier caché, à créer manuellement) et contient : - -``` +```text ~/.dotfiles/ ├── dotfiles/ -│ ├── spaceship/ -│ │ └── spaceship.zsh # prompt zsh Spaceship │ ├── zellij/ -│ │ ├── config.kdl # config principale zellij -│ │ ├── layouts/ -│ │ │ └── default.kdl # layout par défaut -│ │ └── plugins/ -│ │ └── monocle.wasm # plugin zellij +│ │ └── dot-config/ +│ │ └── zellij/ +│ │ ├── config.kdl +│ │ ├── layouts/ +│ │ │ └── default.kdl +│ │ └── plugins/ +│ │ └── monocle.wasm │ └── zsh/ -│ └── zshrc.perso # config zsh perso (linkée en ~/.zshrc.perso) +│ ├── dot-zsh/ +│ │ └── spaceship.zsh +│ ├── dot-zshrc +│ └── dot-zshrc.perso ├── install/ -│ └── install.sh # script d'installation / mise à jour +│ └── install.sh +├── LICENSE └── README.md ``` -Le sous-dossier `dotfiles/` regroupe les packages Stow (un dossier par outil configuré). `install/install.sh` s'appuie sur sa propre position pour retrouver ce sous-dossier, donc l'ensemble fonctionne quel que soit l'endroit exact où `~/.dotfiles` est cloné. +L'option `--dotfiles` de Stow transforme automatiquement les fichiers `dot-*` en fichiers cachés : -## 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. +```text +dot-zshrc → ~/.zshrc +dot-zshrc.perso → ~/.zshrc.perso +dot-zsh → ~/.zsh/ +``` ## Installation -### 1. Cloner ce dépôt - ```bash git clone https://gitlabns.nameshield.net/an.ginder/dotfiles.git ~/.dotfiles cd ~/.dotfiles -``` - -### 2. Lancer le script d'installation - -```bash ./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. +Le script installe : -### Ce que fait le script +- les dépendances système (`zsh`, `stow`, `fzf`, `zoxide`, etc.) ; +- Rust/Cargo si nécessaire ; +- Zellij via Cargo ; +- Spaceship dans `~/.zsh/spaceship-prompt` ; +- les outils Rust `bat`, `bottom`, `diskus`, `procs` et `cargo-update` ; +- les configurations avec Stow. -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`. +## Gestion des fichiers existants -## Activer la config zsh perso +L'installation est non destructive. +Si un fichier existe déjà : -Le script crée le lien `~/.zshrc.perso`, mais il faut le sourcer depuis ton `~/.zshrc` principal pour qu'il soit pris en compte : +- un symlink correct est conservé ; +- un fichier ou symlink différent est sauvegardé avant l'installation. -```bash -# à ajouter dans ~/.zshrc -[ -f ~/.zshrc.perso ] && source ~/.zshrc.perso +Les backups sont placés dans : + +```text +~/.dotfiles-backup/YYYYMMDD-HHMMSS/ ``` -## Auto-attache à la session Zellij précédente +## Après installation -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` : +Les configurations sont des symlinks vers le dépôt : +```bash +readlink -f ~/.zshrc +readlink -f ~/.config/zellij/config.kdl +``` -- 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). +Les modifications effectuées dans `dotfiles/` sont donc immédiatement prises en compte. -## Mettre à jour la configuration - -Après avoir modifié un fichier dans `dotfiles/` (`dotfiles/zellij/config.kdl`, `dotfiles/zsh/zshrc.perso`, etc.), les changements sont immédiatement visibles (les fichiers cibles sont des liens symboliques). Il suffit de commit/push pour les partager avec d'autres machines : +Pour mettre à jour le dépôt : ```bash cd ~/.dotfiles +git pull +``` + +Pour sauvegarder ses modifications : + +```bash 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 de config a été ajouté). +## Stow manuellement +Réinstaller les configurations : + +```bash +cd ~/.dotfiles/dotfiles +stow --dotfiles --restow --target="$HOME" zsh zellij +``` + +Simuler l'opération : + +```bash +stow --dotfiles --restow --simulate --verbose --target="$HOME" zsh zellij +``` \ No newline at end of file diff --git a/install/install.sh b/install/install.sh index dd2dc06..0c1a713 100755 --- a/install/install.sh +++ b/install/install.sh @@ -69,12 +69,12 @@ if ! command -v cargo >/dev/null 2>&1; then fi # ------------------------------------------------------------ -# Spaceship prompt +# Spaceship # -# Le logiciel est installé séparément dans : +# Logiciel : # ~/.zsh/spaceship-prompt # -# La configuration personnelle est gérée par Stow : +# Configuration : # ~/.zsh/spaceship.zsh # ------------------------------------------------------------ @@ -100,7 +100,7 @@ else fi # ------------------------------------------------------------ -# Migration des configurations existantes +# Backup # ------------------------------------------------------------ create_backup_dir() { @@ -118,28 +118,65 @@ create_backup_dir() { log "Backup créé dans : $BACKUP_DIR" } +backup_path_for() { + local target="$1" + local relative_path + + relative_path="${target#"$HOME"/}" + + printf '%s/%s\n' "$BACKUP_DIR" "$relative_path" +} + backup_if_needed() { local target="$1" + local expected_source="$2" - # Rien n'existe : Stow pourra créer le lien. + # Rien n'existe. if [[ ! -e "$target" && ! -L "$target" ]]; then + log "Absent, Stow va le créer : $target" return fi - # C'est déjà un symlink. - # On ne le déplace pas et on laisse Stow le gérer. + # -------------------------------------------------------- + # Symlink + # -------------------------------------------------------- + if [[ -L "$target" ]]; then - log "Symlink déjà présent : $target" + local current_source + + current_source="$(readlink -f "$target")" + expected_source="$(readlink -f "$expected_source")" + + if [[ "$current_source" == "$expected_source" ]]; then + log "Symlink déjà correct : $target" + return + fi + + warn "Symlink existant mais incorrect : $target" + warn " actuel : $current_source" + warn " attendu : $expected_source" + + create_backup_dir + + local backup_path + backup_path="$(backup_path_for "$target")" + + mkdir -p "$(dirname "$backup_path")" + + log "Backup du symlink : $target -> $backup_path" + + mv -- "$target" "$backup_path" return fi + # -------------------------------------------------------- + # Fichier ou répertoire normal + # -------------------------------------------------------- + create_backup_dir - local relative_path - relative_path="${target#"$HOME"/}" - local backup_path - backup_path="$BACKUP_DIR/$relative_path" + backup_path="$(backup_path_for "$target")" mkdir -p "$(dirname "$backup_path")" @@ -148,18 +185,38 @@ backup_if_needed() { mv -- "$target" "$backup_path" } +# ------------------------------------------------------------ +# Migration des dotfiles +# ------------------------------------------------------------ + migrate_dotfiles() { log "Vérification des configurations existantes..." # Zsh - backup_if_needed "$HOME/.zshrc" - backup_if_needed "$HOME/.zshrc.perso" - backup_if_needed "$HOME/.zsh/spaceship.zsh" + backup_if_needed \ + "$HOME/.zshrc" \ + "$DOTFILES_DIR/zsh/dot-zshrc" + + backup_if_needed \ + "$HOME/.zshrc.perso" \ + "$DOTFILES_DIR/zsh/dot-zshrc.perso" + + backup_if_needed \ + "$HOME/.zsh/spaceship.zsh" \ + "$DOTFILES_DIR/zsh/dot-zsh/spaceship.zsh" # Zellij - backup_if_needed "$HOME/.config/zellij/config.kdl" - backup_if_needed "$HOME/.config/zellij/layouts/default.kdl" - backup_if_needed "$HOME/.config/zellij/plugins/monocle.wasm" + backup_if_needed \ + "$HOME/.config/zellij/config.kdl" \ + "$DOTFILES_DIR/zellij/dot-config/zellij/config.kdl" + + backup_if_needed \ + "$HOME/.config/zellij/layouts/default.kdl" \ + "$DOTFILES_DIR/zellij/dot-config/zellij/layouts/default.kdl" + + backup_if_needed \ + "$HOME/.config/zellij/plugins/monocle.wasm" \ + "$DOTFILES_DIR/zellij/dot-config/zellij/plugins/monocle.wasm" } migrate_dotfiles @@ -180,20 +237,47 @@ stow \ zellij # ------------------------------------------------------------ -# Outils Rust +# Installation des outils Cargo # ------------------------------------------------------------ -log "Installation des outils Rust..." +install_cargo_package() { + local package="$1" + local command="${2:-$1}" -#cargo install --locked bat bottom diskus procs cargo-update + if command -v "$command" >/dev/null 2>&1; then + log "$package déjà installé." + return + fi + + log "Installation de $package..." + + cargo install --locked "$package" +} + +#install_cargo_package zellij +#install_cargo_package bat +#install_cargo_package bottom +#install_cargo_package diskus +#install_cargo_package procs + +# cargo-update installe la commande `cargo-install-update` +if ! command -v cargo-install-update >/dev/null 2>&1; then + log "Installation de cargo-update..." + + cargo install --locked cargo-update +else + log "cargo-update déjà installé." +fi # ------------------------------------------------------------ # Résumé # ------------------------------------------------------------ if [[ -n "$BACKUP_DIR" ]]; then - log "Les anciennes configurations ont été sauvegardées dans :" + log "Anciennes configurations sauvegardées dans :" log " $BACKUP_DIR" +else + log "Aucun backup nécessaire." fi -log "Installation terminée avec succès." +log "Installation terminée avec succès." \ No newline at end of file