Retour
Featured image of post Zellij, le multiplexeur de terminal moderne !

Zellij, le multiplexeur de terminal moderne !

Va-t-il mettre fin à la traditionnel guerre Tmux / Screen ?

Un des outils de base que l’on utilise tous les jours après l’éditeur de code et peut-être le navigateur, c’est le multiplexeur de terminal. Celui qui vous permet de laisser tourner des programmes en arrière plan en conservant le contexte, partager un terminal en direct , mais aussi bien sûr de multiplier les terminaux et de les arranger comme bon vous semble.

Utilisateur de Tmux de longue date comme vous avez pu le deviner au travers de certains articles, je me suis posé la question d’une possible migration après avoir vu Zellij dans mon fil Twitter il y a quelques mois. Les promesses ? Plus de flexibilité, de modernité, le tout en restant très léger et rapide.

Après un premier essai trop rapide il y a quelque temps, j’ai décidé de retenter l’expérience en prenant le temps de mieux comprendre ce qu’il y a sous le capot.

La découverte

Première chose intéressante c’est que l’on peut tester Zellij sans même l’installer !

bash <(curl -L zellij.dev/launch)

Le script du curl est assez basique et installe tout de même une release dans le répertoire temporaire /tmp

Aucun package n’est malheureusement disponible pour Debian, je passe donc par asdf qui lui permet de l’installer.

L’interface par défaut est assez claire et a le bon goût d’afficher en bas une aide rappelant les différents raccourcis clavier.

Chargé, mais tout est là
Chargé, mais tout est là

Rapidement nous retrouvons nos marques et nous réussissons à créer, supprimer, naviguer entre les différents panneaux et onglets. Chose intéressante Aram Drevekenin le développeur de Zellij a choisi une approche modale comme Vim. Par exemple pour changer le nom d’un onglet, vous allez d’abord passer en mode onglet <crtl+t>, choisir votre onglet, puis faire <r> pour le renommer.

C’est une approche qui ne perdra pas les utilisateurs de Vim, mais qui va demander un peu de pratique à d’autres. Une fois habitué c’est très flexible et rapide, les contrôles par défaut sont plutôt bien définis.

Les fonctionnalités sympas

Bon pouvoir multiplier les terminaux comme des petits pains c’est sympatique, mais Tmux et Screen le font eux aussi très bien. Donc je ne vais pas m’étendre dessus et je vais plutôt vous présenter les fonctionnalités qui m’ont fait quitter Tmux.

Les fenêtres flottantes

Souvent dans mon travail quotidien quand je code ou autre et j’ai besoin d’un terminal pour lancer une action, un test, un build ou autre sans pour autant l’ajouter à mon layout. Avec Tmux, j’ouvrais un onglet temporaire et je le fermais, c’était plutôt lourd.

Zellij répond parfaitement à ce problème avec la notion de fenêtres flottantes, vous pouvez en effet à tout moment ouvrir un panneau flottant au-dessus des autres. Pour cela rien de plus simple, en mode pane <ctrl+p> faite <alt+w> !

Une efficacié redoutable
Une efficacié redoutable

Mais attendez, ce n’est que le début ! Cette fonctionnalité va bien plus loin.

Vous pouvez les déplacer à la souris, même si ce n’est pas le plus ergonomique je trouve ça incroyable et ça m’a déjà servi.

Vous pouvez en créer plusieurs en même temps, ce dont j’ai rarement besoin, mais qui reste une option.

Pour le coup, une fois votre action terminée vous pouvez les passer au second plan avec le même raccourci et y revenir quand vous le souhaitez. C’est très pratique d’avoir une session flexible pour de petites actions. Une habitude que vous allez vite prendre !

Sortie de commande vers éditeur

Surement un titre un peu obscur, mais cette fonctionnalité est très pratique. Vous pouvez ouvrir l’output d’une commande dans votre éditeur favori en un raccourci !

Si vous faites en mode search <ctrl+s>, la commande édite <s> un fichier temporaire va être automatiquement créé avec le contenu des commandes précédentes. Dans mon cas, c’est pratique pour traiter avec NeoVim des sorties un peu complexes que je veux nettoyer avant d’envoyer.

Les layouts

Avec le temps on a tous nos petites habitudes de travail avec notre petite organisation des terminaux quand on fait des actions courantes. Tiens, prenons l’exemple de ce blog, j’écris mes articles sous NeoVim pour des questions de pratique, je divise en 3 zones :

  • La principale, mon éditeur dans lequel j’écris l’article
  • La zone en bas à gauche, où j’ai Hugo (le CMS static) qui tourne en local
  • Et enfin la zone en bas à droite où j’ai un terminal pour git et d’autres petites actions

Le confort en une seconde
Le confort en une seconde

