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
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.