Fish shell - adopté
Je pense que beaucoup connaissent déjà le “SHELL” nommé Fish. Je l’ai adopté depuis un certain temps et je vais vous donner mes impressions ainsi que ma configuration.
En premier lieu:
Attention, ne confondez pas un terminal et un shell. Le terminal affiche le shell.
Fish est un “SHELL”, à l’instar de bash, sh, ou encore zsh. Ce shell a un certain avantage: il est moderne. Vous allez me dire qu’il y a une antiphrase en parlant de “shell” et de “modernité” mais trolleurs et mauvaises langues n’ont plus beaucoup d’impacts sur moi. Travailler sur un terminal est efficace, fiable, rapide et clair, on est dans la modernité. Sauf que, malgré tout l’amour que j’ai pour bash ou zsh, l’interfacage et l’interaction n’était pas ce que l’on peut appeler un modèle du genre. Ce n’est pas une critique acerbe, mais je trouve que depuis tant d’années ces shells n’ont pas franchement bougé en terme d’expérience utilisateur.
Fish est un shell un peu à part, il propose une interaction poussée et un visuel attrayant.
Il existe depuis plus de 10 ans mais, je ne sais pas pourquoi, il est de plus en plus répandu ces derniers temps. Beaucoup de projets proposent des bindings fish, par exemple Docker qui fourni depuis longtemps les fonctionnalités d’auto-completion pour fish.
Il est donc, à coup sûr, dans les dépots de votre distribution. Donc, un coup de “dnf install fish
” ou “apt-get install fish
” doit théoriquement fonctionner. Reste maintenant à le paramétrer.
Fish par défaut
Puisqu’on est pas des froussards, on va passer utiliser Fish à la place de Bash pour notre utilisateur. C’est simple comme chou:
sudo chsh -s /usr/bin/fish $USER
Vous pouvez maintenant relancer une session utilisateur:
su - $USER
Et hop, vous voilà sur fish !
En général, il faudra redémarrer Gnome pour que cette modification soit complètement prise en compte.
Si vraiment Fish ne vous plait plus:
sudo chsh -s /bin/bash $USER
Allez on passe au paramétrage.
Première impression
Je vous conseille vivement de taper “help” dans le terminal. Cette commande va ouvrir un navigateur avec la documentation. Cette documentation est primoriale pour ne pas pêter un câble. Vous y trouverez la liste des commandes spécifiques, des informations importantes, et tout ce dont vous aurez besoin pour faire passer vos anciennes commandes bash en fish.
D’abord le prompt est pas mal, il est simple, ça me va bien. En tapant des commandes je remarque que le shell auto-complète en fonction de mon historique.
Autre chose interessante, la manière dont Fish complète les options, il suffit de taper “–” puis ma touche “tabulation” et on peut naviguer dans les options. De plus, il donne de la documentation.
Et ça marche avec les page de “man”, “git”, etc… donc en tapant “git” suivit de “tabulation”:
En bref, je sentais bien, quand j’ai commencé à tester ce shell, que ça allait me plaire.
Oh My Fish
Tout comme zsh, il existe un outil “oh my …” qui va mettre un coup de boost à votre shell pour lui fournir des options sympathiques tels que des thèmes. On commence donc par cela.
curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/bin/install | fish
omf update
omf install
Si tout se passe bien, vous avez maintenant la commande “omf” et vous allez pouvoir changer de thème, installer des plugins, etc…
Pour ma part, j’utilise le thème “cmorrell” qui m’affiche l’état de mes projets git sur la droite, ainsi que le nombre de fichiers modifiés dans le projet. Bien entendu, si je ne suis pas dans un dossier de projet, rien ne s’affiche. Donc voilà comment faire:
# on regarde la liste des thèmes existants
omf theme
# installons cmorrell
omf install cmorrell
# on utilise le thème
omf theme cmorrell
C’est tout !
Configurons
Maintenant, on va configurer un peu le prompt (couleur, texte…) et c’est là que j’adore fish. Dans le terminal, tapez :
fish_config
Un navigateur va apparaitre, et vous allez pouvoir changer le thème de couleur, le type de prompt, etc.
J’utilise pour ma part le thème de couleurs “Lava”:
En ce qui concerne le “prompt”, je passe en mode “Minimalist”:
Et voici ce qu’il se passe dans un répertoire qui contient un projet Git:
Encore un peu de “tweak”
Il nous reste quelques modifications pour aller un peu plus loin. Dans le fichier “~/.config/fish/fish.config
” vous allez pouvoir modifier vos chemins par défaut, créer des fonctions, des alias, etc…
Voici ce que je mets:
# Path to Oh My Fish install.
set -gx OMF_PATH /home/patachou/.local/share/omf
# Customize Oh My Fish configuration path.
#set -gx OMF_CONFIG /home/patachou/.config/omf
# Load oh-my-fish configuration.
source $OMF_PATH/init.fish
set -x GOROOT ~/go
set -x GOPATH ~/goprojects
set -x PATH $GOROOT/bin $GOPATH/bin/ ~/.local/bin/ $PATH
set -x EDITOR vim
# function to have gnome notification
# FEDORA ONLY !
if test "$VTE_VERSION" -ge 3405
switch "$TERM"
case 'vte*' 'xterm*'
function __notify_vte_command_completed --on-event fish_postexec --description 'Notify VTE of command completion'
printf '\e]777;notify;Command completed;%s\a' (echo "$argv" | cat --show-nonprinting | tr --delete \;)
end
end
end
[EDIT]: la fonction de notification ne fonctionne que sur Fedora 22 minimum. Désolé.
Comme vous l’avez remarqué, fish n’utilise pas la syntaxe Bash, par exemple pour exporter une variable, il faut utiliser “set -x” et non “export”.
La fonction que je place en fin de fichier est expliquée dans mon billet Fish et les notications Gnome et ne fonctionne que sur Fedora >= 22.
À vous d’adapter tout ça pour votre propre configuration.
Les soucis
Utiliser fish par défaut va vous entrainer quelques soucis mais il n’y a rien d’insurmontable.
Mon CTRL+R !!!
Ha zut, plus de recherche dans le terminal… Effectivement en Bash on pouvait utiliser “CTRL+R” pour rechercher des commandes dans l’historique. Fish ne fourni pas ce genre d’option, mais c’est normal !!! puisque l’autocompletion est native.
Or, moi j’aime bien taper le terme à chercher et utiliser CTRL+R. Donc on va utiliser un super outil codé en Go, nommé FZF.
On l’installe:
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install
Et voilà, terminé ! Relancez une session fish avant de tester, sinon ça ne marchera pas.
On tente ? Je tape un début de commande et CTRL+R:
Je trouve même que cet outil est meilleur que le CTRL+R de bash…
Syntaxe modifiée
Pas mal de choses changent en Fish:
-
Ne pas utiliser “&&” mais “; and”. C’est un peu énervant, je sais, je suis d’accord, mais on s’y fait vite et c’est finalement assez lisible.
grep "foo" /bar; and echo "Cool"
-
Les redirections sur STDERR peuvent être remplacées par un accent circonflexe “^”. Par conséquent:
commande >/tmp/out 2>/tmp/err # équivalent commande >/tmp/out ^/tmp/err commande 2>>/tmp/err # équivalent commande ^^/tmp/err
-
On peut enfin revenenir à la ligne en tapant une boucle, et en plus le shell indente tout seul. Autre chose intéressante, les flèches permettent de se déplacer dans la boucle
Et j’en passe…
Vim
Si vous utilisez certains plugins vim, tels que Vundle, les auteurs n’ont pas pensé à “forcer” un shell par défaut. Pour corriger le souci, ouvrez votre “vimrc” et ajouter, au plus haut possible:
set shell=sh
VirtualEnv
Suivez simplement les indications du projet VirtualFish et utilisez la commande “vf” pour créer, activer et désactiver les environnements virtuels python.
Bilan
Que ce soit en termes visuels ou en termes d’options et y compris l’affichage, les raccourcis claviers etc… Fish m’a franchement convaincu. Certes il faut un temps d’adaptation, mais l’aide est très bien fichue, l’auteur répond rapidement sur GitHub et la communauté s’active.
Difficile pour moi de revenir sur Bash pour mon travail quotidien. J’ai adopté le poisson :)