Skip to content
/ smenu Public

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.

License

Notifications You must be signed in to change notification settings

p-gen/smenu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Repository files navigation

smenu.gif


simple_menu.gif

What is it?

smenuis a selection filter just likesedis 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 thekeyboardand/or themouse, makes it possible to select one or more words.

Note that the screen is not cleared at the start and end ofsmenu 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 managed in theterminfodatabase.

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

The encoding ofUTF-8glyphs must also be in canonical form, as no effort will be made to put them in this form.

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

Thewikicontains screenshots and animations that detail some concepts and features ofsmenu.

How to build it?

Some Linux distributions already providesmenuas a package, if not,smenucan be built on any system on which a functional terminfodevelopment platform is available. This includes all Unix and Unix-like systems that I know of.

Please use the providedbuild.shscript to build the executable. This script uses and accepts the same arguments as the GNUconfigure script, typebuild.sh --helpto see them.

How to install it?

Once the build process is complete, a simplemake installwith the appropriate privileges will do it.

Issue vs Discussion.

I have enableddiscussions 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.

Pleaseraise an issueif:

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

Pleaseopen a discussionif:

  • 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!

Some 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 having moved the cursor to"136 kB"and ended the program with<Enter>,the shell variable R should contain:"136 kB".

Unix example.

The following command, which is Unix brand agnostic, should give you a scrolling window if you have more than 10 accounts on your Unix 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 (LANGandLC_ALLset toPOSIX) 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)

Just add the following in 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 relaunchbashand hitCTRL-R(CTRL-Corq to exit), enjoy!

You can also add the parameter-dto instructsmenuto clean the selection window after selecting an entry.

Warning for post v0.9.15 versions.

These versions use a new options system calledctxoptwhich may contain bugs. Please report them so they can be fixed in the next release ofsmenu orctxopt(https://github /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.

Bugs.

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 be indulgent.

IMPORTANTthe testing system has some dependencies, please read the test/README.rstbefore going further.

NOTErunning all the tests by running./tests.shin the testsdirectory will take some time (around 21 min for now).

NOTEon some systems like *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 uncommonUTF-8 byte sequences are used.

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

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

Contributions.

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

Special thanks.

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