Skip to content
p-genPublic

About

smenu started as a lightweight and flexible terminal menu generator, but quickly evolved into a powerful and versatile CLI selection tool for interactive or scripting use.

Topics

Resources

Stars

2.5k stars

Watchers

39 watching

Forks

Latest commit

 

History

1,071 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

smenu.gif


simple_menu.gif

What is it?

smenu is a selection filter, just as sed is an editing filter.

This tool reads words from standard input or from a file and presents them to the terminal screen in different layouts in a scrolling window. A cursor, easily moved using the keyboard and/or the mouse, makes it possible to select one or more words.

Note that the screen is not cleared at the start or end of smenu execution. The selection window is displayed at the cursor position, and the previous contents of the terminal are neither modified nor lost.

I've tried to make it as easy to use as possible. It should work on all terminals described in the terminfo database that have sufficient cursor movement capabilities.

UTF-8 encoding is supported. This support includes double-width characters and extended grapheme clusters. The latter is still experimental, however, and works much better when appropriate terminals, such as WezTerm or iTerm, are used.

The encoding of UTF-8 characters must also be in canonical form, as no effort is made to put them in this form.

smenu supports multiple selections with -T (tag mode) and -P (pin mode).

Features

Among other things, smenu supports:

  • horizontal, column, line, and tabular layouts;
  • keyboard and mouse navigation;
  • incremental search by prefix, substring or using a fuzzy search method;
  • direct-access numbering;
  • multiple selections using tag and pin modes;
  • customizable colors and display attributes;
  • UTF-8 text, including double-width characters and extended grapheme clusters.

The "multiple selection" mode supported by smenu allows you to select individual words, columns, or rows/lines (entire or partial), as well as sequences of consecutive words and rectangular blocks of words.

All these selection methods can be combined. Some are only available when using the 'column' layout, such as selecting rectangular blocks of text.

Selections can be removed from individual words, undone by selection action in reverse order, or cleared completely.

These actions can be performed using the keyboard or the mouse.

Please refer to the included man page to find out more about this little program.

Building

Some Linux distributions already provide smenu as a package. If not, smenu can be built on any system on which a functional terminfo development platform is available. This includes all Unix and Unix-like systems that I know of.

Please use the provided build.sh script to build the executable. This script uses and accepts the same arguments as the GNU configure script. Type build.sh --help to see them.

Installation

Once the build process is complete, a simple make install with the appropriate privileges will do it.

Issues and discussions

I have enabled discussions on this repository.

I am aware there may be some confusion when deciding where you should communicate when reporting issues, asking questions or raising feature requests so this section aims to help us align on that.

Please raise an issue if:

  • You have found a bug.
  • You have a feature request and can clearly describe your request.

Please open a discussion if:

  • You have a question.
  • You're not sure how to achieve something with smenu.
  • You have an idea but don't quite know how you would like it to work.
  • You have achieved something cool with smenu and want to show it off.
  • Anything else!

Examples

Linux example

This program should work on most Unix but if you are using Linux, try to type the following line at a shell prompt (here: "$ " ):

$ R=$(grep Vm /proc/$$/status \
      | smenu -n20 -W $':\t\n' -q -c -b -g -s /VmH)
$ echo $R

Something like this should now be displayed with the program waiting for commands: (numbers are mine, yours will be different)

VmPeak¦    23840 kB
VmSize¦    23836 kB
VmLck ¦        0 kB
VmHWM ¦     2936 kB
VmRSS ¦     2936 kB
VmData¦     1316 kB
VmStk ¦      136 kB
VmExe ¦       28 kB
VmLib ¦     3956 kB
VmPTE ¦       64 kB
VmSwap¦        0 kB

A cursor should be under "VmHWM ".

After moving the cursor to " 136 kB" and terminating the program with <Enter>, the shell variable R should contain: " 136 kB".

Unix example

The following command, which is Unix-platform-agnostic, should give you a scrolling window if you have more than 10 accounts on your Unix system with a UID lower than 100:

$ R=$(awk -F: '$3 < 100 {print $1,$3,$4,$NF}' /etc/passwd \
      | smenu -n10 -c)
$ echo $R

On mine (LANG and LC_ALL set to POSIX) it displays:

at      25 25  /bin/bash      \
sys     0  3   /usr/bin/ksh   +
bin     1  1   /bin/bash      |
daemon  2  2   /bin/bash      |
ftp     40 49  /bin/bash      |
games   12 100 /bin/bash      |
lp      4  7   /bin/bash      |
mail    8  12  /bin/false     |
named   44 44  /bin/false     |
ntp     74 108 /bin/false     v

Note the presence of a scroll bar.

Bash example (CTRL-R replacement)

Add the following to your .bashrc:

EOL=$'\n'
bind -x '"\C-r": READLINE_LINE=$(fc -lr 1                         \
                                 | sed "s/[1-9][0-9]*..//"        \
                                 | smenu -Q -l -a c:7/4,b -W"$EOL")
                 READLINE_POINT=${#READLINE_LINE}'

Launch or relaunch bash and press CTRL-R (CTRL-C or q to exit), enjoy!

You can also add the parameter -d to instruct smenu to clean the selection window after selecting an entry.

Warning for post v0.9.15 versions.

These versions use a new options system called ctxopt which may contain bugs. Please report them so they can be fixed in the next release of smenu or ctxopt (https://github.com/p-gen/ctxopt).

Command-line arguments may also need to be rearranged in some cases because of this new option management system. Sorry for the extra work this might entail.

Known issues

Right-alignment of lines written in right-to-left languages, such as Farsi or Hebrew, is not respected.

Testing and reporting

The included testing system is relatively young, please bear with it.

IMPORTANT: The testing system has some dependencies, please read the test/README.rst before going further.

NOTE: Running all the tests using ./tests.sh in the tests directory will take some time (currently around 21 minutes).

NOTE: On some systems, such as *BSD some tests may fail. This can be explained by differences in POSIX/libc implementations. This can notably occur when some specific regular expressions or uncommon UTF-8 byte sequences are used.

If a test fails for an unknown reason, please send me the name of its directory and the corresponding .bad file.

If you are hit by a bug that no test covers, then you can create a new test in the tests directory in an existing or new directory: read the tests/README.rst file, use an existing test as a model, create an .in file and a .tst file and send them to me as well as the produced files.

Contributing

Contributions are welcome, but discuss your proposal in an issue first, or with the maintainer.

Acknowledgments

I want to thank those who took the time to package smenu for their preferred operating system or distribution. You will find their names here: https://repology.org/project/smenu/information

About

smenu started as a lightweight and flexible terminal menu generator, but quickly evolved into a powerful and versatile CLI selection tool for interactive or scripting use.

Topics

Resources

Stars

2.5k stars

Watchers

39 watching

Forks

Releases

Packages

Used by

Contributors

Languages