refractor(dotfile): divers amelioration
This commit is contained in:
@@ -1,103 +1,107 @@
|
|||||||
# Dotfiles
|
# 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 :
|
```text
|
||||||
|
|
||||||
- **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 :
|
|
||||||
|
|
||||||
```
|
|
||||||
~/.dotfiles/
|
~/.dotfiles/
|
||||||
├── dotfiles/
|
├── dotfiles/
|
||||||
│ ├── spaceship/
|
|
||||||
│ │ └── spaceship.zsh # prompt zsh Spaceship
|
|
||||||
│ ├── zellij/
|
│ ├── zellij/
|
||||||
│ │ ├── config.kdl # config principale zellij
|
│ │ └── dot-config/
|
||||||
│ │ ├── layouts/
|
│ │ └── zellij/
|
||||||
│ │ │ └── default.kdl # layout par défaut
|
│ │ ├── config.kdl
|
||||||
│ │ └── plugins/
|
│ │ ├── layouts/
|
||||||
│ │ └── monocle.wasm # plugin zellij
|
│ │ │ └── default.kdl
|
||||||
|
│ │ └── plugins/
|
||||||
|
│ │ └── monocle.wasm
|
||||||
│ └── zsh/
|
│ └── zsh/
|
||||||
│ └── zshrc.perso # config zsh perso (linkée en ~/.zshrc.perso)
|
│ ├── dot-zsh/
|
||||||
|
│ │ └── spaceship.zsh
|
||||||
|
│ ├── dot-zshrc
|
||||||
|
│ └── dot-zshrc.perso
|
||||||
├── install/
|
├── install/
|
||||||
│ └── install.sh # script d'installation / mise à jour
|
│ └── install.sh
|
||||||
|
├── LICENSE
|
||||||
└── README.md
|
└── 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
|
```text
|
||||||
|
dot-zshrc → ~/.zshrc
|
||||||
- Une distribution Debian/Ubuntu (le script utilise `apt`).
|
dot-zshrc.perso → ~/.zshrc.perso
|
||||||
- Un accès `sudo`.
|
dot-zsh → ~/.zsh/
|
||||||
- `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
|
## Installation
|
||||||
|
|
||||||
### 1. Cloner ce dépôt
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://gitlabns.nameshield.net/an.ginder/dotfiles.git ~/.dotfiles
|
git clone https://gitlabns.nameshield.net/an.ginder/dotfiles.git ~/.dotfiles
|
||||||
cd ~/.dotfiles
|
cd ~/.dotfiles
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Lancer le script d'installation
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./install/install.sh
|
./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`.
|
## Gestion des fichiers existants
|
||||||
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
|
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
|
Les backups sont placés dans :
|
||||||
# à ajouter dans ~/.zshrc
|
|
||||||
[ -f ~/.zshrc.perso ] && source ~/.zshrc.perso
|
```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.
|
Les modifications effectuées dans `dotfiles/` sont donc immédiatement prises en compte.
|
||||||
- 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).
|
|
||||||
|
|
||||||
## Mettre à jour la configuration
|
Pour mettre à jour le dépôt :
|
||||||
|
|
||||||
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 :
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd ~/.dotfiles
|
cd ~/.dotfiles
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
Pour sauvegarder ses modifications :
|
||||||
|
|
||||||
|
```bash
|
||||||
git add -A
|
git add -A
|
||||||
git commit -m "update config"
|
git commit -m "update config"
|
||||||
git push
|
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
|
||||||
|
```
|
||||||
+107
-23
@@ -69,12 +69,12 @@ if ! command -v cargo >/dev/null 2>&1; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
# Spaceship prompt
|
# Spaceship
|
||||||
#
|
#
|
||||||
# Le logiciel est installé séparément dans :
|
# Logiciel :
|
||||||
# ~/.zsh/spaceship-prompt
|
# ~/.zsh/spaceship-prompt
|
||||||
#
|
#
|
||||||
# La configuration personnelle est gérée par Stow :
|
# Configuration :
|
||||||
# ~/.zsh/spaceship.zsh
|
# ~/.zsh/spaceship.zsh
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
# Migration des configurations existantes
|
# Backup
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
create_backup_dir() {
|
create_backup_dir() {
|
||||||
@@ -118,28 +118,65 @@ create_backup_dir() {
|
|||||||
log "Backup créé dans : $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() {
|
backup_if_needed() {
|
||||||
local target="$1"
|
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
|
if [[ ! -e "$target" && ! -L "$target" ]]; then
|
||||||
|
log "Absent, Stow va le créer : $target"
|
||||||
return
|
return
|
||||||
fi
|
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
|
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
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# --------------------------------------------------------
|
||||||
|
# Fichier ou répertoire normal
|
||||||
|
# --------------------------------------------------------
|
||||||
|
|
||||||
create_backup_dir
|
create_backup_dir
|
||||||
|
|
||||||
local relative_path
|
|
||||||
relative_path="${target#"$HOME"/}"
|
|
||||||
|
|
||||||
local backup_path
|
local backup_path
|
||||||
backup_path="$BACKUP_DIR/$relative_path"
|
backup_path="$(backup_path_for "$target")"
|
||||||
|
|
||||||
mkdir -p "$(dirname "$backup_path")"
|
mkdir -p "$(dirname "$backup_path")"
|
||||||
|
|
||||||
@@ -148,18 +185,38 @@ backup_if_needed() {
|
|||||||
mv -- "$target" "$backup_path"
|
mv -- "$target" "$backup_path"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Migration des dotfiles
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
migrate_dotfiles() {
|
migrate_dotfiles() {
|
||||||
log "Vérification des configurations existantes..."
|
log "Vérification des configurations existantes..."
|
||||||
|
|
||||||
# Zsh
|
# Zsh
|
||||||
backup_if_needed "$HOME/.zshrc"
|
backup_if_needed \
|
||||||
backup_if_needed "$HOME/.zshrc.perso"
|
"$HOME/.zshrc" \
|
||||||
backup_if_needed "$HOME/.zsh/spaceship.zsh"
|
"$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
|
# Zellij
|
||||||
backup_if_needed "$HOME/.config/zellij/config.kdl"
|
backup_if_needed \
|
||||||
backup_if_needed "$HOME/.config/zellij/layouts/default.kdl"
|
"$HOME/.config/zellij/config.kdl" \
|
||||||
backup_if_needed "$HOME/.config/zellij/plugins/monocle.wasm"
|
"$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
|
migrate_dotfiles
|
||||||
@@ -180,20 +237,47 @@ stow \
|
|||||||
zellij
|
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é
|
# Résumé
|
||||||
# ------------------------------------------------------------
|
# ------------------------------------------------------------
|
||||||
|
|
||||||
if [[ -n "$BACKUP_DIR" ]]; then
|
if [[ -n "$BACKUP_DIR" ]]; then
|
||||||
log "Les anciennes configurations ont été sauvegardées dans :"
|
log "Anciennes configurations sauvegardées dans :"
|
||||||
log " $BACKUP_DIR"
|
log " $BACKUP_DIR"
|
||||||
|
else
|
||||||
|
log "Aucun backup nécessaire."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Installation terminée avec succès."
|
log "Installation terminée avec succès."
|
||||||
Reference in New Issue
Block a user