Mon terminal: un terminal haut en couleur
La configuration de mon terminal iTerm2 sous Mac
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 :-)
É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-papierSplit Panes
: Possibilité d’ouvrir plusieurs terminaux dans la même fenêtre.
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
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 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 commandeasp
(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’environnementsAWS_DEFAULT_PROFILE
,AWS_PROFILE
etAWS_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 variableAWS_SDK_LOAD_CONFIG=1
pour que ces profils soient reconnues par certains SDK AWS.
Utilisation du plugin aws pour changer de profil.
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é unalias tf="terraform"
utilisant Terraform au quotidien.colored-man-pages
: Coloration des pages d’aides des programmes. Exemple :man git
.
Thème: Powerlevel9K
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.
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 :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.