Personnalisation de Zsh
Le Z shell ou zsh est un shell Unix qui peut être utilisé de façon interactive, à l’ouverture de la session ou en tant que puissant interpréteur de commande. zsh peut être vu comme un « Bourne shell » étendu avec beaucoup d’améliorations. Il reprend en plus la plupart des fonctions les plus pratiques de bash, ksh et tcsh. Zsh remplace bash dans macOS à partir de macOS Catalina 10.15.
Il existe des solutions clé en main, comme Oh My ZSH, mais l’idée est d’avoir une configuration la plus légère et optimisée possible
Explication
Au démarrage d’une session shell, différents fichiers se chargent automatiquement. Cela permet de charger les configurations nécessaires au fonctionnement du prompt, comme son apparence, les variables d’environnement…
Fichier .zshrc
Le fichier .zshrc n’existe pas par défaut. Zsh est chargé sans aucune personnalisation. Il va donc falloir le construire de 0. Comme base de départ, je vous partage le mien :
# ─── .zshrc ──────────────────────────────────────────────────────────────
# shellcheck disable=all
# options
setopt AUTO_CD # Naviguer sans 'cd'
setopt HIST_IGNORE_DUPS # Ignore les doublons dans l'historique
setopt HIST_FIND_NO_DUPS # Ignore les doublons lors de la recherche
setopt HIST_IGNORE_SPACE # Ignore les commandes précédées d'un espace
setopt SHARE_HISTORY # Partage l'historique entre les sessions
# history
HISTSIZE=10000
SAVEHIST=10000
HISTFILE="$HOME/.local/share/zsh/history"
# prompt
PROMPT='%B%(?.%F{cyan}.%F{red})❱ %F{blue}%~ $ %f%b'
# homebrew
if [[ -z $HOMEBREW_PREFIX ]] && [[ -d /opt/homebrew ]]; then
export HOMEBREW_PREFIX=/opt/homebrew
fi
if [[ -n $HOMEBREW_PREFIX ]]; then
FPATH="$HOMEBREW_PREFIX/share/zsh-completions:$FPATH"
# zsh-autosuggestions
source "$HOMEBREW_PREFIX/share/zsh-autosuggestions/zsh-autosuggestions.zsh" 2>/dev/null
fi
# completion
[[ -d "$HOME/.local/share/zsh" ]] || mkdir -p "$HOME/.local/share/zsh"
autoload -Uz compinit && compinit -d "$HOME/.local/share/zsh/zcompdump"
zstyle ':completion:*' cache-path "$HOME/.local/share/zsh/zcompcache"
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
zstyle ':completion:*' menu select
# ls colors
export CLICOLOR=1
export LSCOLORS=ExfxbxdxCxegedabagacad
# completion colors
export LS_COLORS="di=1;38;2;137;180;250:ln=38;2;203;166;247:ex=1;38;2;166;227;161"
zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
# keybindings
if [[ -o interactive ]]; then
bindkey -e
bindkey "\e[H" beginning-of-line
bindkey "\e[F" end-of-line
bindkey "\e[3~" delete-char
fi
# aliases
[[ -f ~/.zsh_aliases ]] && source "$HOME/.zsh_aliases"
# zsh-syntax-highlighting
if [[ -n $HOMEBREW_PREFIX ]] && source "$HOMEBREW_PREFIX/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" 2>/dev/null; then
source "$HOME/.config/zsh/catppuccin.zsh"
ZSH_HIGHLIGHT_STYLES[path]=none
ZSH_HIGHLIGHT_STYLES[path_pathseparator]=none
ZSH_HIGHLIGHT_STYLES[path_prefix]=none
ZSH_HIGHLIGHT_STYLES[path_prefix_pathseparator]=none
ZSH_HIGHLIGHT_STYLES[precommand]=none
fiPour profiter pleinement des fonctionnalités de ce fichier, je vous suggère d’installer via homebrew les éléments suivants :
brew install zsh-autosuggestions zsh-completions zsh-syntax-highlightingFichier .zsh_aliases
Afin de garder une cohérence avec le système Linux, nous allons créer un fichier .zsh_aliases. Ce fichier contiendra nos personnalisations, notamment les aliases, qui permettent de se créer des “raccourcis” de commande, ou des fonctions. Le fichier est lu comme un script, il est donc possible d’y placer des conditions, ou des boucles.
Mon fichier .zsh_aliases se divise en plusieurs parties :
- La définition de certaines variables d’environnement (langue, éditeur par défaut)
- Des paramètres spécifiques à brew si vous l’avez installé
- La liste des aliases de base que j’utilise
- Des aliases supplémentaires pour des applications spécifiques, chargés uniquement si les applications sont installées
- Quelques fonctions, dans le cas où un simple alias est trop limitant
Le contenu du fichier :
# ─── .zsh_aliases ────────────────────────────────────────────────────────
# shellcheck disable=all
# variables
export XDG_CONFIG_HOME="$HOME/.config"
export PATH="$HOME/.local/bin:$PATH"
export LANG=fr_FR.UTF-8
export LC_ALL=fr_FR.UTF-8
export EDITOR=vim
export LESSHISTFILE=/dev/null
# homebrew
if command -v brew &>/dev/null; then
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_ANALYTICS=1
export HOMEBREW_NO_ASK=1
alias upgrade='brew update && brew upgrade -g && brew cleanup'
fi
# ─── aliases ─────────────────────────────────────────────────────────────
alias l='ls -lh' # Liste détaillée
alias la='ls -lhA' # Liste avec les fichiers cachés
alias lr='ls -lLhR' # Liste en récursif
alias lra='ls -lhRA' # Liste en récursif avec les fichiers cachés
alias lrt='ls -lLhrt' # Liste par date
alias lrta='ls -lLhrtA' # Liste par date avec les fichiers cachés
alias grep='grep -i --color=auto' # Grep sans sensibilité à la casse
alias zgrep='zgrep -i --color=auto' # Grep dans les fichiers compressés
alias psp='ps -eaf | grep -v grep | grep' # Chercher un process (psp <nom>)
alias genkey='ssh-keygen -t ed25519 -a 100' # Générer une clé ed25519
alias pubip='curl -s -4 ipecho.net/plain ; echo' # Afficher l'adresse IP publique
alias df='df -PlH' # df en filtrant les montages inutiles
alias rmds='find . -name ".DS_Store" -type f -delete' # Supprimer les .DS_Store récursivement
alias rmdot="find . -name '._*' -type f -delete" # Supprimer les ._ récursivement
alias top='top -o cpu -U $(whoami)' # top filtré pour le user courant
alias vi='vim -O' # vim avec ouverture multiple
alias speedtest='networkQuality' # Speedtest Apple
alias locate='mdfind -name' # Recherche via Spotlight
alias hide='chflags hidden' # Masquer un dossier dans le Finder
alias unhide='chflags nohidden' # Afficher un dossier dans le Finder
# ─── applications facultatives ───────────────────────────────────────────
# btop / htop : top amélioré
if command -v btop &>/dev/null; then
alias top='btop'
elif command -v htop &>/dev/null; then
alias top='htop'
fi
# colordiff : diff avec couleur
command -v colordiff &>/dev/null && alias diff='colordiff'
# duf : affiche les filesystems
command -v duf &>/dev/null && alias df='duf -hide special'
# dust : du amlérioré
command -v dust &>/dev/null && alias du='dust -rb'
# fzf : recherche avancée avec thème Catppuccin Mocha
if command -v fzf &>/dev/null; then
source <(fzf --zsh)
if command -v fd &>/dev/null; then
export FZF_DEFAULT_COMMAND='fd'
fi
export FZF_DEFAULT_OPTS=" \
--color=bg+:#313244,bg:#1E1E2E,spinner:#F5E0DC,hl:#F38BA8 \
--color=fg:#CDD6F4,header:#F38BA8,info:#CBA6F7,pointer:#F5E0DC \
--color=marker:#B4BEFE,fg+:#CDD6F4,prompt:#CBA6F7,hl+:#F38BA8 \
--color=selected-bg:#45475A \
--color=border:#6C7086,label:#CDD6F4"
fi
# herdr : émulateur de terminal
if command -v herdr &>/dev/null; then
alias hr='herdr'
alias hrstop='herdr session stop default'
fi
# icdiff : diff amélioré
command -v icdiff &>/dev/null && alias diff='icdiff'
# ncdu : équivalent à TreeSize
command -v ncdu &>/dev/null && alias ncdu='ncdu --color dark'
# procs : ps amélioré
command -v procs &>/dev/null && alias psp='procs'
# rg : plus performant que grep
command -v rg &>/dev/null && alias rg='rg -i'
# zed : éditeur de code
command -v zed &>/dev/null && alias e='zed'
# zoxide : cd amélioré
command -v zoxide &>/dev/null && eval "$(zoxide init zsh)"
# ─── fonctions ───────────────────────────────────────────────────────────
# cpsave : copie un fichier ou dossier avec un suffixe .old
cpsave() { cp -Rp "$1" "${1%/}.old"; }
# tarc : créer une archive pour chaque fichier/dossier spécifié
tarc() { for file in "$@"; do tar czvf "${file%/}.tar.gz" "$file"; done; }
# tarx : décompresser une archive
tarx() { for file in "$@"; do tar xzvf "$file"; done; }
# zipd : créer une archive zip par fichier
zipd() { for file in "$@"; do /usr/bin/zip -r "${file%/}.zip" "$file"; done; }
# convweb : convertir des fichiers png en webp
convweb() { for file in "$@"; do cwebp -q 100 "$file" -o "${file%.*}.webp" && rm -- "$file"; done; }
# netinfo : affiche les informations réseau
netinfo() { for service in "Ethernet" "Wi-Fi"; do
echo "==> $service"
networksetup -getinfo "$service"
echo
done; }
# jback : backup local vers disque externe
jback() { rsync -ah --no-perms --progress --exclude "._*" --exclude ".DS_Store" ~/Documents/ /Volumes/jdisk/Documents/; }
# ─── scripts ─────────────────────────────────────────────────────────────
# transforme en alias les scripts
scripts=~/Documents/scripts
if [[ -d $scripts ]]; then
for i in envbackup ggit; do
[[ -f $scripts/$i/$i.sh ]] && alias $i="$scripts/$i/$i.sh"
done
fi
# hugo
sitedir=~/Documents/website
[[ -f $sitedir/hugo.sh ]] && alias hugo="$sitedir/hugo.sh"Les aliases de base :
| Commande | Description |
|---|---|
| l | Liste les fichiers et les répertoires |
| la | Même chose que l, dont les cachés |
| lr | Liste les fichiers et les répertoires en récursif |
| lra | Même chose que lr, dont les cachés |
| lrt | Liste les fichiers et les répertoires dans l’ordre chronologique |
| lrta | Même chose que lrt, dont les cachés |
| grep | Ajoute la gestion de la couleur à grep |
| zgrep | Même chose pour zgrep (grep dans les fichiers compressés) |
| psp | Suivi d’une chaîne, permet de rechercher rapidement un process |
| genkey | Génère une clé au format ed25519 (plus sécurisé que rsa) |
| pubip | Affiche rapidement l’IP publique de la machine |
| df | Commande df, mais sans les volumes temporaires |
| rmds | Suppression récursive des fichiers .DS_Store |
| rmdot | Suppression récursive des fichiers ._ |
| top | Commande top filtrée pour le user |
| vi | vim : vi amélioré avec ouverture multiple |
| speedtest | Teste le débit de la connexion avec l’outil Apple |
| locate | Recherche de fichiers par nom via Spotlight |
| hide | Masque un fichier ou dossier dans le Finder |
| unhide | Rend de nouveau visible un fichier ou dossier dans le Finder |
Les aliases actifs uniquement dans le cas où les applications sont installées :
| Commande | Description |
|---|---|
| top | Remplace la commande par btop (ou htop à défaut) |
| diff | Remplace la commande par colordiff (icdiff prend le relais s’il est installé) |
| df | Remplace la commande par duf, bien plus agréable visuellement |
| du | Outil dust, similaire à du, en couleur et très rapide |
| fzf | Outil de recherche avancé |
| ncdu | L’équivalent de l’outil Treesize sous Windows |
| psp | Outil procs, similaire à ps, en bien plus lisible |
| rg | Un grep récursif, bien plus lisible que le grep de base |
| hr | Lance herdr, un multiplexeur de terminal pour agents de code |
| hrstop | Arrête la session herdr par défaut |
| e | Ouvre Zed, l’éditeur de code |
| z | Utilise zoxide, un cd avancé |
Et enfin, les fonctions :
| Commande | Description |
|---|---|
| cpsave | Créer une copie en .old d’un fichier ou d’un dossier spécifié |
| tarc | Créer un tar.gz d’un ou plusieurs fichiers ou dossiers passés en paramètre |
| tarx | Pour extraire un ou plusieurs tar.gz passés en paramètre |
| zip | Facilite l’utilisation de la commande zip (zip <fichier>) |
| convweb | Transforme une image passée en paramètre au format webp |
| netinfo | Affiche les informations sur les cartes ethernet et Wifi |
| jback | Sauvegarde ~/Documents vers un disque externe (/Volumes/jdisk) |