J’ai des organisations similaires pour un ensemble de cas, Terraform, debug d’industrialisation et j’en passe.

En général, on refait rapidement son installation à chaque fois, ce n’est pas grand-chose en soi. Néanmoins, ça reste une action répétitive sur lequel Zellij vous propose une solution, les layout !

Vous pouvez définir dans des fichiers une organisation de panneaux avec les différentes proportions et même exécuter automatiquement les bonnes commandes.

Le plus simple est de prendre l’exemple que je vous ai montré un peu plus haut avec mon blog. Le code pour mon layout est le suivant :

layout {
   	pane size=50  // La définition des tailles en % marche pas toujours au mieux
   	pane split_direction="vertical" { // on peut split
    	pane command="make" { // on peut lancer des commandes automatiquement
   				 args "local"
   			 }
    	pane command="git" {
   				 args "status"
   			 }
	}
	pane size=1 borderless=true { // on doit définir les menus si ont le veut
    	plugin location="zellij:tab-bar"
	}
}

D’ailleurs si vous ne souhaitez pas démarrer votre fichier de zéro vous pouvez l’initialiser avec le layout par défaut : zellij setup –dump-layout default

Pour lancer un de ces layouts rien de plus simple, faite juste un : zellij action new-tab –layout <votre_layout>.kdl

Personnellement, je mets un fichier .zellij.kdl dans les projets où j’utilise un layout spécifique, ça me fait gagner un peu de temps, mais surtout du confort.

Personnalisation

Bien que les layouts soient déjà une sorte de personnalisation très intéressante et puissante, Zellij ne s’arrête pas là bien sûr.

Configuration

Si vous avez été attentif, vous avez remarqué que l’interface des exemples précédents ne ressemble pas à la première. C’est normal, je l’ai personnalisé et encore une fois c’est très accessible.

Comme la majorité des outils, vous pouvez définir un fichier de configuration dans ~/.config/zellij/config.kdl. Vous pouvez générer une base par défaut avec la commande : zellij setup --dump-config > ~/.config/zellij/config.kdl

On remarque à nouveau l’utilisation de .kdl qui est un nouveau langage de configuration, une alternative aux traditionnels Yaml ou encore Toml.

Dans cette configuration, je vous passe le premier nœud de paramètre keybinds, qui vous permet bien sûr de personnaliser l’ensemble des raccourcis.

C’est ici qu’on va définir les plugins notamment, personnellement je suis encore sur ceux fournis par défaut :

plugins {
	tab-bar { path "tab-bar"; }
	status-bar { path "status-bar"; }
	strider { path "strider"; }
	compact-bar { path "compact-bar"; }
}

Ensuite il y a la définition des thèmes, vous pouvez en définir plusieurs, utilisant uniquement Nord, j’ai supprimé les autres. On peut sélectionner le thème à utiliser avec theme “nord”.

N’aimant pas avoir 2000 niveaux de menu et de barre qui me rappelles que trop les Internet Explorer familiaux accumulant les toolbars, j’ai réduit aux maximums ceux-ci avec les deux options suivantes :

default_layout "compact"
simplified_ui true

A noter un gros avantage de Zellij, j’ai directement dans la configuration pu définir la commande à utiliser pour faire des copier-coller. Par défaut, il vous suffit de sélectionner du texte pour copier.

Ma configuration Zellij est disponible sur mon Github

Les plugins

Les plugins sont essentiels sur ce type de solution pour garantir une personnalisation accrue. Pour le coup, dans Zellij tout est plugin, y compris les barres d’onglet et de menu ce qui en fait un outil très flexible.

Zellij étant écrit en Rust, on pourrait penser que nous sommes obligés d’utiliser nous aussi Rust pour les plugins, mais il n’en est rien. Ils ont le bon goût de se reposer sur WebAssembly qui permet de développer son plugin avec n’importe quel langage !

Néanmoins, même si la base est solide, elle est encore très jeune et demande sûrement un peu de temps avant d’avoir un écosystème aussi complet que les concurrents historiques.

La fin de Tmux et Screen ?

Objectivement depuis mon passage à Zellij, je ne suis retourné qu’une fois à Tmux. Tout simplement, car je n’ai pas encore trouvé le moyen de synchroniser des inputs entrées en ensemble de terminaux.

Sur tous les autres points, je n’ai aucun reproche à faire à Zellij, il fonctionne très bien, ne souffre pas de bug ou de latence forte dus à son jeune âge.

Le choix de la solution technique me semble très pertinent et efficace, que ce soit pour Rust, WebAssembly ou encore KDL que j’ai découvert avec ce projet.

En bref, comment faire autrement que de le conseiller ? Essayez-le, même avec le système d’installation temporaire.

Head photo by Vadim Sherbakov on Unsplash

Généré avec Hugo
Thème Stack conçu par Jimmy