Introduction

Le terminal est mon outil quotidien, aussi bien sur le plan personnel ou professionnel. Je l'utilise pour me connecter en ssh et administrer des serveurs, pour exécuter des commandes git, éditer des fichiers avec vim, etc.

Il est donc très utilisé, c'est une bonne raison pour le modifier et le personnaliser pour le rendre encore plus pratique voire performant.

Dans cet article, j'aborderai l'ensemble des outils que j'utilise à travers mon shell de prédilection : le zsh.

Bien évidemment, tout ce que je présente à vocation à évoluer avec le temps (certains outils peuvent être remplacés par d'autres plus performants).

Le plus important, le terminal

Étant un utilisateur de macOS, j'installe à chaque fois que je réinitialise mon système d'exploitation un terminal assez performant, beaucoup plus que celui de base fourni par Apple. J'ai nommé Iterm2.

Vous pouvez le télécharger à cette adresse.

Ou passer par brew :

brew install iterm2

Ce terminal possède plusieurs atouts : interface épurée, une recherche globale, nombreuses fonctionnalités (comme l'intégration avec tmux que nous verrons plus loin), une variété de thèmes maintenus par la commuanuté, etc. La liste complète des fonctionnalités est disponible ici.

terminal-tools-iterm2

Le Shell, utilisons zsh

Le zsh est un shell très puissant qui commence à faire son entrée par défaut dans plusieurs distributions GNU/Linux et même depuis peu dans macOS depuis Catalina.

Il est aussi appelé Z shell, sa première version date de 1990 par son créateur Paul Falstad, et il reprend les fonctions les plus intéressantes du bash, ksh et tcsh.

Il a la particularité de disposer d'un "prompt" gauche (comme la plupart des interpréteurs de commande) mais aussi d'un "prompt" droit, ce qui est très pratique pour afficher certaines informations comme le code retour d'une commande ou la durée de celle-ci. De plus, ce second prompt disparaît si la commande affichée est trop volumineuse.

On pourrait citer plusieurs autres avantages (en le comparant au Bash) :

  • Complétion des commandes ou chemins en affichant successivement l'ensemble des choix disponibles et sans tenir compte de la casse;
  • Édition des variables d'environnement directement avec vared, par exemple vared PATH permet de modifier le PATH;
  • Édition des commandes en multilignes;
  • Proposition de commande lors d'une erreur de frappe dans celle qui a été exécutée;
  • Beaucoup d'alias définis (par exemple .. qui correspond à cd ..), ce qui permet de gagner du temps;
  • Partage de l'historique des commandes entre tous les shells zsh actifs d'une même machine.

Attention par contre si vous migrez de bash à zsh, les tableaux commencent à l'index 1 en zsh et non pas 0. Vous risquez d'avoir quelques soucis.

Pour installer zsh et l'utiliser par défaut pour l'utilisateur actuel (celui qui exécute la commande), il suffit d'exécuter ces différentes commandes :

# Installation
brew install zsh
# Modifier le shell par défaut
chsh -s [chemin de votre interpréteur zsh]
# Pour connaître son chemin, vous pouvez faire cette commande qui liste l'ensemble des shells disponibles sur le système
cat /etc/shells

Exemple dans mon cas pour mettre zsh par défaut :

$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

$ chsh -s /bin/zsh

Dès lors que vous choisissez le zsh comme shell par défaut, votre fichier de configuration devient le ~/.zshrc.

Plusieurs petites fonctionnalités peuvent être ajoutées pour améliorer encore plus le zsh :

  • zsh-autosuggestions : Cela permet d'aller récupérer dans l'historique la dernière commande commençant par ce que l'utilisateur vient de taper. Si vous souhaitez plus d'informations, vous pouvez suivre ce lien;
  • zsh-completions : Permet lors de l'utilisation de la touche de suggérer les bonnes options pour les commandes systèmes ou celles qui sont installées par l'utilisateur. Fiche descriptive disponible via ce lien;
  • zsh-syntax-highlighting : Permet d'afficher en vert les commandes systèmes ou celles qui sont installées uniquement quand elles sont valides. Le lien vers github est disponible ici.

Un exemple ici en activant zsh-autosuggestions et zsh-syntax-highlighting :

terminal-tools-zsh

Il en existe d'autres, mais ce sont celles que j'utilise tous les jours.

Oh My Zsh, la gestion des plugins

Oh My Zsh est un framework open-source qui est maintenu et développé par une communauté qui permet de centraliser la configuration du zsh (thèmes, plugins, etc.).

Pour la gestion des plugins, on peut spécifier dans la configuration ceci :

plugins=(
  virtualenv git tmux
)
  • virtualenv permet d'afficher environnement virtuel python dans lequel on se trouve;
  • git permet d'afficher la branche, les fichiers à versionner, ou le nombre de "diff" qu'il y a à commiter;
  • tmux permet d'intégrer les fonctionnalités de tmux comme le fait d'attacher la session au démarrage.

Exemple ici avec git, où la branche actuelle est master, le ?1 symbolise un nouvel élément.

terminal-tools-ohmyzsh-git

Vous pouvez installer Oh My Zsh via cette commande :

sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Un peu de couleur ! Passons au thème Powerlevel10k

Powerlevel10k est un thème qui peut s'intégrer à Oh My Zsh tout en intégrant beaucoup de fonctionnalités au niveau du prompt.

Il est vraiment simple à mettre en oeuvre, les commandes ci-dessous l'installe et le configure en fonction de différents choix personnalisés :

# Installation
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# Configuration
p10k configure

Le mien ressemble à ça :

terminal-tools-powerlevel10k

La configuration est entièrement guidée et elle va détecter votre terminal et installer les bonnes polices pour avoir un terminal fonctionnel dès la fin de l'installation. C'est vraiment très pratique et sans difficulté.

Le pratique au quotidien, j'ai choisi fzf

fzf est ma dernière trouvaille en matière d'outil, il s'intègre à zsh ou à un autre shell et permet de modifier certaines fonctionnalités comme la recherche de commande via les touches <CTRL> + R par une interface beaucoup plus intuitive.

Avec l'exemple ci-dessous pour la commande ls -al :

terminal-tools-fzf-ctrl-r

Plusieurs autres fonctionnalités sont très intéressantes :

  • La combinaison <CTRL> + T affiche l'ensemble des dossiers / fichiers afin de naviguer à travers l'aborescence;
  • L'utilisation de ** en guise de complétion, par exemple cd ** affichera toutes les options possibles avec la commande cd. De même que ssh ** affichera tous hosts (IPs ou noms de domaine) qui ont déjà été utilisés pour se connecter en ssh.

terminal-tools-fzf-ssh--

Bref, il y a énormement de choses à faire avec fzf, vous pouvez accéder à l'ensemble des fonctionnalités en cliquant ici.

Pour l'installer via brew (macOS), c'est assez simple :

brew install fzf
$(brew --prefix)/opt/fzf/install

Les autres méthodes d'installation sont disponibles via ce lien.

Tmux, l'art de diviser

Tmux, c'est vraiment l'outil indispensable quand on a besoin d'accéder à plusieurs machines en même temps. Outre la personnalisation de la barre du bas où l'on peut afficher la date du jour, la batterie de son portable, son ip privée / publiques ou bien d'autres choses. Il prend tout son sens quand on peut séparer son terminal en plusieurs panes ce qui permet d'effectuer plusieurs actions à la fois dans une même fenêtre.

Je vous invite à consulter cet article que j'avais eu l'occasion d'écrire en 2019. Ma configuration n'a que très peu changé.

Vous pouvez aussi utiliser Oh my tmux! qui permet de simplifer la configuration de votre tmux avec un ensemble de clé / valeur à configurer.

Par exemple :

# -- clipboard -----------------------------------------------------------------

# in copy mode, copying selection also copies to the OS clipboard
#   - true
#   - false (default)
# on macOS, this requires installing reattach-to-user-namespace, see README.md
# on Linux, this requires xsel or xclip
tmux_conf_copy_to_os_clipboard=true

Cela permet simplement d'accepter ou non que ce que l'on copie via tmux est intégré au presse-papiers du système d'exploitation plutôt que d'ajouter la ligne ci-dessous pour avoir la même fonctionnalité (pour macOS).

setw -g mode-keys vi
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"

Voici à quoi ressemble ma barre en bas de mon terminal :

terminal-tools-tmux

Conclusion

Vous connaissez sûrement le proverbe "on reconnaît le bon ouvrier à ses outils", et bien c'est un petit peu pareil en informatique. Un environnement de travail efficace est composé d'outils accélèrent votre productivité sans pour autant surcharger votre machine de choses superflues.

Vous pouvez donc vous inspirer de ma boîte à outils pour personnaliser votre terminal voire même de découvrir d'autres petites fonctionnalités pour enrichir votre shell.