Ghostty + zsh : restaurer ses onglets et se créer une bibliothèque de commandes

Création de site web & Formation informatique

Ghostty + zsh : restaurer ses onglets et se créer une bibliothèque de commandes

Deux réglages utiles pour qui travaille au quotidien dans le terminal Ghostty sur Mac : retrouver automatiquement ses onglets après un redémarrage, et accéder en un raccourci clavier à ses commandes les plus fréquentes grâce à fzf.

Retrouver ses onglets à la fermeture de Ghostty

Ghostty propose une sauvegarde et restauration de l'état des fenêtres, pilotée par l'option window-save-state dans le fichier de configuration (~/.config/ghostty/config).

window-save-state = always

default (valeur de base) restaure seulement après un crash ou un kill, ou si la restauration système macOS est activée (Réglages Système > Bureau et Dock). always restaure systématiquement, même après un Cmd+Q normal. never désactive la fonctionnalité.

Ce qui revient : la position et la taille des fenêtres, les onglets, les splits, et les répertoires de travail si shell-integration est actif. Le contenu affiché (scrollback) n'est en revanche jamais restauré.

Se créer une bibliothèque de commandes avec fzf

Au-delà des onglets, Ghostty permet aussi de gagner du temps sur les commandes tapées sans cesse : déploiements, logs Docker, requêtes Git... En combinant fzf et un petit widget zsh, on obtient une bibliothèque de commandes recherchable en un raccourci clavier.

Installation de fzf

brew install fzf
$(brew --prefix)/opt/fzf/install

Répondre oui aux trois questions posées par le script d'installation : elles activent les raccourcis Ctrl+R (historique), Ctrl+T (chemin de fichier) et Alt+C (changement de dossier), ainsi que l'auto-complétion dans ~/.zshrc.

Le fichier de snippets

Un fichier texte sert de bibliothèque : une ligne par commande, description et commande séparées par un |, pour éviter tout conflit avec les deux-points que contiennent certaines commandes.

mkdir -p ~/.config/snippets
touch ~/.config/snippets/commands.txt

Redémarrer Dokploy | docker restart dokploy
Logs Supabase | docker compose logs -f supabase
Push vers OVH prod | git push ovh main

Le widget zsh de recherche

Dans ~/.zshrc, une fonction zsh ouvre fzf sur ce fichier et insère la commande choisie sur la ligne de commande. Le point important : fzf doit recevoir la ligne complète (description + commande) pour pouvoir filtrer sur la description ; l'extraction de la commande seule n'intervient qu'après la sélection.

À éditer avec un éditeur de fichier (nano, code...) plutôt qu'en collant directement dans le terminal, pour éviter que les retours à la ligne soient aplatis.

snippet-search() {
  local selected cmd
  selected=$(fzf --prompt='Commande> ' --height=40% --reverse < ~/.config/snippets/commands.txt)
  [[ -z $selected ]] && return
  cmd=$(cut -d'|' -f2- <<< "$selected")
  LBUFFER="${cmd# }"
}
zle -N snippet-search
bindkey '\es' snippet-search

Recharger avec source ~/.zshrc après chaque modification.

Activer la touche Option comme Alt sur macOS

Sur Mac, la touche Option (⌥) tape par défaut des caractères spéciaux plutôt que d'envoyer le préfixe Esc attendu par zsh. Il faut l'activer explicitement dans Ghostty :

macos-option-as-alt = left

left ne bascule que l'Option gauche, pour garder les accents côté droit. true active les deux côtés, right l'inverse de left.

Ghostty doit être relancé complètement (Cmd+Q puis relance) : ce réglage ne se recharge pas à chaud.

Utilisation au quotidien

Option(gauche)+S ouvre la liste filtrable ; quelques lettres suffisent pour retrouver une commande par sa description ou son contenu ; Entrée insère uniquement la commande sur la ligne, prête à être exécutée ou modifiée. Ajouter une commande à la bibliothèque ne demande rien de plus qu'une nouvelle ligne dans le fichier de snippets : il est relu à chaque appel.

Dépannage : les erreurs les plus courantes

« parse error near 'zle' » au rechargement

Un copier-coller direct dans le terminal peut aplatir les retours à la ligne du widget sur une seule ligne. Éditer le fichier avec un éditeur de texte plutôt que coller dans le terminal règle le problème.

Ctrl+X déjà pris, Ctrl+J ne déclenche rien

Ctrl+J correspond au saut de ligne envoyé par Entrée : le raccourci entre en conflit avec la validation de ligne. Un raccourci Option/Alt (\es) l'évite ; à éviter aussi : Ctrl+M, Ctrl+I, Ctrl+H.

La sélection affiche la ligne complète au lieu de la commande seule

Le fichier de snippets utilisait encore un ancien séparateur alors que le widget coupait sur |. Il faut harmoniser le séparateur partout dans le fichier.

La description n'apparaît plus dans la liste fzf

cut ou sed appliqué avant fzf : il ne reste alors que la commande à filtrer. Il faut donner la ligne complète à fzf et extraire la commande seulement après la sélection.

Option+S ne déclenche rien, ou tape un caractère accentué

macos-option-as-alt n'est pas défini, ou Ghostty n'a pas été relancé complètement après la modification de la configuration.

Pour aller plus loin

Pour des commandes fixes très fréquentes, un keybind Ghostty direct évite même de passer par fzf :

keybind = cmd+shift+g=text:git status\n
keybind = ctrl+alt+d=text:docker compose up -d\n

Le \n final simule la touche Entrée. Pour un historique de commandes plus riche, atuin (brew install atuin) remplace Ctrl+R par une recherche fzf-like dans tout l'historique shell, synchronisable entre plusieurs machines.