Mon terminal: un terminal haut en couleur

La configuration de mon terminal iTerm2 sous Mac

Capture d'écran de mon terminal iTerm2

Table des matières

Passant le plus clair de mes journées sur le terminal à écrire diverses commandes, il m’est apparu primordial de le configurer pour rendre son utilisation plus agréable et gagner en productivité (un autre objectif inavoué est le fait de susciter l’effet waouh quand un collègue voit mon terminal 😄).

Dans cet article, je présenterai ma configuration ainsi que les différents outils que j’utilise au quotidien dans le terminal. Il s’agit d’outils conseillés par des collègues et/ou trouvés sur la toile au fil des années. La configuration du terminal peut prendre un certain temps (surtout les polices de caractères et le thème…). Il faut donc s’armer de courage si cela ne marche pas du premier coup.

Je suis sur Mac mais la plupart du contenu de cet article s’appliquera à des distributions Linux. Les outils cités dans cet article peuvent être installés avec brew que j’utilise comme gestionnaire de packages. Je vous encourage vivement à faire un tour sur les pages de ces outils en cas de soucis. Les versions citées correspondent aux versions que j’utilise au moment où j'écris ces lignes.

Bonne lecture en espérant que son contenu vous soit utile :-)

Émulateur : iTerm2

Tout commence par l'émulateur de terminal. Celui par défaut sur Mac fait le boulot mais il reste très limité en fonctionnalités. Il y a nettement mieux comme émulateur notamment iTerm2 que j’utilise comme émulateur. J’ai la version 3.3.10beta3.

Il dispose d’une pléthore de fonctionnalités dont je vous laisse le soin de regarder. Quelques fonctionnalités:

  • Copy to pasteboard on selection: la selection d’un texte dans le terminal le copie automatiquement dans le presse-papier
  • Split Panes: Possibilité d’ouvrir plusieurs terminal dans la même fenêtre.

Image du terminal divisé en 4 Terminal divisé en 4 avec les racourcis Cmd + D et Cmd + Shift + D

  • Support avancé des polices de caractères, des couleurs et des ligatures: nécessaire pour certains thèmes Oh My ZSH (voir plus bas). J’utilise la police de caractères Roboto Mono for Powerline par défaut et Source Code Pro for Powerline pour les caractères non-Ascii.
  • Cmd + click sur le nom d’un fichier, repertoire ou un lien pour l’ouvrir directement dans l’application par défaut.
  • Status bar pour l’affichage des informations système telles que l’utilisation de la RAM, CPU.
  • Transparence et effet blur pour le terminal.

Le shell: Oh My Zsh

Avoir un bon émulateur de terminal c’est une chose mais avoir un bon shell Unix c’en est une autre. Avant, comme à peu près tout le monde débutant en informatique, j’utilisais Bash qui est le shell par défaut sur beaucoup de distributions.

Puis un jour, j’ai découvert Zsh et Oh My Zsh. Bash et Zsh sont tous les deux basés sur le bourne shell (sh). Zsh offre plus de fonctionnalités que Bash tout en étant “globalement” compatible avec Bash (quelques différences à prévoir). Les différences majeures se situent au niveau du shell interactif. Vous trouverez des comparatifs en note de bas de page 1.

Oh My Zsh quant à lui, est un framework, un ensemble de plugins et de thèmes pour configurer Zsh. La popularité croissante de Zsh est en partie liée à celle de Oh My Zsh. Oh My Zsh est, pour moi, presque indispensable pour profiter pleinement de Zsh.

Quelques fonctionnalités de Zsh (j’utilise la version 5.3) et Oh My Zsh (commit d247f98d3edccfd du 23-03-2020):

  • Selection des suggestions d’autocomplétion

Selection des suggestion de l’autocomplétion Navigation avec les flèfles dans les propositions de l’autocompléation

  • Navigation dans un dossier en tappant son nom
  • Un ensemble d’alias et de commandes pour naviguer dans les repertoires
  • Navigation dans l’historique d’une commande: ecrivez une commande et utilisez la flèche du haut pour retrouver toutes les entrées de l’historique commançant par la commande ecrite.

Navigation dans l’historique Navigation dans l’historique des commandes commençant par git et par ls.

La configuration de Oh My Zsh se fait entièrement dans le fichier ~/.zshrc.

Plugins

Oh My Zsh dispose d’un système de plugins qui permettent d'étendre ses fonctionnalités. Ces plugins sont inclus par défaut lors de l’installation de celui-ci. Pour activer un plugin, il suffit de l’ajouter dans la variable plugins dans le ~/.zshrc.

