J’ai récemment cherché à directement pouvoir exécuter les commandes présentes dans le fichier README.md de mes projets. Cette manière de fonctionner présente en effet un double avantage :

  • Le fait d’éviter la redondance de données
  • La mise à jour constante des dernières commandes

J’ai également cherché à pouvoir directement sélectionner et exécuter les commandes extraites grâce à l’excellent plug-in fzf. Le but était de faire au plus simple, en utilisant si possible les outils fournis par GNU core utilities. Voici donc la solution à laquelle je suis arrivé :

findProjectsCommands()
{
    LINES=$(sed '/^```$/,/^```$/{//!b};d' README.md 2>&1); 
 
    # [SAFEGUARD] : Si fichier README.md non trouvé
    if [ $? -eq 2 ]; then echo "README.md not found"; return; fi
    # [SAFEGUARD] : Si autre erreur
    if [ $? -ne 0 ]; then echo "$LINES"; return; fi
 
    COMMAND=$(echo "$LINES" | fzf -i);
 
    # [SAFEGUARD] : Si aucune commande sélectionnée
    if [ $? -ne 0 ]; then return; fi
 
    # On strip les "tailing spaces"
    COMMAND=$(echo -e "${COMMAND}" | sed -e 's/^[[:space:]]*//')
    echo -n $COMMAND | xclip -selection c -i ; 
    history -s "$COMMAND"; 
    echo "$COMMAND"; 
    eval $COMMAND
    # On peut injecter la commande dans READLINE (Sur la ligne de commande) avec READLINE_LINE="$COMMAND"
}
findLocalCommands=findProjectsCommands;

A noter que la dernière ligne permet simplement d’assigner la fonction à un alias.

Il suffit donc de mettre ce bloc de code dans un fichier lu au lancement du terminal (du type .bashrc) pour en profiter.