TerminalMenus.jl
TerminalMenus.jl copied to clipboard
Simple interactive menus for the terminal (Now ships with Julia!)
Ships with Julia now!
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

TerminalMenus.jl enables small, low-profile interactive menus in the terminal.
Installation
TerminalMenus requires Julia 0.6. Use Pkg to install:
Pkg.add("TerminalMenus")
Examples
using TerminalMenus
options = ["apple", "orange", "grape", "strawberry",
"blueberry", "peach", "lemon", "lime"]
RadioMenu
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!
MultiSelectMenu
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
Customization / Configuation
All interface customization is done through the keyword only
TerminalMenus.config() function.
Arguments
charset::Symbol=:na: ui characters to use (:asciior: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:wrapthen wrap the cursor around top and bottom, if :nowrapdo 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, iftruethrow InterruptException() on ^C
Examples
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])
TODO
- 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.