This package has been
merged
into the Julia standard
library.
As such, you probably just want to using REPL.TerminalMenus
and skip the
Installation instructions below.
TerminalMenus.jl enables small, low-profile interactive menus in the terminal.
TerminalMenus requires Julia 0.6. Use Pkg
to install:
Pkg.add("TerminalMenus")
using TerminalMenus
options = ["apple", "orange", "grape", "strawberry",
"blueberry", "peach", "lemon", "lime"]
The RadioMenu allows the user to select one option from the list. The request
function displays the interactive menu and returns the index of the selected
choice. If a user presses 'q' or ctrl-c
, request
will return a -1
.
# `pagesize` is the number of items to be displayed at a time.
# The UI will scroll if the number of options is greater
# than the `pagesize`
menu = RadioMenu(options, pagesize=4)
# `request` displays the menu and returns the index after the
# user has selected a choice
choice = request("Choose your favorite fruit:", menu)
if choice != -1
println("Your favorite fruit is ", options[choice], "!")
else
println("Menu canceled.")
end
Output:
Choose your favorite fruit:
^ grape
strawberry
> blueberry
v peach
Your favorite fruit is blueberry!
The MultiSelectMenu allows users to select many choices from a list.
# here we use the default `pagesize` 10
menu = MultiSelectMenu(options)
# `request` returns a `Set` of selected indices
# if the menu us canceled (ctrl-c or q), return an empty set
choices = request("Select the fruits you like:", menu)
if length(choices) > 0
println("You like the following fruits:")
for i in choices
println(" - ", options[i])
end
else
println("Menu canceled.")
end
Output:
Select the fruits you like:
[press: d=done, a=all, n=none]
[ ] apple
> [X] orange
[X] grape
[ ] strawberry
[ ] blueberry
[X] peach
[ ] lemon
[ ] lime
You like the following fruits:
- orange
- grape
- peach
All interface customization is done through the keyword only
TerminalMenus.config()
function.
charset::Symbol=:na
: ui characters to use (:ascii
or:unicode
); overridden by other argumentscursor::Char='>'|'→'
: character to use for cursorup_arrow::Char='^'|'↑'
: character to use for up arrowdown_arrow::Char='v'|'↓'
: character to use for down arrowchecked::String="[X]"|"✓"
: string to use for checkedunchecked::String="[ ]"|"⬚")
: string to use for uncheckedscroll::Symbol=:na
: If:wrap
then wrap the cursor around top and bottom, if :nowrap
do not wrap cursorsupress_output::Bool=false
: For testing. If true, menu will not be printed to console.ctrl_c_interrupt::Bool=true
: Iffalse
, return empty on ^C, iftrue
throw InterruptException() on ^C
julia> menu = MultiSelectMenu(options, pagesize=5);
julia> request(menu) # ASCII is used by default
[press: d=done, a=all, n=none]
[ ] apple
[X] orange
[ ] grape
> [X] strawberry
v [ ] blueberry
Set([4, 2])
julia> TerminalMenus.config(charset=:unicode)
julia> request(menu)
[press: d=done, a=all, n=none]
⬚ apple
✓ orange
⬚ grape
→ ✓ strawberry
↓ ⬚ blueberry
Set([4, 2])
julia> TerminalMenus.config(checked="YEP!", unchecked="NOPE", cursor='⧐')
julia> request(menu)
[press: d=done, a=all, n=none]
NOPE apple
YEP! orange
NOPE grape
⧐ YEP! strawberry
↓ NOPE blueberry
Set([4, 2])
- Nested menus
- More customization?
The interactive menu has been tested on Ubuntu 16.04 and windows 7, 8, & 10. If there are any issues on your platform, please submit an issue or a pull request.