J’utilise les plugins suivant:

  • git (installé par défaut): fournit un ensemble de fonctions et d’alias pour git (alias | grep git pour les afficher).
  • docker: autocomplétion pour les commandes docker: nom/identifiants des conteneurs, images, networks.
  • history: fournit des alias pour faire des recherches dans l’historique (hsi notamment pour faire une recherche insensible à la casse).
  • zsh-syntax-highlighting: coloration des commandes écrites dans l’interpreteur.
  • aws: autocomplétion pour la CLI AWS et quelques fonctions pour switcher de profiles AWS dans le terminal. Il s’agit du plugin que j’utilise le plus. Travaillant souvent chez plusieurs clients en même temps, il est indispensable de savoir quel profile AWS est actuellement activé dans le terminal.
    Il fournit la commande asp (Aws Switch Profile) qui parse le contenu du fichier ~/.aws/config pour fournir la liste des profiles disponibles. Le nom du profile est également affiché (à droite sur l’image suivante). Dans les faits, asp ne fait qu’exporter les variables d’environnements AWS_DEFAULT_PROFILE, AWS_PROFILE et AWS_EB_PROFILE qui sont reconnues automatiquement par la CLI et les différents SDKs AWS. Si vos profiles assument des rôles, il est nécessaire d’exporter également la variable AWS_SDK_LOAD_CONFIG=1 pour que ces profiles soient reconnues par certains SDK AWS.

Capture Plugin AWS Utilisation du plugin aws pour changer de profile.

Si l’autocomplétion ne marche pas par défaut avec le plugin aws, rajouter source aws_zsh_completer.sh dans le ~/.zshrc.
  • terraform: autocomplétion pour les commandes Terraform et affichage du workspace courant. J’ai aussi rajouté un alias tf="terraform" utilisant Terraform au quotidien.
  • colored-man-pages: Coloration des pages d’aides des programmes. Exemple: man git.
On peut être tenter d’activer beaucoup de plugins mais cela pourrait grandement ralentir le lancement du terminal. À activer avec parcimonie donc.

Thème: Powerlevel9K

Mise à jour du 26/06/2020: Powerlevel9K n’est plus maintenu depuis le 23 Avril 2020. Il y a un fork de Powerlevel9k, Powerlevel10K qui apporte de nouvelles fonctionnalités et est censé être plus rapide. La configuration que j’explique ici devrait marcher pour Powerlevel10K également. Se référer à la documentation pour plus de détail.

Parmi la multitude de thèmes disponibles pour Oh My Zsh, j’utilise Powerlevel9K version v0.6.7. Il s’agit du thème utilisé dans les captures d'écran. C’est un thème assez extravaguant que l’on peut personnaliser à souhait.

L’installation est plutôt facile à condition d’avoir les bonnes polices de caractères sinon les icônes ne s’affiront pas correctement. Si après l’installation du thème, vous avez des problèmes de rendu des icônes, il s’agit très probablement de la police qui n’est pas bien configurée au niveau du thème et/ou de iTerm2.

J’utilise les paramètres suivant dans mon ~/.zshrc :

export TERM="xterm-256color"

POWERLEVEL9K_MODE='awesome-patched'
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(status dir vcs)
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(virtualenv aws custom_terraform)
POWERLEVEL9K_TIME_FORMAT="\uf017 %D{%H:%M:%S}"
POWERLEVEL9K_AWS_FOREGROUND='232'
POWERLEVEL9K_AWS_BACKGROUND='208' # pour avoir une couleur orangée proche de celle d'AWS
POWERLEVEL9K_VIRTUALENV_BACKGROUND='231'
POWERLEVEL9K_VIRTUALENV_FOREGROUND='232'
POWERLEVEL9K_PYTHON_ICON='\U1F40D' # icône 🐍 quand j'active un virtual env python
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_from_right"
POWERLEVEL9K_SHORTEN_DIR_LENGTH=3
POWERLEVEL9K_CUSTOM_TERRAFORM="tf_prompt_info" # terraform element pour l'affichage du workspace
POWERLEVEL9K_CUSTOM_TERRAFORM_BACKGROUND=057
POWERLEVEL9K_CUSTOM_TERRAFORM_FOREGROUND=015

# Cette ligne doit venir après la configuration du thème.
ZSH_THEME="powerlevel9k/powerlevel9k"

Les élements affichés à droite et à gauche du terminal sont déterminés par les variables POWERLEVEL9K_LEFT_PROMPT_ELEMENTS et POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS. La couleur de chaque élément est également personnalisable. Voir la documentation sur github pour plus d’informations.

Il y a un bug en affichant le prompt sur une nouvelle ligne: les lignes précedentes sont effacées lors de l’utilisation de la tabulation pour l’autocomplétion. Si c’est le cas, commentez la ligne COMPLETION_WAITING_DOTS="true" dans le ~/.zsrhc.

Autres

Voici quelques outils que j’utilise en plus au quotidien dans le terminal.

Un peu de couleurs avec exa

exa est un outil qui permet de lister des fichiers. Dit autrement, c’est un ls survitaminé avec plein de fonctionnalités. J’ai fait un alias dans mon ~/.zshrc pour remplacer la commande ls:

