Aller au contenu

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

pms2

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.

Fenêtre de terminal
brew install zsh

On va installer Oh-my-zsh qui un framework de zsh :

Fenêtre de terminal
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) :

Fenêtre de terminal
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 :

Fenêtre de terminal
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) :

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 WezTerm
local wezterm = require("wezterm")
-- Créer une nouvelle configuration
local config = wezterm.config_builder()
-- C'est ici que tu appliques tes choix de configuration
config.color_scheme = "Banana Blueberry" -- Choisir le schéma de couleurs
config.font = wezterm.font("Comic Shanns") -- Définir la police d'écriture
config.font_size = 14 -- Définir la taille de la police
config.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 gauche
config.send_composed_key_when_right_alt_is_pressed = false -- Alt droite
-- Ajouter des raccourcis clavier pour les splits
config.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 macOS
config.window_background_opacity = 0.9 -- 90% d'opacité
config.macos_window_background_blur = 10 -- Flou
-- Taille de la fenêtre par défaut
config.initial_cols = 160 -- Largeur
config.initial_rows = 48 -- Hauteur
-- Personnalisation du curseur
config.colors = {
cursor_bg = "#FFFFFF", -- Fond (blanc)
cursor_border = "#FFFFFF", -- Bordure (blanc)
cursor_fg = "#000000", -- Texte sous le curseur (noir)
}
-- Utiliser des onglets arrondis
config.use_fancy_tab_bar = true -- Style arrondi
config.tab_bar_at_bottom = false -- Barre en haut
-- Fonction pour afficher le nom de l'hôte dans les onglets
wezterm.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 à droite
wezterm.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 à WezTerm
return 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.

Fenêtre de terminal
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-highlighting
brew install zsh-autosuggestions

Pour les activer dans votre .zshrc ajouter les lignes suivantes :

Fenêtre de terminal
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.

Sources