Aller au contenu

Cas avances

Scripting Zsh avance, widgets ZLE, integration avec l'IDE et profils de configuration par projet.


Scripting Zsh avance

Globbing etendu

Zsh offre un globbing bien plus puissant que Bash :

# Activer le globbing etendu
setopt EXTENDED_GLOB

# Tous les fichiers sauf les .md
ls ^*.md

# Fichiers modifies dans les dernieres 24h
ls *(.m-1)

# Fichiers de plus de 1 Mo
ls *(.Lm+1)

# Fichiers .ts dans tous les sous-dossiers, tries par taille
ls **/*.ts(.oL)
Qualifier Signification
. Fichiers réguliers uniquement
/ Dossiers uniquement
m-N Modifie il y a moins de N jours
Lm+N Taille > N Mo
oL Trier par taille
On Trier par nom (inverse)

Tableaux associatifs

# Declaration
typeset -A config
config=(
  host "localhost"
  port "5432"
  db   "myapp"
)

# Acces
echo ${config[host]}    # localhost
echo ${(k)config}       # host port db (cles)
echo ${(v)config}       # localhost 5432 myapp (valeurs)

# Iteration
for key val in ${(kv)config}; do
  echo "$key = $val"
done

Widgets ZLE (Zsh Line Editor)

ZLE permet de créer des raccourcis clavier personnalises dans le prompt :

# Widget : inserer la date
insert-date() {
  LBUFFER+=$(date +%Y-%m-%d)
}
zle -N insert-date
bindkey '^[d' insert-date  # Alt+d insere la date

# Widget : ouvrir le fichier courant dans VS Code
edit-in-vscode() {
  local file=$(fzf)
  if [[ -n "$file" ]]; then
    code "$file"
    zle reset-prompt
  fi
}
zle -N edit-in-vscode
bindkey '^[e' edit-in-vscode  # Alt+e

Integration avec l'IDE

Terminal VS Code

VS Code détecte le shell configure et herite des dotfiles. Pour des comportements spécifiques dans VS Code :

# Dans .zshrc — detecter si on est dans le terminal VS Code
if [[ "$TERM_PROGRAM" == "vscode" ]]; then
  # Aliases specifiques au terminal integre
  alias open="code"

  # Ne pas lancer tmux dans VS Code
  unset TMUX
fi

Shell integration VS Code

# Dans .zshrc — activer la shell integration VS Code
if [[ "$TERM_PROGRAM" == "vscode" ]]; then
  . "$(code --locate-shell-integration-path zsh)"
fi

La shell integration permet :

  • La detection automatique des commandes et de leur code de retour
  • La navigation entre les commandes (Ctrl+Up / Ctrl+Down)
  • Les liens cliquables pour les fichiers et URLs dans la sortie

Profils par projet

Charger automatiquement une configuration spécifique par projet :

Avec direnv

# ~/projet-a/.envrc
export NODE_ENV=development
export DATABASE_URL=postgres://localhost:5432/projet_a
PATH_add ./node_modules/.bin
# ~/projet-b/.envrc
export FLASK_APP=app.py
export FLASK_DEBUG=1
layout python3

Avec un hook chpwd Zsh

# Dans .zshrc — charger un .projectrc si present
chpwd_project() {
  if [[ -f .projectrc ]]; then
    source .projectrc
  fi
}
chpwd_functions+=(chpwd_project)
# .projectrc (dans le repertoire du projet)
alias test="pytest -v"
alias serve="python -m http.server 8000"
export PROJECT_NAME="mon-projet"

Terminal dans SSH et containers

SSH avec persistance

# Utiliser tmux automatiquement en SSH
ssh-tmux() {
  ssh "$@" -t "tmux attach -t main || tmux new -s main"
}

Shell dans un container

# Entrer dans un container avec Zsh (si installe)
docker exec -it my-container zsh

# Ou utiliser une image avec Zsh pre-configure
docker run -it --rm -v "$PWD:/workspace" -w /workspace my-dev-image zsh

Ne pas configurer le shell dans les containers de dev

Utilisez les devcontainers pour avoir un shell complet dans un container avec toute la configuration prechargee.