Ma configuration Wezterm : Puissance, modularité et ergonomie
Wezterm est un terminal moderne, rapide et hautement configurable. Après avoir testé de nombreux terminaux, j’ai choisi Wezterm pour sa flexibilité et ses performances, et j’ai construit une configuration modulaire en Lua, adaptée à mes besoins de développeur sur Mac. Voici une plongée dans mon setup, ses choix techniques et ses astuces.
Une architecture modulaire
Ma configuration est organisée en modules, chacun dédié à une fonctionnalité spécifique. Cela permet de maintenir un code propre, réutilisable et facilement extensible.
.
├── wezterm.lua
├── core/
│ ├── init.lua
│ ├── utils.lua
│ ├── options.lua
│ ├── tab.lua
│ ├── status.lua
│ ├── events.lua
│ ├── mappings.lua
│ ├── launcher.lua
│ └── profiles.lua
└── themes/
├── init.lua
└── cyberdream.lua
Le point d’entrée
Le fichier wezterm.lua
est minimaliste et délègue l’initialisation à un module central.
Initialisation et fusion des modules
Le module core/init.lua
orchestre le chargement des différents modules (options, status bar, mappings, etc.) et fusionne leurs exports grâce à une fonction utilitaire merge
:
function M.init_term()
M.status.enable()
local modules = M.utils.map({
'core.options',
'core.events',
'core.mappings',
'core.tab',
'core.launcher',
}, M.utils.req)
local valid_modules = {}
for _, module in ipairs(modules) do
if type(module) == 'table' then
table.insert(valid_modules, module)
end
end
return M.utils.merge(table.unpack(valid_modules))
end
Les options principales
Le module core/options.lua
définit les réglages principaux : police, padding, opacité, FPS, etc. J’utilise une stack de polices avec fallback, une opacité de 0.9, et un flou d’arrière-plan sur Mac pour un rendu moderne.
font = wezterm.font_with_fallback({
{ family = "Fira Code Retina" },
{ family = "Hack Nerd Font" },
{ family = "Monospace" },
}),
window_background_opacity = 0.9,
macos_window_background_blur = 20,
max_fps = 120,
Un launcher sur-mesure
Le module core/launcher.lua
propose un menu de lancement rapide pour différents shells, environnements virtuels, Node REPL, Ruby, ou encore des outils comme Zoxide et FZF.
launch_menu = {
{ label = "Zsh Shell", args = { "/bin/zsh" }, cwd = os.getenv("HOME") },
{ label = "Python Virtual Env", args = { "/bin/zsh", "-c", "source ~/myenv/bin/activate && zsh" }, cwd = os.getenv("HOME") },
// ...
}
Des raccourcis clavier ergonomiques
Le module core/mappings.lua
définit un leader key (Ctrl+w
) et de nombreux raccourcis pour gérer les splits, naviguer entre les tabs et les panes, lancer le launcher, recharger la config, etc.
leader = { key = "w", mods = "CTRL", timeout_milliseconds = 2000 },
keys = {
{ key = "q", mods = "LEADER", action = wz.action({ CloseCurrentPane = { confirm = true } }) },
{ key = "n", mods = "LEADER", action = wz.action.ShowLauncher },
{ key = "|", mods = "LEADER|SHIFT", action = wz.action.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
// ...
}
Une barre de statut dynamique
Le module core/status.lua
affiche à droite le niveau de batterie (avec icône colorée), un tilde coloré, et la date/heure. C’est à la fois esthétique et utile, surtout sur laptop.
local function render_battery(battery) -- Affiche une icône et le pourcentage,
coloré selon le niveau end
Navigation intelligente entre panes et tabs
Le module core/events.lua
permet de naviguer entre les panes avec Ctrl+Opt+h/l
et, si on atteint le bord, de passer au tab précédent/suivant. Un vrai gain de productivité !
Conclusion
Cette configuration Wezterm est pensée pour la modularité, la rapidité et l’ergonomie. Elle me permet de rester productif, tout en gardant un terminal agréable à l’œil et adapté à mes workflows de développement.
N’hésitez pas à vous en inspirer ou à l’adapter à vos besoins !
Questions, suggestions ? Laissez un commentaire ou ouvrez une issue sur mon dépôt GitHub.
Happy hacking avec Wezterm !