alias ls="exa -g"

Les couleurs de la première capture d'écran sont générées par exa. Je n’utilise cependant qu’une petite partie des options disponibles. Voir la documentation pour aller plus loin. J’utilise la version v0.9.0.

bat, le remplaçant de cat

Dans la même lignée que exa, bat est un cat survitaminé avec plein d’options. Comme son homologue cat, bat affiche le contenu des fichiers passés en paramètre en rajoutant de la coloration syntaxique, de la pagination (un peu comme less) et intègre un git diff par défaut.

Ma configuration dans le ~/.zshrc:

alias cat="bat"
export BAT_THEME="TwoDark"
export BAT_STYLE="plain,changes"

J’utilise la version 0.13.0.

Recherche dans l’historique avec fzf

fzf pour Fuzzy Finder est un programme qui permet de filtrer une entrée (stdin) en une sortie (stdout) de manière interactive. Vu comme ça, rien d’extraordinaire (grep fait à peu près la même chose vous me direz).

La puissance de fzf se trouve dans son algorithme de recherche approximative ou fuzzy matching. Ceci permet de filtrer éfficacement même avec des fautes d’orthographes. La même technique est utilisée par les correcteurs orthographiques. Une recherche approximative permet d’avoir plus de résultats mais peut aussi en fournir plus que nécessaires. La recherche exacte est aussi possible avec l’option --exact.

Revenons à nous moutons 🐑. J’utilise fzf version 0.21.1 pour chercher une commande dans mon historique. J’ai remplacé le traditionnel raccourci Ctrl+R par fzf. Démonstration avec une recherche dans mon historique: Navigation dans l’historique Recherche dans l’historique avec Ctrl+R

La recherche dans l’historique n’est qu’une partie des fonctionnalités que j’utilise. Voir cet article pour un aperçu des autres fonctionnalités. Quelque part dans mon ~/.zshrc:

[ -f ~/.fzf.zsh ] && source ~/.fzf.zsh

jump: sauter dans ses repertoires les plus visités

jump fait parti de ces outils dont on ne sait pas qu’on en a besoin jusqu'à commencer à les utiliser et s’y habituer. Il y a un avant et après jump.

jump (avec comme alias j une fois installée) garde un historique des repertoires les plus visités pour donner la possibilité de “sauter” d’un repertoire à un autre à partir de n’importe où. Le gain de temps est loin d'être négligeable quand on switch souvent entre plusieurs projets/repertoires dans la journée.

Exemple: Je vais souvent dans le dossier de mon blog ~/dev/blog.haidara.io-v2. En intégrant jump (j’ai la version 0.30.1) dans mon shell, de n’importe où je peux faire j blog-v2 pour aller directement dans ~/dev/blog.haidara.io-v2.

Ma configuration dans le ~/.zshrc:

eval "$(jump shell)"

Il est possible de faire plusieurs jump si la première proposition n’est pas correcte. Il va continuer à chercher dans sa base de données les autres repertoires qui match.

direnv: chargement automatique des variables d’environnement

direnv est une extension du shell qui permet de charger automatiquement les variables contenues dans le fichier .envrc du repertoire courant. Chaque repertoire dont on souhaite le chargement du fichier .envrc doit être autorisé au préable, ceci pour éviter de charger sans le vouloir un fichier qu’on aurait récupéré d’une source externe par exemple.

Il existe le plugin dotenv intégré à Oh My ZSH qui lui charge le fichier .env sans une autorisation préalable. Une autre différence non négligeable est le fait que direnv “supprime” automatiquement les variables qu’il a chargé quand on quitte l’arborescence dans lequel le fichier .envrc se trouve.

J’utilise direnv (j’ai la version 2.21.2) avec mes projets Terraform pour charger des “secrets”: API keys, clés privées pour accéder à MongoDB Atlas… Ces variables étant sensibles, on ne les mets pas en clair dans les fichiers Terraform. Terraform charge automatiquement toutes les variables d’environnement commençant par TF_VAR_. Exemple:

$ cat .envrc
export TF_VAR_mongodb_atlas_private_key="123456789012"
export TF_VAR_sftp_password="password123"
export TF_VAR_apigee_password="password321"

Conclusion

Ces outils peuvent paraître “too much” aux premiers abords mais en s’y habituant, le gain de productivité est loin d'être négligeable. Avoir un terminal coloré est aussi beaucoup plus agréable au quotidien qu’un fond noir avec des caractères blancs.

Et vous, quels outils utilisez au quotidien pour gagner en productivité ? N’hésitez pas à mettre un commentaire vous outils et astuces préférés.


  1. https://stackabuse.com/zsh-vs-bash, https://apple.stackexchange.com/questions/361870/what-are-the-practical-differences-between-bash-and-zsh ↩︎

Consultant Cloud et automatisation chez D2SI
comments powered by Disqus