ishell is an interactive shell library for creating interactive cli applications.
import "strings"
import "github.com/abiosoft/ishell/v2"
func main(){
// create new shell.
// by default, new shell includes 'exit', 'help' and 'clear' commands.
shell := ishell.New()
// display welcome info.
shell.Println("Sample Interactive Shell")
// register a function for "greet" command.
shell.AddCmd(&ishell.Cmd{
Name: "greet",
Help: "greet user",
Func: func(c *ishell.Context) {
c.Println("Hello", strings.Join(c.Args, " "))
},
})
// run shell
shell.Run()
}
Execution
Sample Interactive Shell
>>> help
Commands:
clear clear the screen
greet greet user
exit exit the program
help display help
>>> greet Someone Somewhere
Hello Someone Somewhere
>>> exit
$
// simulate an authentication
shell.AddCmd(&ishell.Cmd{
Name: "login",
Help: "simulate a login",
Func: func(c *ishell.Context) {
// disable the '>>>' for cleaner same line input.
c.ShowPrompt(false)
defer c.ShowPrompt(true) // yes, revert after login.
// get username
c.Print("Username: ")
username := c.ReadLine()
// get password.
c.Print("Password: ")
password := c.ReadPassword()
... // do something with username and password
c.Println("Authentication Successful.")
},
})
Execution
>>> login
Username: someusername
Password:
Authentication Successful.
Builtin support for multiple lines.
>>> This is \
... multi line
>>> Cool that << EOF
... everything here goes
... as a single argument.
... EOF
User defined
shell.AddCmd(&ishell.Cmd{
Name: "multi",
Help: "input in multiple lines",
Func: func(c *ishell.Context) {
c.Println("Input multiple lines and end with semicolon ';'.")
lines := c.ReadMultiLines(";")
c.Println("Done reading. You wrote:")
c.Println(lines)
},
})
Execution
>>> multi
Input multiple lines and end with semicolon ';'.
>>> this is user defined
... multiline input;
You wrote:
this is user defined
multiline input;
Builtin interrupt handler.
>>> ^C
Input Ctrl-C once more to exit
>>> ^C
Interrupted
exit status 1
Custom
shell.Interrupt(func(count int, c *ishell.Context) { ... })
func(c *ishell.Context) {
choice := c.MultiChoice([]string{
"Golangers",
"Go programmers",
"Gophers",
"Goers",
}, "What are Go programmers called ?")
if choice == 2 {
c.Println("You got it!")
} else {
c.Println("Sorry, you're wrong.")
}
},
Output
What are Go programmers called ?
Golangers
Go programmers
> Gophers
Goers
You got it!
func(c *ishell.Context) {
languages := []string{"Python", "Go", "Haskell", "Rust"}
choices := c.Checklist(languages,
"What are your favourite programming languages ?", nil)
out := func() []string { ... } // convert index to language
c.Println("Your choices are", strings.Join(out(), ", "))
}
Output
What are your favourite programming languages ?
Python
✓ Go
Haskell
>✓ Rust
Your choices are Go, Rust
Determinate
func(c *ishell.Context) {
c.ProgressBar().Start()
for i := 0; i < 101; i++ {
c.ProgressBar().Suffix(fmt.Sprint(" ", i, "%"))
c.ProgressBar().Progress(i)
... // some background computation
}
c.ProgressBar().Stop()
}
Output
[==========> ] 50%
Indeterminate
func(c *ishell.Context) {
c.ProgressBar().Indeterminate(true)
c.ProgressBar().Start()
... // some background computation
c.ProgressBar().Stop()
}
Output
[ ==== ]
Custom display using briandowns/spinner.
display := ishell.ProgressDisplayCharSet(spinner.CharSets[11])
func(c *Context) { c.ProgressBar().Display(display) ... }
// or set it globally
ishell.ProgressBar().Display(display)
// Read and write history to $HOME/.ishell_history
shell.SetHomeHistoryPath(".ishell_history")
In some situations it is desired to exit the program directly after executing a single command.
// when started with "exit" as first argument, assume non-interactive execution
if len(os.Args) > 1 && os.Args[1] == "exit" {
shell.Process(os.Args[2:]...)
} else {
// start shell
shell.Run()
}
# Run normally - interactive mode:
$ go run main.go
>>> |
# Run non-interactivelly
$ go run main.go exit greet Someusername
Hello Someusername
You can use fatih/color.
func(c *ishell.Context) {
yellow := color.New(color.FgYellow).SprintFunc()
c.Println(yellow("This line is yellow"))
}
Execution
>>> color
This line is yellow
Available here.
go run example/main.go
ishell is in active development and can still change significantly.
MIT
Library | Use |
---|---|
github.com/flynn-archive/go-shlex | splitting input into command and args. |
github.com/chzyer/readline | readline capabilities. |
bitcoin: 1GTHYEDiy2C7RzXn5nY4wVRaEN2GvLjwZN
paypal: a@abiosoft.com
第八章 ISHELL简介 一、主要内容 (1)、介绍IShell所提供的八大类服务 (2)、介绍IShell API所提供操作和特点 二、IShell所提供的8类服务 (1)、应用程序管理 (2)、资源文件的管理 (3)、设备和应用程序配置信息 (4)、Notification (5)、Alarms (6)、Timers (7)、对话框, message boxes 和 prompts (8)、
ISHELL_SendEvent() 和 ISHELL_PostEvent() 有什么区别? ISHELL_SendEvent() 和 ISHELL_PostEvent() 函数都用来向指定类发送事件。 两者的区别在于发送事件的方式。 对于 ISHELL_SendEvent(),事件会立即发送到指定类 ID 的应用程序。如果当前没有该类的实例,AEE 外壳创建一个实例,然后用指定的事件代码和数
假设你当时系统的时间为20130804000000,那么如果你将系统的时间改为20140104000000,那么ISHELL_GetJulianDate 将返回20140104000000。 但如果你将系统时间改为小于20140104000000的一个时间点,例如:20131204000000,那么ISHELL_GetJulianDate 将返回给你the device reference t
C++ ISHELL_SetTimer C++中loop是计时器到达指定时间的时候调用的函数(该函数的声明必须是静态的) ISHELL_SetTimer (getAppPtr()->m_pIShell, 50, (PFNNOTIFY)loop,(void*)this) ;//调用 static void loop(Welcome *recivemail);//声明 void Welcome::lo
已经写过好几个brew游戏了,今天又新写一个,前面都很顺利,启动时却弹出一个“unable to start application”的错误,跟踪代码找原因,发现EVT_APP_START处得断点已经走了,说明AP已经启动成功,继续跟踪,在ISHELL_LoadResImage处返回的值为空,错误的位置找到了,原因是什么呢? 首先说一下,我添加资源,创建mif的步骤都是按照