github charmbracelet/gum v0.15.0

one day ago

No longer a sticky situation

This release contains a small boatload of fixes and quality-of-life features across the board by the great @caarlos0 and some awesome contributors.

Most importantly we detangled Gum and Huh. The two libraries were too tightly coupled creating a difficult environment to maintain. With this separation, Gum much easier to maintain, especially for contributors. Chew on that!

General Stuff

No more weird ANSI: gum now strips ANSI sequences by default. Want ‘em back? just add --no-strip-ansi.

We fixed some bugs with existing timeouts + they can now be used in confirm, choose, file, filter, input, pager, and spin. You can specify the units, i.e. --timeout=750ms, --timeout=1m30s

Choose

Sometimes you want the user-facing choice to be different than the outputted value. Now you can do that with --label-delimiter:

$ printf 'Pocky:0\nRamen:1\nShrimp Chips:2\n' | gum choose --label-delimiter=':'

Want to select all options by default? Use --select='*'.

$ printf 'Pocky\nRamen\nShrimp Chips\n' | gum choose  --select='*'

Confirm

No you can print the chosen value with --show-output:

$ gum confirm --show-output 'Do you agree?'
Do you agree? No
exit status 1

File

You can now add a header to your filepickers with the --header set of flags.

gum file --header="Whatcha gonna pick?"

file

For details see gum file --help.

Filter

Better delimiters, select all, and so on

Press ctrl+a to select all choices, esc to unfocus the filter field.

Want some defaults? Use --selected to preselect choices. You can also use --input-delimiter and --output-delimiter for more flexibility around input and output.

$ echo "JS|Android|iOS" | gum filter --selected='*' --input-delimiter="|" --no-limit --output-delimiter=","

Freeform input

Filter's --no-strict allows you to create a new option if no matches are found; it's essentially a free input field. Go crazy!

Sort: we fixed it

Filter's --sort would sort by score which was causing some confusion for users. To clarify this behaviour, --sort is deprecated in favour of --[no]-fuzzy-sort.

Want to sort alphabetically? Leverage the sort command in a pipeline:

$ cat input.txt | sort | gum filter --no-sort

Log

Now you can set a minimum log level with GUM_LOG_LEVEL. Valid values are debug, info, warn, error, and fatal.

Spin

You can now use --show-stdout and --show-stderr to print output:

$ gum spin --show-stdout --title "Running command..." -- sleep 10 && echo hello

Table

We expanded the table API to allow users to control more fields in csv.Reader through gum. This includes --lazy-quotes and --fields-per-record. This should fix issues with gum struggling to read CSV files properly. For details see gum table --help.

We also made a bunch of rendering improvements such as growing the table rows based on --columns, settings sane defaults widths, ignoring BOMs (byte order marks), and so on.

Changelog

New!

  • feat(choose): --selected="*" to select all by @caarlos0 in #769
  • feat(choose,filter): --input-delimiter --output-delimiter by @caarlos0 in #779
  • feat(confirm): add --show-output by @vahnrr in #427
  • feat(file): add --header by @caarlos0 in #768
  • feat(file): show permissions and size by @caarlos0 in #717
  • feat(filter): --select-if-one returns if single match by @caarlos0 in #778
  • feat(filter): allow to focus out of filter by @caarlos0 in #776
  • feat(filter): allow to pre-select items with --selected by @caarlos0 in #777
  • feat(filter): ctrl+a to toggle select all by @caarlos0 in #770
  • feat(log): support setting minimum log level with GUM_LOG_LEVEL by @caarlos0 in #723
  • feat(spin): --show-stdout --show-stderr by @caarlos0 in #774
  • feat(style): trim line spaces by @caarlos0 in #767
  • feat(table): --lazy-quotes and --fields-per-record by @caarlos0 in #759
  • feat(table): add help by @caarlos0 in #756
  • feat(table): set --print if stdout is not a terminal by @caarlos0 in #762
  • feat(version): adds command to check current gum version by @caarlos0 in #775
  • feat: adding return column to table command by @deicon in #415
  • feat: allow cursor option in file by @radar07 in #667
  • feat: esc exit 1, ctrl+c exit 130, help arrow order by @caarlos0 in #771
  • feat: handle focus/blur events by @caarlos0 in #749
  • feat: improve handling ctrl+c and timeouts by @caarlos0 in #747

Fixed

Other Stuff

New Contributors

Full Changelog: v0.14.5...v0.15.0


Verifying the artifacts

First, download the checksums.txt file, for example, with wget:

wget 'https://github.com/charmbracelet/gum/releases/download/v0.15.0/checksums.txt'

Then, verify it using cosign:

cosign verify-blob \
  --certificate-identity 'https://github.com/charmbracelet/meta/.github/workflows/goreleaser.yml@refs/heads/main' \
  --certificate-oidc-issuer 'https://token.actions.githubusercontent.com' \
  --cert 'https://github.com/charmbracelet/gum/releases/download/v0.15.0/checksums.txt.pem' \
  --signature 'https://github.com/charmbracelet/gum/releases/download/v0.15.0/checksums.txt.sig' \
  ./checksums.txt

If the output is Verified OK, you can safely use it to verify the checksums of other artifacts you downloaded from the release using sha256sum:

sha256sum --ignore-missing -c checksums.txt

Done! You artifacts are now verified!

The Charm logo

Thoughts? Questions? We love hearing from you. Feel free to reach out on Twitter, The Fediverse, or on Discord.

Don't miss a new gum release

NewReleases is sending notifications on new releases.