gum/README.md
Maas Lalani 46ddc28ae5
feat: gum choose, pick from a list of choices
gum choose allows the user to be prompted for a choice from a list of choices.

For example, let's ask the user to pick a card from a deck.
gum choose --height 15 {Ace,King,Queen,Jack,Ten,Nine,Eight,Seven,Six,Five,Four,Three,Two}" of "{Spades,Hearts,Clubs,Diamonds}
2022-07-11 16:26:23 -04:00

7.6 KiB
Raw Blame History

Gum

Latest Release GoDoc Build Status

Gum is a collection of command-line utilities that make your shell scripts a little more glamorous. It gives you the power of Bubbles and Lip Gloss without needing to write any Go code.

# Prompt users for input
NAME=$(gum input --placeholder "What is your name?")

# Style some text
gum style --foreground 212 --padding "1 4" \
	--border double --border-foreground 57 \
	"Nice to meet you, $NAME."

# Do some work while spinning
gum spin --title "Taking a nap..." --color 212 -- sleep 5

# Fuzzy find a file or directory
find . -type f | gum filter

The following example is running from a single bash script.

Shell running the Gum examples/demo.sh script

Installation

Use a package manager:

# macOS or Linux
brew tap charmbracelet/tap && brew install charmbracelet/tap/gum

# Arch Linux (btw)
pacman -S gum

# Nix
nix-env -iA nixpkgs.gum

# Debian/Ubuntu
echo 'deb [trusted=yes] https://repo.charm.sh/apt/ /' \
    | sudo tee /etc/apt/sources.list.d/charm.list
sudo apt update && sudo apt install gum

# Fedora
echo '[charm]
name=Charm
baseurl=https://repo.charm.sh/yum/
enabled=1
gpgcheck=0' | sudo tee /etc/yum.repos.d/charm.repo
sudo yum install gum

Or download it:

  • Packages are available in Debian and RPM formats
  • Binaries are available for Linux, macOS, and Windows

Or just install it with go:

go install github.com/charmbracelet/gum@latest

Interaction

Input

Prompt your users for input with a simple command.

gum input > answer.text

Write

Prompt your users to write some multi-line text.

gum write > story.text

Filter

Allow your users to filter through a list of options by fuzzy searching.

echo Strawberry >> flavors.text
echo Banana >> flavors.text
echo Cherry >> flavors.text
cat flavors.text | gum filter > selection.text

Choose

Ask your users to choose an option from a list of choices.

echo "Pick a card, any card..."
CARD=$(gum choose --height 15 {{A,K,Q,J},{10..2}}" "{♠,♥,♣,♦})
echo "Was your card the $CARD?"

Progress

Display a progress bar while loading. The following command will display a progress bar and increment the progress by 10% every 1 second. Thus, taking 10 seconds to complete the progress bar.

gum progress --increment 0.1 --interval 1s

Spinners

Display a spinner while taking some running action. We specify the command to run while showing the spinner, the spinner will automatically stop after the command exits.

gum spin --spinner dot --title "Buying Bubble Gum..." -- sleep 5

Styling and Layout

Style

Pretty print any string with any layout with one command.

gum style \
	--foreground "#FF06B7" --border "double" --align "center" \
	--width 50 --margin "1 2" --padding "2 4" \
	"Bubble Gum (1¢)" "So sweet and so fresh\!"
                                                        
  ╔══════════════════════════════════════════════════╗  
  ║                                                  ║  
  ║                                                  ║  
  ║                 Bubble Gum (1¢)                  ║  
  ║              So sweet and so fresh!              ║  
  ║                                                  ║  
  ║                                                  ║  
  ╚══════════════════════════════════════════════════╝  

Join

Combine text vertically or horizontally with a single command, use this command with gum style to build layouts and pretty output.

Note: It's important to wrap the output of gum style in quotes to ensure new lines (\n) are part of a single argument passed to the join command.

I=$(gum style --padding "1 5" --border double "I")
LOVE=$(gum style --padding "1 4" --border double "LOVE")
BUBBLE=$(gum style --padding "1 8" --border double "Bubble")
GUM=$(gum style --padding "1 5" --border double "Gum")

I_LOVE=$(gum join "$I" "$LOVE")
BUBBLE_GUM=$(gum join "$BUBBLE" "$GUM")
gum join --align center --vertical "$I_LOVE" "$BUBBLE_GUM"
      ╔═══════════╗╔════════════╗      
      ║           ║║            ║      
      ║     I     ║║    LOVE    ║      
      ║           ║║            ║      
      ╚═══════════╝╚════════════╝      
╔══════════════════════╗╔═════════════╗
║                      ║║             ║
║        Bubble        ║║     Gum     ║
║                      ║║             ║
╚══════════════════════╝╚═════════════╝

Examples

See the examples directory for more real world use cases.

How to use gum in your daily workflows:

Open files in your $EDITOR

By default gum filter will display a list of all files (searched recursively) through your current directory, it has some sensible ignored defaults (.git, node_modules). You can use this to pick a file and open it in your $EDITOR.

$EDITOR $(gum filter)

Write a commit message

Prompt for user input to write git commit messages with a short summary and longer details with gum input and gum write.

Bonus points if you use gum filter with the Conventional Commits Specification as a prefix for your commit message.

git commit -m "$(gum input --width 50 --placeholder "Summary of changes")" \
           -m "$(gum write --width 80 --placeholder "Details of changes")"

Connect to a TMUX session

Pick from a running TMUX session and attach to it if not inside TMUX or switch your client to the session if already attached to a session.

SESSION=$(tmux list-sessions -F \#S | gum filter --placeholder "Pick session...")
tmux switch-client -t $SESSION || tmux attach -t $SESSION

Pick commit hash from history

Filter through your git history searching for commit messages and copy the commit hash of the selected commit.

git log --oneline | gum filter | cut -d' ' -f1 # | copy

Feedback

Wed love to hear your thoughts on this project. Feel free to drop us a note!

License

MIT

Part of Charm.

The Charm logo

Charm热爱开源 • Charm loves open source