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 à 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 :-)

Je mettrai à jour cette page régulièrement avec de nouveaux outils. Référez-vous à la date de dernière mise à jour de l’article.

É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.4.3.

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 terminaux dans la même fenêtre.

Image du terminal divisé en 4 Terminal divisé en 4 avec les raccourcis 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 d’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.8) et Oh My Zsh (commit 4b2431e8b1c08a2dc14 du 28-12-2020) :

  • Selection des suggestions d’autocomplétion

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

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

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

La configuration d’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’interpréteur.
  • aws: autocomplétion pour la CLI AWS et quelques fonctions pour switcher de profils 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 profils disponibles. Le nom du profil 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 profils assument des rôles, il est nécessaire d’exporter également la variable AWS_SDK_LOAD_CONFIG=1 pour que ces profils soient reconnues par certains SDK AWS.

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

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 tenté 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’afficheront 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 d’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 éléments 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écédentes 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 qu’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 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.17.1.

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 efficacement 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écessaire. La recherche exacte est aussi possible avec l’option --exact.

Revenons à nos 🐑. J’utilise fzf version 0.24.4 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 partie 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 continuera la recherche dans sa base de données avec les autres repertoires qui se rapprochent du paramètre fourni.

direnv : chargement automatique de 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éalable, ceci pour éviter de charger sans le vouloir un fichier qu’on aurait récupéré d’une source externe par exemple.

Il existe également 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ées quand on quitte l’arborescence dans lequel le fichier .envrc se trouve.

J’utilise direnv (version 2.26.0) 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 met 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"

tfenv: changer de version de Terraform

tfenv est un gestionnaire de versions pour Terraform permettant d’installer plusieurs versions en parallèle avec tfenv install 0.13.4 et de changer de version avec tfenv use 0.13.4. Il peut aussi automatiquement changer de version s’il y a un fichier .terraform-version avec la version de Terraform à la racine d’un projet.

tfenv s’avère particulièrement utile lorsque l’on travaille sur plusieurs stacks Terraform qui n’utilisent pas les mêmes versions.

ag: le chercheur d’argent

ag: The Silver Searcher est un outil de recherche de texte “à la grep” mais avec un focus sur la recherche de code et la rapidité. Il semble être beaucoup plus rapide que d’autres outils similaires. Je l’utilise à la place de grep pour faire des recherches à partir du terminal.

ag ignore par défaut les patterns dans le fichier .gitignore et un fichier .ignore optionnel. Il permet aussi de filter les fichiers dans lesquels chercher avec un ensemble prédéfinis de types de fichiers par langage de programmation.

Exemple :

# Recherche des fonctions python dans les fichiers .py
$ ag --python ^def
# Recherche de la ressource aws_efs_file_system dans les fichiers .tf et .tfvars
$ ag --terraform aws_efs_file_system
# Affichage de l'ensemble des types de fichiers supportés par défaut
$ ag --list-file-types

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 SFEIR
comments powered by Disqus