Gum - Un outil pour écrire des scripts en un clin d'oeil
Voici un outil fantastique nommé Gum qui va vous permettre d’écrire des scripts Shell et de gérer vos dotfiles en quelques lignes de code seulement, et après l’avoir testé, je suis sûr que vous ne pourrez plus vous en passer.
Voici un exemple de ce qu’il est possible de faire avec Gum :
Et voici le code associé :
#!/bin/bash
gum style --border normal --margin "1" --padding "1 2" --border-foreground 212 "Hello, there! Welcome to $(gum style --foreground 212 'Gum')."
NAME=$(gum input --placeholder "What is your name?")
echo -e "Well, it is nice to meet you, $(gum style --foreground 212 "$NAME")."
sleep 2; clear
echo -e "Can you tell me a $(gum style --italic --foreground 99 'secret')?\n"
gum write --placeholder "I'll keep it to myself, I promise!" > /dev/null # we keep the secret to ourselves
clear; echo "What should I do with this information?"; sleep 1
READ="Read"; THINK="Think"; DISCARD="Discard"
ACTIONS=$(gum choose --cursor-prefix "[ ] " --selected-prefix "[✓] " --no-limit "$READ" "$THINK" "$DISCARD")
clear; echo "One moment, please."
grep -q "$READ" <<< "$ACTIONS" && gum spin -s line --title "Reading the secret..." -- sleep 1
grep -q "$THINK" <<< "$ACTIONS" && gum spin -s pulse --title "Thinking about your secret..." -- sleep 1
grep -q "$DISCARD" <<< "$ACTIONS" && gum spin -s monkey --title " Discarding your secret..." -- sleep 2
sleep 1; clear
echo "What's your favorite $(gum style --foreground 212 "Gum") flavor?"
GUM=$(echo -e "Cherry\nGrape\nLime\nOrange" | gum filter)
echo "I'll keep that in mind!"
sleep 1; clear
echo "Do you like $(gum style --foreground "#04B575" "Bubble Gum?")"
sleep 1
CHOICE=$(gum choose --item.foreground 250 "Yes" "No" "It's complicated")
[[ "$CHOICE" == "Yes" ]] && echo "I thought so, $(gum style --bold "Bubble Gum") is the best." || echo "I'm sorry to hear that."
sleep 1
gum spin --title "Chewing some $(gum style --foreground "#04B575" "$GUM") bubble gum..." -- sleep 5
clear
NICE_MEETING_YOU=$(gum style --height 5 --width 25 --padding '1 3' --border double --border-foreground 57 "Well, it was nice meeting you, $(gum style --foreground 212 "$NAME"). Hope to see you soon!")
CHEW_BUBBLE_GUM=$(gum style --width 25 --padding '1 3' --border double --border-foreground 212 "Don't forget to chew some $(gum style --foreground "#04B575" "$GUM") bubble gum.")
gum join --horizontal "$NICE_MEETING_YOU" "$CHEW_BUBBLE_GUM"
Pour l’installer, vous pouvez le faire soit avec un gestionnaire de paquets ou en le téléchargeant directement. Des packages sont d’ailleurs disponibles pour Debian, RPM et Alpine, ainsi que des binaires pour Linux, macOS (brew install gum), Windows (scoop install charm-gum), FreeBSD, OpenBSD et NetBSD.
Et si vous préférez, vous pouvez même l’installer à l’aide de Go. Personnellement, j’adore le côté flexible de Gum : il peut être intégré dans des scripts et adapté à votre convenance grâce aux options de configuration et aux variables d’environnement, ce qui vous permet par exemple de personnaliser la couleur du curseur ou la largeur de l’affichage.
La documentation est très complète à ce sujet.
Ainsi, la commande “gum input
” permet de demander une entrée à l’utilisateur, tandis que “gum write
” fonctionne pour une entrée multi-ligne.
Envie de filtrer une liste de valeurs en utilisant la correspondance floue ? Gum est là pour ça avec “gum filter
”. Et si vous avez besoin d’aide pour choisir une option à partir d’une liste de choix, “gum choose
” sera votre meilleur allié.
Même la commande “gum confirm
” rend la vie plus simple en demandant si une action doit être effectuée ou non. J’apprécie également énormément l’option “gum file
”, qui me permet de sélectionner un fichier directement depuis l’arborescence des fichiers, et la commande “gum spin
” ne manque pas de me rappeler que Gum travaille fort fort fort pour moi en affichant un spinner (vous savez, le petit cercle qui tourne pour vous faire patienter) pendant qu’une commande ou un script s’exécute.
Voici un autre exemple de code :
#!/bin/sh
TYPE=$(gum choose "fix" "feat" "docs" "style" "refactor" "test" "chore" "revert")
SCOPE=$(gum input --placeholder "scope")
# Since the scope is optional, wrap it in parentheses if it has a value.
test -n "$SCOPE" && SCOPE="($SCOPE)"
# Pre-populate the input with the type(scope): so that the user may change it
SUMMARY=$(gum input --value "$TYPE$SCOPE: " --placeholder "Summary of this change")
DESCRIPTION=$(gum write --placeholder "Details of this change (CTRL+D to finish)")
# Commit these changes
gum confirm "Commit changes?" && git commit -m "$SUMMARY" -m "$DESCRIPTION"
Et le rendu dans le terminal :
Outre ces commandes de base, Gum propose également une panoplie d’options pour s’adapter à vos besoins spécifiques. Les différents types de spinner incluent ligne, point, minidot, saut, impulsion, points, globe, lune, un singe (!), mètre et même un hamburger. La commande de tableau est très pratique pour sélectionner des données tabulaires, tandis que le style et la mise en page sont personnalisables à loisir pour combiner texte de manière verticale ou horizontale, ou encore pour traiter et formater les paragraphes. Pour plus d’informations sur les modèles, pensez encore une fois à consulter la documentation.
Mais ce qui fait vraiment la force de Gum, c’est sa capacité à être intégré à diverses tâches du quotidien. Qui n’a jamais souhaité écrire un message de commit en un instant, ouvrir des fichiers dans son éditeur de texte préféré, se connecter à une session TMUX, sélectionner un hash de commit dans son historique Git, choisir des mots de passe avec Skate, ou encore supprimer des branches en deux temps trois mouvements ?
Un tour d’horizon des exemples du répertoire Gum vous convaincra d’autant plus de l’intérêt de cet outil.