PIMP MY SHELL #2 / WezTerm, Zsh & p10k (MacOS/Linux)

Aujourd’hui dans PMS (PIMP MY SHELL) second épisode, je vais vous montrer comment j’ai personnalisé mon Shell sous MacOS (valable également sous une distrib).
L’objectif, obtenir ceci 🎨 :
Rendu final de Wezterm avec ma configuration
Allez on y va !
On installe le couple zsh et oh-my-zsh
On va commencer par installer ZSH et oh-my-zsh, pour la suite du billet de blog je vais mettre les commandes homebrew mais ceci est également valable sous un Ubuntu par exemple avec les commandes d’installation d’apt-get.
brew install zsh
On va installer Oh-my-zsh qui un framework de zsh :
sh -c "$(curl -fsSL <https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh>)"
A ce moment vous pouvez tester que cela fonctionne en modifiant dans votre home le .zshrc sous mac. Nous avons donc (modifier l’utilisateur) :
vi /Users/antoine.callot/.zshrc
Il existe un nombre important de thèmes sur oh-my-zsh. Pour appliquer un thème déjà contenu dans le package oh-my-zsh c’est très simple :
ZSH_THEME="af-magic"
Quelques exemples de fonts que je recommande
Pour la suite du tutoriel vous aurez besoin d’une font compatible. Voici une liste (à vous de choisir) :
- Comic Shanns (celui que j’utilise en ce moment)
- JetBrains Mono (le fameux font de JetBrains)
- Cascadia Code
Il y en a bien d’autres 😄.
Installation du thème Powerlevel10k
Le thème que j’utilise est Powerlevel10k ou “pk10” pour les intimes.
Exemple d’utilisation sur le github de powerlevel10k
Pour l’installer vous pouvez faire un petit git clone :
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
Pour appliquer le thème dans le .zshrc :
ZSH_THEME="powerlevel10k/powerlevel10k"
Vous aurez ensuite une petite installation à l’écran qui va s’afficher :
Il faudra suivre les étapes d’installation à l’écran pour finaliser l’installation du thème comme vous le souhaitez 😃
💡 J’avais activé le mode “verbose” (qui permet de debuger le thême), mais il convient l’arrêter en mettant le mode quiet dans le fichier .p10k.zsh :
POWERLEVEL9K_INSTANT_PROMPT="quiet"
Pour relancer la configuration si vous souhaitez effectuer des modifications :
p10k configure
Wezterm présentation et configuration
WezTerm est un terminal moderne, GPU-accelerated, conçu pour être flexible et performant. Pour le rendre plus joli j’ai un peu modifié son paramétrage.
Avantages de Wezterm : comme de plus en plus d’utilisateurs travaillant sur des applications multilingues ou utilisant des symboles complexes (comme des icônes en ligne de commande), la gestion des caractères Unicode est primordiale. WezTerm se distingue ici en offrant un support robuste des caractères Unicode, même pour des caractères rarement utilisés ou des emojis. De plus, l’accélération GPU garantit que le rendu reste fluide, même avec des polices complexes ou un nombre important de lignes de texte.
La flexibilité de l’outil repose en grande partie sur les fichiers de configuration en Lua. Passons en revue une configuration WezTerm spécifique et voyons comment elle peut améliorer l’expérience utilisateur au quotidien.
Vous pouvez ajouter votre propre configuration Wezterm dans le fichier .wezterm.lua dans votre home. Voici ma configuration actuelle de Wezterm :
-- Charger l'API WezTermlocal wezterm = require("wezterm")
-- Créer une nouvelle configurationlocal config = wezterm.config_builder()
-- C'est ici que tu appliques tes choix de configurationconfig.color_scheme = "Banana Blueberry" -- Choisir le schéma de couleursconfig.font = wezterm.font("Comic Shanns") -- Définir la police d'écritureconfig.font_size = 14 -- Définir la taille de la policeconfig.default_cursor_style = 'SteadyBar' -- Définir le style du curseur (ici une barre fixe)config.window_decorations = "RESIZE" -- Autoriser la redimension de la fenêtre
-- Résoudre le problème avec la touche Alt et le caractère "|"config.send_composed_key_when_left_alt_is_pressed = true -- Alt gaucheconfig.send_composed_key_when_right_alt_is_pressed = false -- Alt droite
-- Ajouter des raccourcis clavier pour les splitsconfig.keys = { { key = "V", mods = "CTRL|SHIFT", action = wezterm.action.SplitVertical { domain = "CurrentPaneDomain" } }, -- Ctrl+Maj+V { key = "H", mods = "CTRL|SHIFT", action = wezterm.action.SplitHorizontal { domain = "CurrentPaneDomain" } }, -- Ctrl+Maj+H}
-- Définir l'opacité et le flou d'arrière-plan sous macOSconfig.window_background_opacity = 0.9 -- 90% d'opacitéconfig.macos_window_background_blur = 10 -- Flou
-- Taille de la fenêtre par défautconfig.initial_cols = 160 -- Largeurconfig.initial_rows = 48 -- Hauteur
-- Personnalisation du curseurconfig.colors = { cursor_bg = "#FFFFFF", -- Fond (blanc) cursor_border = "#FFFFFF", -- Bordure (blanc) cursor_fg = "#000000", -- Texte sous le curseur (noir)}
-- Utiliser des onglets arrondisconfig.use_fancy_tab_bar = true -- Style arrondiconfig.tab_bar_at_bottom = false -- Barre en haut
-- Fonction pour afficher le nom de l'hôte dans les ongletswezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width) local host = wezterm.hostname() -- Nom de l'hôte local title = tab.active_pane.title -- Titre de l'onglet actif return { { Text = host .. " : " .. title } }end)
-- Mettre à jour le statut à droitewezterm.on('update-status', function(window) local SOLID_LEFT_ARROW = utf8.char(0xe0b2) local color_scheme = window:effective_config().resolved_palette local bg = color_scheme.background local fg = color_scheme.foreground
-- Couleurs spécifiques local light_green_bg = "#4CAF50" local light_fg = "#ffffff" local light_blue_bg = "#2196F3" local ram_fg = "#ffffff" local docker_bg = "#00ACC1" local docker_fg = "#ffffff"
-- Récupérer les données local host = wezterm.hostname() .. " 🐱" local datetime = wezterm.strftime("%H:%M:%S") .. " ⏰"
-- RAM local handle = io.popen("vm_stat | grep 'Pages active' | awk '{print $3}' | sed 's/\\.$//'") local ram_usage = handle:read("*a") handle:close() local ram_usage_mb = tonumber(ram_usage) * 4 / 1024 local ram_usage_rounded = math.floor(ram_usage_mb) local total_ram = " / 24GB" local ram_icon = "🖥️ "
-- Docker local docker_handle = io.popen("docker ps -q | wc -l") local docker_count = docker_handle:read("*a") docker_handle:close() local docker_icon = "🐳 "
-- Mettre à jour le statut window:set_right_status(wezterm.format({ { Background = { Color = 'none' } }, { Foreground = { Color = bg } }, { Text = SOLID_LEFT_ARROW }, { Background = { Color = bg } }, { Foreground = { Color = fg } }, { Text = ' ' .. host .. ' ' }, { Foreground = { Color = light_green_bg } }, { Text = SOLID_LEFT_ARROW }, { Background = { Color = light_green_bg } }, { Foreground = { Color = light_fg } }, { Text = '' .. datetime .. ' ' }, { Foreground = { Color = light_blue_bg } }, { Text = SOLID_LEFT_ARROW }, { Background = { Color = light_blue_bg } }, { Foreground = { Color = ram_fg } }, { Text = ram_icon .. ' RAM: ' .. ram_usage_rounded .. 'MB' .. total_ram .. ' ' }, { Foreground = { Color = docker_bg } }, { Text = SOLID_LEFT_ARROW }, { Background = { Color = docker_bg } }, { Foreground = { Color = docker_fg } }, { Text = docker_icon .. 'Docker: ' .. docker_count:match("^%s*(.-)%s*$") .. ' ' }, }))end)
-- Retourner la configuration à WezTermreturn config
Je vais décrire plus bas les grande lignes de la configuration.
Chargement de l’API WezTerm et création de la configuration
La première étape consiste à charger l’API de WezTerm via la commande suivante :
luaCopier le codelocal wezterm = require("wezterm") local config = wezterm.config_builder()
Cette partie initialise la configuration et fait appel à l’API interne de WezTerm. Le fichier config_builder()
permet de définir des options personnalisées qui seront appliquées au démarrage du terminal.
Personnalisation des couleurs et de la police
Ici, le schéma de couleurs que j’utilise est : “Banana Blueberry”. La police est “Comic Shanns” comme indiqué plus haut.
config.color_scheme = "Banana Blueberry" config.font = wezterm.font("Comic Shanns") config.font_size = 14
Style du curseur et redimensionnement des fenêtres
J’opte pour un curseur de type “SteadyBar”, pour une meilleure visibilité dans les environnements denses en texte.
config.default_cursor_style = 'SteadyBar'
On active la possibilité de redimensionner les fenêtres via la propriété window_decorations
:
config.window_decorations = "RESIZE"
Gestion des touches Alt et raccourcis clavier pour les splits
J’ai rajouté cette option pouvoir faire des ”|” avec “option+maj+l” sous macOS sans que cela ne déclenche un raccourci :
config.send_composed_key_when_left_alt_is_pressed = true config.send_composed_key_when_right_alt_is_pressed = false
En outre, des raccourcis clavier pratiques sont définis pour diviser l’écran verticalement ou horizontalement :
config.keys = { {key="V", mods="CTRL|SHIFT", action=wezterm.action.SplitVertical {domain="CurrentPaneDomain"}}, {key="H", mods="CTRL|SHIFT", action=wezterm.action.SplitHorizontal {domain="CurrentPaneDomain"}}, }
Cela permet de gérer facilement plusieurs sessions dans une seule fenêtre WezTerm, facilitant ainsi le multitâche.
- Split vertical => crtl + shift + v
- Split horizontal => ctrl + shift + h
Opacité et flou d’arrière-plan
l’opacité de l’arrière-plan est définie à 90%, et un effet de flou est appliqué (pour les utilisateurs macOS) :
config.window_background_opacity = 0.9 config.macos_window_background_blur = 10
Taille de la fenêtre et onglets personnalisés
La taille initiale de la fenêtre est également configurée pour une large vue d’ensemble : 160 colonnes et 48 lignes.
config.initial_cols = 160 config.initial_rows = 48
La configuration des onglets inclut un style arrondi et des titres personnalisés avec le nom de l’hôte :
luaCopier le codeconfig.use_fancy_tab_bar = true config.tab_bar_at_bottom = false
Un script Lua est également mis en place pour afficher le nom de l’hôte dans chaque onglet, ce qui peut être particulièrement utile pour les administrateurs système gérant plusieurs machines en simultané.
Personnalisation du statut et des informations en temps réel
L’un des aspects que j’ai également travaillé dans cette configuration est l’ajout d’un statut personnalisé en bas à droite. Celui-ci affiche plusieurs informations essentielles, telles que l’heure, l’utilisation de la RAM et le nombre de conteneurs Docker actifs :
luaCopier le codewezterm.on('update-status', function(window) local SOLID_LEFT_ARROW = utf8.char(0xe0b2) -- Code pour récupérer et formater les informations de statut window:set_right_status(wezterm.format({ -- Afficher le nom d'hôte, l'heure, l'usage de la RAM et le statut Docker })) end)
Vous pouvez également rajouter des emojis pour faire plus visuel 🐱🐳⏱️ !
😺
Quelques extensions de ZSH
Voici la liste des plugins intégrés à oh-my-zsh que j’utilise :
- git : Fournit des alias et des raccourcis pour faciliter l’utilisation de Git en ligne de commande.
- colorize : Permet de colorer les fichiers JSON, XML, et autres directement dans le terminal pour une lecture plus facile.
- asdf : Gère plusieurs versions de langages de programmation via le gestionnaire de versions asdf.
- copybuffer : Copie directement le contenu de la ligne de commande dans le presse-papiers, ce qui est pratique pour partager des commandes.
- eza : Un remplacement moderne de
ls
avec des options de couleurs et de visualisation améliorées. (nécessite l’instalation d’EZA)
Pour intégrer ces plugins d’Oh My Zsh, ajoutez-les simplement à votre fichier .zshrc
à la ligne plugins
.
plugins=( git colorize asdf copybuffer eza )
Installation d’EZA :
brew install eza
Quand vous activez le plugin eza, les commandes ls
et ll
sont remplacées par les commandes d’Eza :
Et oui encore de la couleur 😄 c’est tout de même plus visuel!
Autres plugins non intégrés à Oh My Zsh que j’utilise zsh-syntax-highlighting
et zsh-autosuggestions
.
- zsh-syntax-highlighting : Ce plugin rend le terminal plus lisible en colorant les commandes. Lorsque vous tapez une commande, la couleur indique si celle-ci est correcte ou comporte des erreurs syntaxiques, ce qui réduit les risques de fautes. Par exemple, une commande valide apparaît en vert, tandis qu’une commande incorrecte devient rouge.
- zsh-autosuggestions : Ce plugin propose des complétions automatiques en fonction de votre historique de commandes. En tapant les premières lettres d’une commande que vous avez déjà utilisée, la suite s’affiche en gris, suggérant une complétion que vous pouvez accepter en appuyant sur la touche Flèche droite.
Pour installer les 2 plugins :
brew install zsh-syntax-highlightingbrew install zsh-autosuggestions
Pour les activer dans votre .zshrc
ajouter les lignes suivantes :
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
Conclusion
Suite à ce tutoriel vous devriez avoir un joli shell pour votre travail. Bien entendu tout est customisable.