- Après avoir utilisé iTerm 2 pendant longtemps, l’auteur a redonné sa chance à WezTerm pour profiter d’une configuration textuelle et du partage via les dotfiles, avec une API de configuration en Lua permettant d’ajuster finement l’apparence, les raccourcis clavier, le multiplexage et les workspaces
- La configuration est stockée dans
wezterm.lua et bénéficie d’un hot reload immédiat à chaque sauvegarde ; l’overlay de débogage via CTRL + SHIFT + L permet de consulter directement les logs et le REPL Lua
- La configuration en Lua permet de composer dynamiquement plus de 1 000 thèmes de couleurs intégrés, l’intégration avec le mode sombre/clair du système, les polices, les décorations de fenêtre macOS et une barre d’état style powerline
- Les raccourcis par défaut peuvent être conservés ou désactivés, et l’on peut définir soi-même le déplacement par mot avec
Option + Arrow, l’ouverture de la configuration avec CMD +,, ainsi que les manipulations de panes basées sur une leader key et des key tables
- Le multiplexage intégré et les workspaces conservent l’état des fenêtres, panes et onglets par projet comme des sessions tmux, et il est possible de créer en Lua jusqu’à l’interface de sélection de projet et le flux de bascule
Pourquoi je suis passé de iTerm 2 à WezTerm
- J’utilisais iTerm 2 depuis presque 10 ans, mais je voulais un terminal dont toute la configuration soit gérée en texte pour pouvoir l’ajouter à mes dotfiles et la partager entre mes machines pro et perso
- WezTerm se distingue par une API puissante et une config Lua ; lors de cette deuxième tentative, il a été possible d’obtenir une configuration de terminal plus esthétique et plus fonctionnelle
- Le périmètre couvert ici inclut l’apparence, les raccourcis clavier, le multiplexage, le passage entre workspaces, la barre d’état et la configuration dynamique du thème
- Certaines fonctionnalités ne sont pas abordées dans cet article
- règles personnalisées de mise en évidence des hyperliens
- scrollback consultable par recherche
- quick copy mode
- prise en charge des images
- La configuration d’exemple est pensée pour une expérience sous macOS ; elle n’a pas été testée sur d’autres systèmes, même si WezTerm fonctionne lui-même dans plusieurs environnements
- Un exemple de configuration final est fourni dans ce gist
Installation et structure de base d’une configuration Lua
brew install wezterm
- Le fichier de configuration est placé dans
$XDG_CONFIG_HOME/wezterm/wezterm.lua
- sur la plupart des systèmes, macOS compris, cela correspond à
~/.config/wezterm/wezterm.lua
- utiliser un répertoire plutôt qu’un unique
~/.wezterm.lua facilite la répartition de la configuration dans plusieurs fichiers
local wezterm = require 'wezterm'
local config = wezterm.config_builder()
return config
- La configuration de WezTerm étant écrite en Lua, il est plus simple de créer des réglages dynamiques complexes qu’avec YAML ou TOML
- Lua est un langage de programmation, donc plus difficile à apprendre que YAML ou TOML, mais si l’on a déjà utilisé Ruby, Python ou JavaScript, le code d’exemple reste facile à lire
- Pour apprendre Lua, on peut consulter le Getting Started guide
Hot reload et overlay de débogage
- WezTerm détecte les modifications du fichier de configuration et effectue un rechargement automatique, ce qui permet de voir immédiatement l’effet d’un changement sans redémarrer le terminal
- Si l’on enregistre une configuration contenant une erreur, comme un mauvais nom de fonction, une fenêtre d’erreur d’exécution apparaît aussitôt
wezterm.config_builderZ()
- Les logs peuvent être écrits avec
wezterm.log_info()
wezterm.log_info("hello world! my name is " .. wezterm.hostname())
CTRL + SHIFT + L ouvre l’overlay de débogage, où l’on peut consulter les logs et le REPL Lua
- on peut exécuter des expressions Lua comme
1 + 1
- on peut aussi inspecter des valeurs du module
wezterm, comme wezterm.home_dir
- En combinant hot reload et overlay de débogage, la boucle de feedback pour modifier puis vérifier la configuration devient très courte
Réglages d’apparence : couleurs, thème système, police, style de fenêtre
-
Thèmes de couleurs et configuration dynamique
- WezTerm propose plus de 1 000 thèmes de couleurs intégrés, sélectionnables via
config.color_scheme
config.color_scheme = 'Tokyo Night'
- la liste des thèmes est disponible sur WezTerm colorschemes
- avec l’événement
window-config-reloaded et wezterm.color.get_builtin_schemes(), il est aussi possible de créer une configuration dynamique qui applique un thème aléatoire à chaque nouvelle fenêtre
- après avoir défini un override de configuration par fenêtre, revenir à un thème statique peut empêcher le hot reload de s’appliquer immédiatement
- on peut supprimer l’override en exécutant
window:set_config_overrides({}) dans le terminal de débogage, ou en fermant puis rouvrant la fenêtre
-
Intégration avec le mode sombre/clair du système
- la configuration peut être isolée dans un module
appearance.lua afin de changer de thème selon l’apparence du système d’exploitation
- on détermine si le mode sombre est actif en recherchant la chaîne
"Dark" dans wezterm.gui.get_appearance()
- si
wezterm.gui n’est pas disponible, le mode sombre est utilisé par défaut
if appearance.is_dark() then
config.color_scheme = 'Tokyo Night'
else
config.color_scheme = 'Tokyo Night Day'
end
-
Police et décorations de fenêtre
- WezTerm inclut par défaut JetBrains Mono et Nerd Font Symbols
- la configuration d’exemple utilise Berkeley Mono en 13 pt
config.font = wezterm.font({ family = 'Berkeley Mono' })
config.font_size = 13
- l’exemple de style de fenêtre macOS comprend un fond semi-transparent, du blur, la suppression de la barre de titre et le réglage de la police de la barre d’onglets
config.window_background_opacity = 0.9
config.macos_window_background_blur = 30
config.window_decorations = 'RESIZE'
Barre d’état et API d’événements de WezTerm
- Le callback de l’événement
update-status ajoute des segments de style powerline à la barre d’état de droite
- L’exemple initial affiche un segment de hostname à partir de la couleur de fond, de la couleur de premier plan du thème actuel et de
wezterm.hostname()
wezterm.on relie des callbacks aux événements du terminal
update-status est déclenché périodiquement quand une mise à jour d’état peut être effectuée
- WezTerm veille à ce qu’une seule mise à jour s’exécute à la fois, et interrompt le handler si le code prend trop de temps
window:effective_config().resolved_palette permet de récupérer la palette courante, overrides compris
wezterm.format sert à appliquer des styles comme la couleur, le gras ou le soulignement à des chaînes
- Les exemples de la seconde partie ajoutent davantage de segments à la barre d’état
- workspace actuel
- date et heure
- hostname
wezterm.color.parse, color:lighten, color:darken et wezterm.color.gradient servent à calculer des couleurs en dégradé à partir du thème courant
Raccourcis clavier : déplacement par mot sur macOS et ouverture de la configuration
- WezTerm fournit des raccourcis par défaut, qui sont conservés dans l’exemple
- Pour les désactiver, on peut utiliser
config.disable_default_key_bindings = true
- Sur macOS, pour retrouver le déplacement mot par mot de iTerm 2 et Terminal.app avec
Option + LeftArrow et Option + RightArrow, on envoie ESC + b et ESC + f
{
key = 'LeftArrow',
mods = 'OPT',
action = wezterm.action.SendString '\x1bb',
}
- Il est possible de configurer
CMD + , pour ouvrir le fichier de configuration de WezTerm dans un nouvel onglet
- l’exemple utilise
nvim et wezterm.config_file
- Si WezTerm est lancé depuis le Finder de macOS, le binaire de l’éditeur peut ne pas être présent dans
PATH, ce qui peut faire échouer l’exécution de la commande
- En complétant les variables d’environnement par défaut avec
config.set_environment_variables, ce même environnement est ensuite transmis aux commandes spawn
config.set_environment_variables = {
PATH = '/opt/homebrew/bin:' .. os.getenv('PATH')
}
Multiplexage intégré et leader key
- Le multiplexage intégré de WezTerm peut remplacer tmux
- Cette fonction intégrée apporte un buffer de scrollback par pane, un meilleur contrôle de la souris, une sélection plus simple et, de manière générale, de meilleures performances
CTRL + SHIFT + P ouvre la command palette, où l’on peut exécuter des commandes comme “Shell: Split Horizontally” ou “Shell: Split Vertically”
- Les raccourcis de split par défaut sont volontairement complexes pour éviter les conflits ; une leader key permet de créer des combinaisons plus simples
config.leader = { key = 'a', mods = 'CTRL', timeout_milliseconds = 1000 }
- Dans l’exemple, après la leader key,
" déclenche un split horizontal et % un split vertical, dans l’esprit de tmux
{
key = '"',
mods = 'LEADER',
action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' },
}
- Si l’on veut envoyer
CTRL + A au terminal lui-même, on peut mapper la combinaison LEADER|CTRL pour renvoyer CTRL + A
Déplacement entre panes, redimensionnement et key table
- Le déplacement entre panes associe
h, j, k, l avec la leader key, dans le style des touches de direction de vim
ActivatePaneDirection permet de se déplacer vers Down, Up, Left et Right
- Les tables Lua répétitives peuvent être factorisées dans une fonction
local function move_pane(key, direction)
return {
key = key,
mods = 'LEADER',
action = wezterm.action.ActivatePaneDirection(direction),
}
end
- Le redimensionnement des panes peut aussi se faire à la souris, mais l’exemple utilise une key table pour privilégier un flux orienté clavier
- Une key table consiste à entrer dans un mode spécifique pour utiliser des raccourcis dédiés à ce mode
- c’est similaire à une leader key, mais sans désactivation immédiate après une seule action
- c’est adapté aux tâches où il faut répéter plusieurs fois les mêmes touches, comme le redimensionnement
- Dans l’exemple,
LEADER + r active la key table resize_panes, puis h/j/k/l ajustent la taille du pane de 3 cellules à la fois
timeout_milliseconds = 1000 fait quitter le mode de redimensionnement après 1 seconde
- Les utilisateurs de Neovim peuvent regarder smart-splits.nvim, qui facilite les déplacements entre panes WezTerm et panes vim
Organisation des workspaces par projet
- Lorsqu’on travaille sur plusieurs projets en même temps, on veut souvent conserver pour chacun une instance de multiplexeur, des fenêtres, des panes et des onglets distincts
- Dans WezTerm, cet usage proche des sessions de tmux est géré par les workspaces
- La structure proposée consiste à créer un
projects.lua avec une fonction de sélection de projet importée dans la configuration principale
- Dans l’exemple initial, les chemins de projet sont listés à la main, puis un
InputSelector affiche l’interface de sélection
fuzzy = true active la recherche floue
- au début, le résultat de la sélection est seulement écrit dans l’overlay de débogage
LEADER + p ouvre l’interface de sélection de projet, et LEADER + f affiche la liste des workspaces existants avec recherche floue
action = wezterm.action.ShowLauncherArgs { flags = 'FUZZY|WORKSPACES' }
- L’inconvénient de maintenir soi-même la liste des chemins peut être réduit avec
wezterm.glob(), qui collecte automatiquement les sous-répertoires des dossiers de projets
- L’exemple utilise les sous-répertoires de
~/Projects comme projets, tout en incluant aussi le répertoire personnel dans la liste
- Lorsqu’un projet est sélectionné,
SwitchToWorkspace est exécuté
- si le workspace existe, on bascule dessus
- sinon, il est créé
- le nom du workspace correspond au dernier segment du chemin
- le répertoire de travail courant du nouveau terminal est défini sur le chemin du projet choisi
Ce qu’on peut encore explorer
- WezTerm propose bien d’autres possibilités dans sa liste de fonctionnalités
- Les possibilités offertes par la configuration Lua sont détaillées plus largement dans la documentation de l’API WezTerm
- Une bonne approche consiste à suivre une configuration pas à pas, à ne garder que ce qui sera réellement utilisé, puis à la réécrire dans son propre style avant d’ajouter les fonctions nécessaires
- Si WezTerm vous plaît, vous pouvez aussi soutenir Wez, qui travaille sur ce projet open source
1 commentaires
Avis de Hacker News
Je suis récemment passé à WezTerm et j’en suis très satisfait.
Avant, j’utilisais kitty et, en quittant iTerm2, j’avais apprécié sa configuration et sa simplicité, mais côté fonctionnalités intégrées WezTerm est largement meilleur. La configuration du terminal est assez courte pour tenir sur un seul écran dans l’éditeur, et depuis, le terminal ne me gêne tout simplement plus, donc je n’ai plus à y penser.
Ce qui m’a définitivement fait abandonner kitty, c’est que chaque fois que je rencontrais un problème ou que j’essayais de reproduire une fonction d’iTerm2, je tombais sur des réponses brèves et méprisantes du maintainer.
Par exemple, à une question du genre « comment configurer tmux dans kitty ? », je me souviens d’une réponse du type « ne le fais pas, tmux est idiot », puis fermeture du ticket, ce qui m’a finalement fait renoncer.
Bien sûr, c’est son projet et c’est un excellent programmeur, mais un peu d’humilité ne ferait pas de mal.
Pour ceux qui ne connaissent pas, c’est une fenêtre que l’on peut afficher/masquer avec un raccourci précis et qui, lorsqu’elle est affichée, reste au-dessus de toutes les fenêtres, ce qui permet d’utiliser instantanément un terminal depuis n’importe où. On peut vivre sans, mais ce n’est pas une fonctionnalité à laquelle j’ai envie de renoncer ; donc même si les autres fonctions de WezTerm sont bonnes, sans ça il serait éliminé d’emblée pour moi.
De l’extérieur, cela ressemble souvent au meilleur produit, mais une fois qu’on commence à l’utiliser en profondeur, on se retrouve enfermé dans les choix de cette personne, sans échappatoire.
En revanche, quand j’ai commencé à utiliser WezTerm au début de l’année, j’ai été vraiment surpris. J’ai beaucoup lu ce qu’écrivait Wez, et à chaque fois le ton était impeccable ; j’ai trouvé ça vraiment excellent.
Le fait qu’il ne rende même pas correctement l’ancienne interface
make menuconfigde Linux, et qu’on ne puisse pas le corriger par configuration parce qu’il ne croit pas à la configuration, est assez révélateur. À force de lire les tickets, ce n’est pas seulement insultant : on finit presque par ressentir le besoin de « défendre » avec la même virulence une manière aléatoire d’utiliser un terminal, et ce n’est pas sain.Je ne peux pas en être sûr, mais même si j’étais d’accord avec lui sur absolument tout ce qui concerne les terminaux, je pense que je préférerais encore écrire mon propre terminal plutôt que d’utiliser le sien.
D’après mon expérience, Wez réagit étonnamment vite aux issues GitHub, et quand il y a réellement quelque chose qui cloche, il le corrige généralement en un ou deux jours.
À part une ou deux petites frustrations liées aux touches de modification via SSH, les fonctionnalités correspondent presque parfaitement à mes besoins, et en plus c’est rapide. J’étais auparavant un grand utilisateur d’Alacritty, mais j’avais besoin d’une meilleure prise en charge des modificateurs dans Emacs à distance.
J’ai bien commenté une issue déjà fermée, mais elle était de toute façon fermée en « won’t do » et mon commentaire a été ignoré. Je n’avais pas envie d’ouvrir une nouvelle issue pour le même sujet qui avait déjà été refusé.
https://github.com/wez/wezterm/issues/4706
Des combinaisons comme
C-S-"ne sont pas prises en charge par le protocole de terminal, donc il n’y a pas de bonne façon de les envoyer. J’ai donc fait en sorte que WezTerm envoie à la place" c s '", puis j’ai ajouté un binding supplémentaire dans Emacs. Grâce à cette astuce avec F12, j’ai pu envoyer des combinaisons assez complexes que le protocole de terminal ne sait pas gérer.À l’origine, j’avais installé WezTerm en passant de Kubuntu à Ubuntu, parce que je voulais utiliser certaines fonctions de Konsole, comme le scrollback infini et la recherche dans le scrollback, sans installer Konsole.
Je sais qu’on peut installer Konsole aussi sous Gnome, mais ça me semblait un peu déplacé. WezTerm m’a plu tout de suite, mais en lisant cet article, je me rends compte que je n’ai encore fait qu’effleurer la surface de ses possibilités de configuration.
Mon seul reproche, c’est que beaucoup de fonctions ne sont pas faciles à découvrir. La documentation est vraiment bonne, et l’auteur est actif et sympathique, mais par exemple, j’avais cherché comment sélectionner un gros bloc de texte uniquement au clavier, j’avais essayé une fois en me disant « il faut que je retienne ça ! », puis je l’ai aussitôt oublié ; aujourd’hui, je sélectionne de nouveau à la souris comme un parfait débutant. Comme ce n’est pas quelque chose que je fais souvent, c’est plus rapide que de retrouver la page de doc via Google.
Pour référence, la page en question est https://wezfurlong.org/wezterm/copymode.html ; à son nom, on pourrait croire que c’est ce que je cherchais, mais ce n’est pas la fonction complètement différente https://wezfurlong.org/wezterm/quickselect.html. Elle aussi est très utile et l’idée est excellente, mais ce n’était pas ce que je cherchais.
https://github.com/bbkane/dotfiles/tree/master/wezterm
Il est déjà utile par défaut, mais sa vraie force, c’est qu’on peut personnaliser les expressions régulières à faire correspondre. J’en ai ajouté une qui trouve tous les noms de fichiers dans la sortie de
eza --icons, et\p{Co}correspond aux icônes. Du coup, après avoir définilscomme alias deeza, je peux directement saisir n’importe quel nom de fichier avec shift + la lettre QuickSelect.Je ne l’ai pas encore trouvé, et c’est pour ça que je garde souvent aussi une session Konsole ouverte. Quand on suit des logs en temps réel avec tail, ces deux fonctions sont vraiment puissantes.
Après avoir essayé Mac Terminal, iTerm2, Kitty, Warp, etc., j’ai finalement adopté WezTerm.
Il est facile à configurer, rapide et agréable à regarder. J’ai même créé un thème.
https://tiniri.vlad.studio/
Je suis tombé par hasard sur ce site pour comparer plusieurs terminaux : https://terminaltrove.com/terminals/
Ça a l’air plutôt utile pour ceux qui veulent comparer des terminaux.
J’utilise WezTerm depuis environ un an et je sponsorise Wez sur GitHub ; c’est un excellent terminal, et lui est un bon développeur.
L’article disait ne pas en parler, mais l’une de mes fonctions préférées est Quick Copy, ainsi que les autres modes de copie. Je les utilise vraiment tout le temps. Il suffit d’appuyer sur
C-S-Space, puis de saisir la lettre affichée à côté de l’élément qu’on veut copier.Mon principal cas d’usage, c’est d’avoir quelque chose qui ressemble à mosh+tmux depuis un portable macOS vers une machine Linux du travail. Je garde toujours une session ouverte et je peux travailler sur la machine du boulot depuis mon Mac. Avec des sessions reconnectables, des panes et des tabs, je peux continuer à travailler même en m’éloignant de mon poste, et la qualité est excellente.
Je me demande bien ce qu’il pourrait y avoir à ne pas aimer dans WezTerm
Ma fonctionnalité préférée, mais souvent négligée, est sa prise en charge complète multiplateforme. Dans un environnement comme le mien, où j’utilise Linux, macOS et Windows, il suffit d’apprendre WezTerm une seule fois. Je partage aussi une bonne partie de ma configuration de terminal entre les systèmes d’exploitation
C’est peut-être un problème propre à moi ou lié à ma manière d’utiliser tmux, mais quand je copiais une ligne après un wrap, le texte copié semblait contenir des retours à la ligne. C’était très agaçant, et j’ai supposé que cela venait de l’interaction entre WezTerm et tmux
Je n’ai pas assez d’éléments pour faire un bon rapport de bug, et comme WezTerm dispose de son propre serveur de multiplexage de terminal, les « ssh domains », ce n’est peut-être pas assez important pour être corrigé. Mais je n’ai pas envie d’installer le serveur de multiplexage de WezTerm partout, et sur les machines auxquelles je me connecte en SSH, tmux est généralement déjà présent
À part ça, WezTerm est excellent
Les options de configuration de macOS sont limitées et nécessitent plusieurs contournements ; je pourrais aussi aligner Linux sur macOS, mais je n’aime pas vraiment les raccourcis de macOS eux-mêmes. On se retrouve donc avec un mélange bizarre, et à chaque changement je continue d’appuyer sur les mauvaises touches
Je me demande si quelqu’un a trouvé une configuration qui fonctionne bien
Je ne sais pas pourquoi, ni comment diagnostiquer le problème. Mon seul soupçon est un gros scrollback, mais je ne peux pas m’en passer. J’ai fini par passer à Kitty ; Kitty a aussi ses problèmes, mais au moins il fonctionne
Le langage de configuration Lua brille parce qu’il rend assez simples les changements selon l’environnement. Je pense aussi qu’il y a un effet secondaire sous-estimé de Rust. Les outils Rust modernes ont souvent une excellente prise en charge multiplateforme, peut-être parce que la couche d’abstraction entre le langage et le système d’exploitation est bonne
Vers 2019, il m’a suffi de comparer rapidement le dépôt wez à d’autres, côté GitHub Actions, issues et documentation, pour être convaincu, et je ne suis jamais revenu en arrière depuis. Il prend même en charge les onglets par défaut
C’est le premier terminal qui a réellement remplacé urxvt pour moi, en matière de prise en charge et de vitesse. Avant, j’utilisais termite tout en gardant urxvt en secours, au cas où termite déclencherait un bug dans une situation étrange
La raison pour laquelle je reste sur iTerm2, c’est
Edit->Selection Respects Soft BoundariesC’est une fonctionnalité qui, « lorsqu’elle est activée, interprète la barre verticale du caractère pipe
|comme un séparateur de pane dans vim ou emacs, et la sélection se replie à cet endroit »Dans mon cas, j’en ai besoin quand je sélectionne du texte dans IRC
https://github.com/wez/wezterm/issues/596
Personne n’a besoin de toutes les fonctionnalités, mais chacun a ses 10 fonctionnalités de niche qu’il veut, et ces 10 fonctionnalités ne sont pas les mêmes d’une personne à l’autre. Donc, pour obtenir ses 10 fonctionnalités de niche, on finit par accepter le bloat
Modification : je me suis exprimé un peu brutalement, désolé. J’avais raté la partie où tu disais l’utiliser dans IRC
J’étais utilisateur d’iTerm2 depuis que j’ai commencé à utiliser macOS pour la première fois, il y a presque 10 ans
Mais récemment, je l’ai trouvé vraiment lent, et j’ai atteint ma limite quand, après être passé dessus avec
cmd-tab, je me suis retrouvé à attendre plus d’une seconde avant que le terminal n’apparaisseJ’ai regardé quelques alternatives, mais rien ne convenait parfaitement. Un terminal nécessitait un compte/une connexion pour fonctionner, ce qui était un gros point négatif, et un autre terminal, écrit en {Java,Type}Script, cassait même une commande simple comme
yesà cause de la nature asynchrone des streams Node.jsJusqu’ici, WezTerm me plaît beaucoup. Il est assez rapide, très configurable, et le thème que j’utilisais dans iTerm2, OneDark(base16), est inclus par défaut
Le seul désagrément initial a été de devoir ajouter moi-même la configuration de
cmd-leftetcmd-rightdans la configuration Lua ; j’aurais aimé que ce soit dans les valeurs par défautWez publie aussi un livre sur la programmation système en Rust
https://leanpub.com/sysprog
C’est un bon article, donc je pourrais essayer WezTerm, mais je viens tout juste de passer à Kitty et je n’ai pas envie de changer trop souvent
Cela dit, il faut corriger quelque chose à propos de Kitty. Kitty n’utilise ni YAML ni TOML ; il utilise son propre DSL de configuration simple, et pour le reste il peut être entièrement scripté en Python