package gocui
import "github.com/jroimartin/gocui"
软件包gocui允许创建控制台用户界面。
创建一个新的GUI:
g, err := gocui.NewGui(gocui.OutputNormal)
if err != nil {
// 处理错误
}
defer g.Close()
// 设置GUI管理器和键绑定
// ...
if err := g.MainLoop(); err != nil && err != gocui.ErrQuit {
// 处理错误
}
设置GUI管理器:
g.SetManager(mgr1, mgr2)
管理人员负责GUI的布局,并可用于构建小部件。 在GUI主循环的每次迭代中,将执行每个已配置管理器的Layout功能。 管理器用于设置和更新应用程序的主视图,可以在执行期间自由更改它们。 另外,重要的是要提到对每个报告的事件(按键,鼠标事件,窗口大小调整等)执行主循环迭代。
GUI由视图组成,您可以将其视为缓冲区。 视图实现了io.ReadWriter接口,因此,如果您要修改它们的内容,则可以只写它们。 读取同样有效。
使用绝对坐标创建和初始化视图:
if v, err := g.SetView("viewname", 2, 2, 22, 7); err != nil {
if err != gocui.ErrUnknownView {
// 处理错误
}
fmt.Fprintln(v, "This is a new view")
// ...
}
也可以使用相对坐标创建视图:
maxX, maxY := g.Size()
if v, err := g.SetView("viewname", maxX/2-30, maxY/2, maxX/2+30, maxY/2+2); err != nil {
// ...
}
配置按键绑定:
if err := g.SetKeybinding("viewname", gocui.KeyEnter, gocui.ModNone, fcn); err != nil {
// 处理错误
}
gocui实现了对鼠标的完全支持,可以通过以下方式启用它:
g.Mouse = true
鼠标事件的处理方式与其他任何键绑定一样:
if err := g.SetKeybinding("viewname", gocui.MouseLeft, gocui.ModNone, fcn); err != nil {
// 处理错误
}
重要信息:只能以三种方式创建,销毁或更新视图:从管理器中的Layout函数,从键绑定回调或通过* Gui.Update()
。 原因是它允许gocui是并发安全的。 因此,如果要从goroutine更新GUI,则必须使用* Gui.Update()
。 例如:
g.Update(func(g *gocui.Gui) error {
v, err := g.View("viewname")
if err != nil {
// 处理错误
}
v.Clear()
fmt.Fprintln(v, "Writing from different goroutines")
return nil
})
默认情况下,gocui提供基本的编辑模式。 可以扩展和定制此模式,以创建新的编辑器并将其分配给* View.Editor
:
var DefaultEditor Editor = EditorFunc(simpleEditor)
func simpleEditor(v *View, key Key, ch rune, mod Modifier) {
switch {
case ch != 0 && mod == 0:
v.EditWrite(ch)
case key == KeySpace:
v.EditWrite(' ')
case key == KeyBackspace || key == KeyBackspace2:
v.EditDelete(true)
// ...
}
}
彩色文字:
视图允许使用ANSI颜色添加彩色文本。 例如:
fmt.Fprintln(v, "\x1b[0;31mHello world")
有关更多信息,请参见文件夹_examples /
中的示例。
Index
Constants(常数)
const (
ColorDefault Attribute = Attribute(termbox.ColorDefault)
ColorBlack = Attribute(termbox.ColorBlack)
ColorRed = Attribute(termbox.ColorRed)
ColorGreen = Attribute(termbox.ColorGreen)
ColorYellow = Attribute(termbox.ColorYellow)
ColorBlue = Attribute(termbox.ColorBlue)
ColorMagenta = Attribute(termbox.ColorMagenta)
ColorCyan = Attribute(termbox.ColorCyan)
ColorWhite = Attribute(termbox.ColorWhite)
)
颜色属性:
const (
AttrBold Attribute = Attribute(termbox.AttrBold)
AttrUnderline = Attribute(termbox.AttrUnderline)
AttrReverse = Attribute(termbox.AttrReverse)
)
文字样式属性:
const (
// OutputNormal提供8色终端模式。
OutputNormal = OutputMode(termbox.OutputNormal)
// Output256提供256色终端模式。
Output256 = OutputMode(termbox.Output256)
)
特殊键:
const (
KeyF1 Key = Key(termbox.KeyF1)
KeyF2 = Key(termbox.KeyF2)
KeyF3 = Key(termbox.KeyF3)
KeyF4 = Key(termbox.KeyF4)
KeyF5 = Key(termbox.KeyF5)
KeyF6 = Key(termbox.KeyF6)
KeyF7 = Key(termbox.KeyF7)
KeyF8 = Key(termbox.KeyF8)
KeyF9 = Key(termbox.KeyF9)
KeyF10 = Key(termbox.KeyF10)
KeyF11 = Key(termbox.KeyF11)
KeyF12 = Key(termbox.KeyF12)
KeyInsert = Key(termbox.KeyInsert)
KeyDelete = Key(termbox.KeyDelete)
KeyHome = Key(termbox.KeyHome)
KeyEnd = Key(termbox.KeyEnd)
KeyPgup = Key(termbox.KeyPgup)
KeyPgdn = Key(termbox.KeyPgdn)
KeyArrowUp = Key(termbox.KeyArrowUp)
KeyArrowDown = Key(termbox.KeyArrowDown)
KeyArrowLeft = Key(termbox.KeyArrowLeft)
KeyArrowRight = Key(termbox.KeyArrowRight)
MouseLeft = Key(termbox.MouseLeft)
MouseMiddle = Key(termbox.MouseMiddle)
MouseRight = Key(termbox.MouseRight)
MouseRelease = Key(termbox.MouseRelease)
MouseWheelUp = Key(termbox.MouseWheelUp)
MouseWheelDown = Key(termbox.MouseWheelDown)
)
按键组合
const (
KeyCtrlTilde Key = Key(termbox.KeyCtrlTilde)
KeyCtrl2 = Key(termbox.KeyCtrl2)
KeyCtrlSpace = Key(termbox.KeyCtrlSpace)
KeyCtrlA = Key(termbox.KeyCtrlA)
KeyCtrlB = Key(termbox.KeyCtrlB)
KeyCtrlC = Key(termbox.KeyCtrlC)
KeyCtrlD = Key(termbox.KeyCtrlD)
KeyCtrlE = Key(termbox.KeyCtrlE)
KeyCtrlF = Key(termbox.KeyCtrlF)
KeyCtrlG = Key(termbox.KeyCtrlG)
KeyBackspace = Key(termbox.KeyBackspace)
KeyCtrlH = Key(termbox.KeyCtrlH)
KeyTab = Key(termbox.KeyTab)
KeyCtrlI = Key(termbox.KeyCtrlI)
KeyCtrlJ = Key(termbox.KeyCtrlJ)
KeyCtrlK = Key(termbox.KeyCtrlK)
KeyCtrlL = Key(termbox.KeyCtrlL)
KeyEnter = Key(termbox.KeyEnter)
KeyCtrlM = Key(termbox.KeyCtrlM)
KeyCtrlN = Key(termbox.KeyCtrlN)
KeyCtrlO = Key(termbox.KeyCtrlO)
KeyCtrlP = Key(termbox.KeyCtrlP)
KeyCtrlQ = Key(termbox.KeyCtrlQ)
KeyCtrlR = Key(termbox.KeyCtrlR)
KeyCtrlS = Key(termbox.KeyCtrlS)
KeyCtrlT = Key(termbox.KeyCtrlT)
KeyCtrlU = Key(termbox.KeyCtrlU)
KeyCtrlV = Key(termbox.KeyCtrlV)
KeyCtrlW = Key(termbox.KeyCtrlW)
KeyCtrlX = Key(termbox.KeyCtrlX)
KeyCtrlY = Key(termbox.KeyCtrlY)
KeyCtrlZ = Key(termbox.KeyCtrlZ)
KeyEsc = Key(termbox.KeyEsc)
KeyCtrlLsqBracket = Key(termbox.KeyCtrlLsqBracket)
KeyCtrl3 = Key(termbox.KeyCtrl3)
KeyCtrl4 = Key(termbox.KeyCtrl4)
KeyCtrlBackslash = Key(termbox.KeyCtrlBackslash)
KeyCtrl5 = Key(termbox.KeyCtrl5)
KeyCtrlRsqBracket = Key(termbox.KeyCtrlRsqBracket)
KeyCtrl6 = Key(termbox.KeyCtrl6)
KeyCtrl7 = Key(termbox.KeyCtrl7)
KeyCtrlSlash = Key(termbox.KeyCtrlSlash)
KeyCtrlUnderscore = Key(termbox.KeyCtrlUnderscore)
KeySpace = Key(termbox.KeySpace)
KeyBackspace2 = Key(termbox.KeyBackspace2)
KeyCtrl8 = Key(termbox.KeyCtrl8)
)
Variables(变量)
var (
// ErrQuit用于确定MainLoop是否成功完成。
ErrQuit = errors.New("quit")
// ErrUnknownView允许断言是否初始化了View。
ErrUnknownView = errors.New("unknown view")
)
type Attribute(类型属性)
属性表示终端属性,例如颜色,字体样式等。可以使用按位或(|)进行组合。 请注意,不可能组合多个颜色属性。
type Attribute termbox.Attribute
type Editor(类型编辑器)
gocui编辑器必须满足编辑器界面。
type Editor interface {
Edit(v *View, key Key, ch rune, mod Modifier)
}
DefaultEditor是默认编辑器。
var DefaultEditor Editor = EditorFunc(simpleEditor)
type EditorFunc (类型EditorFunc)
EditorFunc类型是一个适配器,允许将普通功能用作编辑器。 如果f是具有适当签名的函数,则EditorFunc(f)是调用f的Editor对象。
type EditorFunc func(v *View, key Key, ch rune, mod Modifier)
func (f EditorFunc) Edit(v *View, key Key, ch rune, mod Modifier)
编辑通话
func (f EditorFunc) Edit(v *View, key Key, ch rune, mod Modifier)
type Gui
Gui代表整个用户界面,包括视图,布局和键绑定。
type Gui struct {
// BgColor和FgColor允许配置GUI的背景和前景色。
BgColor, FgColor Attribute
//SelBgColor和SelFgColor允许配置当前视图框架的背景和前景色。
SelBgColor, SelFgColor Attribute
// 如果“高光”为true,则将使用Sel {Bg,Fg} Colors绘制当前视图的框架。
Highlight bool
// 如果Cursor为true,则启用光标。
Cursor bool
// 如果Mouse为true,则将启用鼠标事件。
Mouse bool
// 如果InputEsc为true,则当ESC序列在缓冲区中并且与任何已知序列都不匹配时,ESC表示KeyEsc。
InputEsc bool
// 如果ASCII为true,则使用ASCII代替unicode绘制界面。 使用ASCII更可移植。
ASCII bool
//包含已过滤或未导出的字段
}
func NewGui(mode OutputMode) (*Gui, error)
NewGui返回具有给定输出模式的新Gui对象。
func NewGui(mode OutputMode) (*Gui, error)
func (g *Gui) Close()
关闭完成库。 在成功初始化之后并且不再需要gocui时应调用它。
func (g *Gui) Close()
func (g *Gui) CurrentView() *View
CurrentView返回当前焦点视图,如果没有视图拥有焦点,则返回nil。
func (g *Gui) CurrentView() *View
func (g *Gui) DeleteKeybinding(viewname string, key interface{}, mod Modifier) error
func (*Gui) DeleteKeybinding(删除绑定键)
DeleteKeybinding删除一个键绑定。
func (g *Gui) DeleteKeybinding(viewname string, key interface{}, mod Modifier) error
func (g *Gui) DeleteKeybindings(viewname string)
删除键绑定删除视图的所有键绑定。
func (g *Gui) DeleteKeybindings(viewname string)
func (g *Gui) DeleteView(name string) error
DeleteView按名称删除视图。
func (g *Gui) DeleteView(name string) error
func (g *Gui) MainLoop() error
MainLoop运行主循环,直到返回错误。 成功完成后应返回ErrQuit。
func (g *Gui) MainLoop() error
func (g *Gui) Rune(x, y int) (rune, error)
符文返回给定位置的单元格中包含的符文。 它检查位置是否有效。
func (g *Gui) Rune(x, y int) (rune, error)
func (g *Gui) SetCurrentView(name string) (*View, error)
SetCurrentView将焦点赋予给定视图。
func (g *Gui) SetCurrentView(name string) (*View, error)
func (g *Gui) SetKeybinding(viewname string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error
SetKeybinding创建一个新的键绑定。 如果viewname等于“”(空字符串),则绑定将应用于所有视图。 密钥必须是符文或密钥。
func (g *Gui) SetKeybinding(viewname string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error
func (g *Gui) SetManager(managers …Manager)
SetManager设置给定的GUI管理器。 它将删除所有视图和键绑定。
func (g *Gui) SetManager(managers ...Manager)
func (g *Gui) SetManagerFunc(manager func(*Gui) error)
SetManagerFunc设置给定的管理器功能。 它将删除所有视图和键绑定。
func (g *Gui) SetManagerFunc(manager func(*Gui) error)
func (g *Gui) SetRune(x, y int, ch rune, fgColor, bgColor Attribute) error
SetRune在相对于终端左上角的给定点写入一个符文。 它检查该位置是否有效并应用给定的颜色。
func (g *Gui) SetRune(x, y int, ch rune, fgColor, bgColor Attribute) error
func (g *Gui) SetView(name string, x0, y0, x1, y1 int) (*View, error)
SetView创建一个新视图,其左上角为(x0,y0),右下角为(x1,y1)。 如果已经存在相同名称的视图,则其尺寸将更新; 否则,返回错误ErrUnknownView,该错误允许断言View是否必须初始化。 它检查位置是否有效。
func (g *Gui) SetView(name string, x0, y0, x1, y1 int) (*View, error)
func (g *Gui) SetViewOnBottom(name string) (*View, error)
SetViewOnBottom将给定视图设置在现有视图的底部。
func (g *Gui) SetViewOnBottom(name string) (*View, error)
func (g *Gui) SetViewOnTop(name string) (*View, error)
SetViewOnTop将给定视图设置在现有视图之上。
func (g *Gui) SetViewOnTop(name string) (*View, error)
func (g *Gui) Size() (x, y int)
Size返回终端的大小。
func (g *Gui) Size() (x, y int)
func (g *Gui) Update(f func(*Gui) error)
Update执行传递的函数。 可以从goroutine安全地调用此方法以更新GUI。 重要的是要注意,传递的函数不会立即执行,而是会添加到用户事件队列中。 鉴于Update产生了一个goroutine,因此不能保证处理用户事件的顺序。
func (g *Gui) Update(f func(*Gui) error)
func (g *Gui) View(name string) (*View, error)
视图返回指向给定名称的视图的指针,如果不存在具有该名称的视图,则返回错误ErrUnknownView。
func (g *Gui) View(name string) (*View, error)
func (g *Gui) ViewByPosition(x, y int) (*View, error)
ViewByPosition返回指向与给定位置匹配的视图的指针,如果该位置的视图不存在,则返回错误ErrUnknownView。
func (g *Gui) ViewByPosition(x, y int) (*View, error)
func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error)
ViewPosition返回具有给定名称的视图的坐标,如果不存在具有该名称的视图,则返回ErrUnknownView。
func (g *Gui) ViewPosition(name string) (x0, y0, x1, y1 int, err error)
func (g *Gui) Views() []*View
视图返回GUI中的所有视图。
func (g *Gui) Views() []*View
type Key
键代表特殊键或组合键。
type Key termbox.Key
type Manager
经理负责GUI的布局,可用于构建小部件。
type Manager interface {
// 每次重新绘制GUI时都会调用布局,该布局必须包含基本视图及其初始化。
Layout(*Gui) error
}
type ManagerFunc
ManagerFunc类型是一种适配器,允许将普通功能用作Manager。 如果f是具有适当签名的函数,则ManagerFunc(f)是调用f的Manager对象。
type ManagerFunc func(*Gui) error
func (f ManagerFunc) Layout(g *Gui) error
布局调用f(g)
func (f ManagerFunc) Layout(g *Gui) error
type Modifier
修饰符允许定义特殊的按键组合。 定义新的键绑定时,可以将它们与“键”或“符文”结合使用。
type Modifier termbox.Modifier
修饰符。
const (
ModNone Modifier = Modifier(0)
ModAlt = Modifier(termbox.ModAlt)
)
type OutputMode
OutputMode表示终端的输出模式(8或256色)。
type OutputMode termbox.OutputMode
type View
视图是一个窗口。 它维护自己的内部缓冲区和光标位置。
type View struct {
// BgColor和FgColor允许配置视图的背景和前景色。
BgColor, FgColor Attribute
// SelBgColor和SelFgColor用于配置选定线的突出显示时的背景色和前景色。
SelBgColor, SelFgColor Attribute
// 如果Editable为true,则击键将添加到视图的内部缓冲区的光标位置。
Editable bool
// 编辑器允许定义管理版本模式的编辑器,包括键绑定或光标行为。 默认情况下使用DefaultEditor。
Editor Editor
// 覆盖启用或禁用视图的覆盖模式。
Overwrite bool
// 如果“高光”为true,则Sel {Bg,Fg} Colors将用于光标位置下方的行。
Highlight bool
// 如果Frame为true,则将在视图周围绘制边框。
Frame bool
// 如果Wrap为true,则写入到此View的内容长于其宽度时将自动进行包装。 如果为true,则将忽略视图的x起点。
Wrap bool
// 如果Autoscroll为true,则在文本溢出时,视图将自动向下滚动。 如果为true,则将忽略视图的y起点。
Autoscroll bool
// 如果Frame为true,则Title可以为视图配置标题。
Title string
// 如果Mask为true,则View将显示遮罩而不是实际内容
Mask rune
// 包含过滤或未导出的字段
}
func (v *View) Buffer() string
Buffer返回一个字符串,其中包含视图内部缓冲区的内容。
func (v *View) Buffer() string
func (v *View) BufferLines() []string
BufferLines返回视图内部缓冲区中的行。
func (v *View) BufferLines() []string
func (v *View) Clear()
清除清空视图的内部缓冲区。
func (v *View) Clear()
func (v *View) Cursor() (x, y int)
光标返回视图的光标位置。
func (v *View) Cursor() (x, y int)
func (v *View) EditDelete(back bool)
EditDelete删除光标位置的符文。 back确定方向。
func (v *View) EditDelete(back bool)
func (v *View) EditNewLine()
EditNewLine在光标下插入新行。
func (v *View) EditWrite(ch rune)
func (v *View) EditWrite(ch rune)
EditWrite在光标位置写入一个符文。
func (v *View) EditWrite(ch rune)
func (v *View) Line(y int) (string, error)
Line返回一个字符串,该字符串的视图内部缓冲区的线位于与点(x,y)对应的位置。
func (v *View) Line(y int) (string, error)
func (v *View) MoveCursor(dx, dy int, writeMode bool)
MoveCursor会考虑线/视图的宽度来移动光标,并在必要时替换原点。
func (v *View) MoveCursor(dx, dy int, writeMode bool)
func (v *View) Name() string
名称返回视图的名称。
func (v *View) Name() string
func (v *View) Origin() (x, y int)
原点返回视图的原点位置。
func (v *View) Origin() (x, y int)
func (v *View) Read(p []byte) (n int, err error)
读取将数据读入p。 它返回读入p的字节数。 在EOF,err将为io.EOF。 在Rewind()之后调用Read()可使高速缓存用视图的内容刷新。
func (v *View) Read(p []byte) (n int, err error)
func (v *View) Rewind()
Rewind将下一个Read的偏移量设置为0,这也会刷新read缓存。
func (v *View) Rewind()
func (v *View) SetCursor(x, y int) error
SetCursor设置视图在给定点相对于视图的光标位置。 它检查位置是否有效。
func (v *View) SetCursor(x, y int) error
func (v *View) SetOrigin(x, y int) error
SetOrigin设置视图内部缓冲区的原点位置,因此从此点开始打印缓冲区,这意味着它已与原点连接。 它可以用于仅通过增加和减少ox和oy来实现水平和垂直滚动。
func (v *View) SetOrigin(x, y int) error
func (v *View) Size() (x, y int)
大小返回视图中可见列和行的数量。
func (v *View) Size() (x, y int)
func (v *View) ViewBuffer() string
ViewBuffer返回一个字符串,其中包含显示给用户的视图缓冲区的内容。
func (v *View) ViewBufferLines() []string
func (v *View) ViewBufferLines() []string
ViewBufferLines返回视图的内部缓冲区中显示给用户的行。
func (v *View) ViewBufferLines() []string
func (v *View) Word(x, y int) (string, error)
Word返回一个字符串,该字符串的视图内部缓冲区的单词位于与点(x,y)对应的位置。
func (v *View) Word(x, y int) (string, error)
func (v *View) Write(p []byte) (n int, err error)
写操作将字节切片追加到视图的内部缓冲区中。 由于View实现io.Writer接口,因此可以将其作为fmt.Fprintf,fmt.Fprintln,io.Copy等函数的参数传递。必须调用Clear来清除视图的缓冲区。
func (v *View) Write(p []byte) (n int, err error)
gocui 是一个 Go 语言用来开发控制台应用的 UI 工具包。手工翻译自GoDoc,如有错误,欢迎及时提出。致谢~~
GoDoc: https://github.com/jroimartin/gocui
项目地址: https://github.com/jroimartin/gocui