Le terminal linux utilise un interpréteur de commandes, aussi appelé shell, pour exécuter les commandes. Parmi les shells les plus utilisés on a bash et zsh. Zsh offrant plus de fonctionnalités que bash, ce tutoriel est écrit pour zsh mais une grande partie est adaptable pour bash.

Le fichier de configuration de zsh est appelé .zshrc et est situé dans le home. Si vous utilisez bash le fichier sera nommé .bashrc. Le nom de fichier commence par un point, ce qui signifie qu’il n’est pas affiché quand vous listez les fichiers avec ls sauf si vous utilisez l’oiption ls -a.

Configuration de base

Les lignes suivantes sont normalement déjà présentes, elles sont écrites à l’installation de zsh. Vous pouvez les modifier pour personnaliser zsh.

# Lines configured by zsh-newuser-install
HISTFILE=~/.histfile
HISTSIZE=1000
SAVEHIST=1000
# End of lines configured by zsh-newuser-install
# The following lines were added by compinstall
zstyle :compinstall filename '<path/to/.zshrc>'

autoload -Uz compinit
compinit
# End of lines added by compinstall
  • HISTFILE définit combien de commandes sont mémorisées dans la mémoire du shell
  • SAVEHIST définit combien de commandes sont mémorisées dans le fichier d’historique
  • HISTFILE est l’emplacement du fichier d’historique
  • autoload -Uz compinit et la ligne suivante activent la complétion

Le prompt

Le prompt est la ligne affichée à chaque ligne par le shell. Vous pouvez y placer les informations qui vous paraissent utiles telles que le chemin actuel ou même sur quelle branche git vous êtes. Vous pouvez afficher deux prompts à la fois, un à gauche nommé PROMPT ou PS1 et l’autre à droite nommé RPROMPT ou RPS1. Plusieurs variables sont prédéfinies, les plus utiles sont:

  • %m: nom de la machine
  • %n: nom de l’utilisateur
  • %c: nom du dossier dans lequel vous vous trouvez
  • %d: chemin complet
  • %~: chemin complet mais le home est contracté en ~
  • %T: heure
  • %D: date au format aa-mm-jj

Vous trouverez plus de variables ici: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html

Les couleurs

Vous pouvez activer les couleurs dans le .zshrc avec la ligne use_color=true. Certains terminaux ne supportent que 16 couleurs alors que d’autres en supportent 256 . Pour tester les couleurs de votre terminal, vous pouvez utiliser ce script:

#!/bin/zsh

color=0;
while [ $color -lt 255 ]; do
    echo -e "$color: \\033[38;5;${color}mhello\\033[48;5;${color}mworld\\033[0m"
    ((color++));
done

Pour modifier les couleurs du prompt vous devez insérer un code couleur devant le texte que vous voulez modifier. Les codes couleurs sont définis ainsi, mais certains terminaux ne supportent pas toutes les options, comme le clignotement:

# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white
# Valid syntax for text 256color is 38;5;<color number> , where color number
# is number between 0 and 255.
# Valid syntax for background 256color is 48;5;<color number> , where
# color number is number between 0 and 255.

Ainsi, en ajoutant les séqueces d’échappement, pour afficher “hello world” avec hello en gras et en rouge et world en bleu sur fond vert il faudra taper:

PS1=$'%{\033[01;31m%}hello%{\033[00;34;42m%}world'

Si vous faites cela, vous remarquerez que le formatage du texte persiste après le prompt. Il faut le remttre à zéro en ajoutant %{\033[00m%} à la fin de la variable.

Voici un exemple de prompt:

PS1=$'%{\033[01;38;5;240m%}[%{\033[01;33m%}%n%{\033[01;38;5;240m%}@%{\033[01;32m%}%m %{\033[01;38;5;240m%}> %{\033[01;37m%}%c%{\033[01;38;5;240m%}] $ %{\033[00m%}'

exemple

Les codes des couleurs sont personnalisables dans le fichier .Xressources.

Git

Vous pouvez afficher dans quelle branche git vous vous trouvez si le dossier est inclus dans un dépôt. Pour cela, voici un code fait par Tarik Graba:

# Prompt qui detecte les dépôts et les environnements virtuels de python
function git_ref {
# la première partie nous donne le HEAD actuel si on y est; de la forme refs/heads/toto
# la seconde un nom si on n'est pas dans HEAD
  rf=$(git symbolic-ref -q HEAD || git name-rev --name-only --always HEAD)
  # on enlève refs/heads/ pour ne récupérer que le nom de la branche
  rf=${rf#refs/heads/}
  echo $rf
}

function prompt_char {
   git branch >&/dev/null && echo -n ' [git<'&& echo -n $(git_ref) && echo '>]' && return
}

Il vous suffit maintenant de placer $(prompt_char) dans votre variable de prompt pour que votre shell affiche automatiquement la branche git en cours.