Fish shell - adopté

08/12/2015

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.

Fish, complétion des options et doc

Et ça marche avec les page de “man”, “git”, etc… donc en tapant “git” suivit de “tabulation”:

Fish, complétion de commande

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”:

Thème Lava sur fish

En ce qui concerne le “prompt”, je passe en mode “Minimalist”:

Prompt minimalist fish

Et voici ce qu’il se passe dans un répertoire qui contient un projet Git:

Fish dans un dossier 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 :)

Ça peut vous intéresser aussi


Fish et les notifications de Gnome terminal

Sur Fedora 22, gnome-terminal vous permet d’avoir une notification ...


Reading some lines from a file in terminal

At work, I am often asked to find commands that ...


Gnome shell innove

Voilà des années qu’on a droit à un type ...


Adieu TeamViewer

J’en avais marre de TeamViewer, des soucis avec Wayland,...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Metal3d - 19/02/2016

A noter que “oh my fish” se prend plainte sur plainte et affiche désormais “Repository unavailable due to DMCA takedown.” Je vous recommande de passer à “fisher”: https://github.com/fisherman/fisherman Je vais modifier l’article en conséquence

Metal3d - 09/12/2015

@spiroid oui merci, j’ai corrigé l’article en conséquence, effectivement j’ai été surpris en voyant le souci sur ton poste que seul Fedora ait intégré ce patch. J’espère que les autres distributions (debian, arch, etc…) y viendront parce que c’est franchement une fonctionnalité intéressante.

spiroid - 08/12/2015

Testé et approuvé. Attention pour Debian, la fonction de notification ne fonctionnera pas. En effet, la séquence d’échappement ‘OSC 777’ n’est pas présente par défaut dans gnome-terminal. C’est un ajout spécifique à Fedora.

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.