Ugolin Ollé

Développeur Full Stack

Ugolin Ollé

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.

Wezterm Configuration

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

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 !

  • This is a work in progress, and the content may change over time.
  • If you have any questions or suggestions, feel free to reach out.
  • Email me