Documentation ¶
Overview ¶
Package tea provides a framework for building rich terminal user interfaces based on the paradigms of The Elm Architecture. It's well-suited for simple and complex terminal applications, either inline, full-window, or a mix of both. It's been battle-tested in several large projects and is production-ready.
A tutorial is available at https://github.com/charmbracelet/bubbletea/tree/master/tutorials
Example programs can be found at https://github.com/charmbracelet/bubbletea/tree/master/examples
Index ¶
- Variables
- func LogToFile(path string, prefix string) (*os.File, error)
- func LogToFileWith(path string, prefix string, log LogOptionsSetter) (*os.File, error)
- type BatchMsg
- type BlurMsg
- type Cmd
- func Batch(cmds ...Cmd) Cmd
- func Every(duration time.Duration, fn func(time.Time) Msg) Cmd
- func Exec(c ExecCommand, fn ExecCallback) Cmd
- func ExecProcess(c *exec.Cmd, fn ExecCallback) Cmd
- func Printf(template string, args ...interface{}) Cmd
- func Println(args ...interface{}) Cmd
- func ScrollDown(newLines []string, topBoundary, bottomBoundary int) Cmddeprecated
- func ScrollUp(newLines []string, topBoundary, bottomBoundary int) Cmddeprecated
- func Sequence(cmds ...Cmd) Cmd
- func Sequentially(cmds ...Cmd) Cmddeprecated
- func SetWindowTitle(title string) Cmd
- func SyncScrollArea(lines []string, topBoundary int, bottomBoundary int) Cmddeprecated
- func Tick(d time.Duration, fn func(time.Time) Msg) Cmd
- func WindowSize() Cmd
- type ExecCallback
- type ExecCommand
- type FocusMsg
- type Key
- type KeyMsg
- type KeyType
- type LogOptionsSetter
- type Model
- type MouseAction
- type MouseButton
- type MouseEvent
- type MouseEventTypedeprecated
- type MouseMsg
- type Msg
- func ClearScreen() Msg
- func ClearScrollArea() Msgdeprecated
- func DisableBracketedPaste() Msg
- func DisableMouse() Msg
- func DisableReportFocus() Msg
- func EnableBracketedPaste() Msg
- func EnableMouseAllMotion() Msg
- func EnableMouseCellMotion() Msg
- func EnableReportFocus() Msg
- func EnterAltScreen() Msg
- func ExitAltScreen() Msg
- func HideCursor() Msg
- func Quit() Msg
- func ShowCursor() Msg
- func Suspend() Msg
- type Program
- func (p *Program) DisableMouseAllMotion()deprecated
- func (p *Program) DisableMouseCellMotion()deprecated
- func (p *Program) EnableMouseAllMotion()deprecated
- func (p *Program) EnableMouseCellMotion()deprecated
- func (p *Program) EnterAltScreen()deprecated
- func (p *Program) ExitAltScreen()deprecated
- func (p *Program) Kill()
- func (p *Program) Printf(template string, args ...interface{})
- func (p *Program) Println(args ...interface{})
- func (p *Program) Quit()
- func (p *Program) ReleaseTerminal() error
- func (p *Program) RestoreTerminal() error
- func (p *Program) Run() (Model, error)
- func (p *Program) Send(msg Msg)
- func (p *Program) SetWindowTitle(title string)deprecated
- func (p *Program) Start() errordeprecated
- func (p *Program) StartReturningModel() (Model, error)deprecated
- func (p *Program) Wait()
- type ProgramOption
- func WithANSICompressor() ProgramOptiondeprecated
- func WithAltScreen() ProgramOption
- func WithContext(ctx context.Context) ProgramOption
- func WithEnvironment(env []string) ProgramOption
- func WithFPS(fps int) ProgramOption
- func WithFilter(filter func(Model, Msg) Msg) ProgramOption
- func WithInput(input io.Reader) ProgramOption
- func WithInputTTY() ProgramOption
- func WithMouseAllMotion() ProgramOption
- func WithMouseCellMotion() ProgramOption
- func WithOutput(output io.Writer) ProgramOption
- func WithReportFocus() ProgramOption
- func WithoutBracketedPaste() ProgramOption
- func WithoutCatchPanics() ProgramOption
- func WithoutRenderer() ProgramOption
- func WithoutSignalHandler() ProgramOption
- func WithoutSignals() ProgramOption
- type QuitMsg
- type ResumeMsg
- type SuspendMsg
- type WindowSizeMsg
Constants ¶
This section is empty.
Variables ¶
var ErrProgramKilled = errors.New("program was killed")
ErrProgramKilled is returned by Program.Run when the program got killed.
Functions ¶
func LogToFile ¶
LogToFile sets up default logging to log to a file. This is helpful as we can't print to the terminal since our TUI is occupying it. If the file doesn't exist it will be created.
Don't forget to close the file when you're done with it.
f, err := LogToFile("debug.log", "debug") if err != nil { fmt.Println("fatal:", err) os.Exit(1) } defer f.Close()
func LogToFileWith ¶
LogToFileWith does allows to call LogToFile with a custom LogOptionsSetter.
Types ¶
type BatchMsg ¶
type BatchMsg []Cmd
BatchMsg is a message used to perform a bunch of commands concurrently with no ordering guarantees. You can send a BatchMsg with Batch.
type BlurMsg ¶
type BlurMsg struct{}
BlurMsg represents a terminal blur message. This occurs when the terminal loses focus.
type Cmd ¶
type Cmd func() Msg
Cmd is an IO operation that returns a message when it's complete. If it's nil it's considered a no-op. Use it for things like HTTP requests, timers, saving and loading from disk, and so on.
Note that there's almost never a reason to use a command to send a message to another part of your program. That can almost always be done in the update function.
func Batch ¶
Batch performs a bunch of commands concurrently with no ordering guarantees about the results. Use a Batch to return several commands.
Example:
func (m model) Init() Cmd { return tea.Batch(someCommand, someOtherCommand) }
func Every ¶
Every is a command that ticks in sync with the system clock. So, if you wanted to tick with the system clock every second, minute or hour you could use this. It's also handy for having different things tick in sync.
Because we're ticking with the system clock the tick will likely not run for the entire specified duration. For example, if we're ticking for one minute and the clock is at 12:34:20 then the next tick will happen at 12:35:00, 40 seconds later.
To produce the command, pass a duration and a function which returns a message containing the time at which the tick occurred.
type TickMsg time.Time cmd := Every(time.Second, func(t time.Time) Msg { return TickMsg(t) })
Beginners' note: Every sends a single message and won't automatically dispatch messages at an interval. To do that, you'll want to return another Every command after receiving your tick message. For example:
type TickMsg time.Time // Send a message every second. func tickEvery() Cmd { return Every(time.Second, func(t time.Time) Msg { return TickMsg(t) }) } func (m model) Init() Cmd { // Start ticking. return tickEvery() } func (m model) Update(msg Msg) (Model, Cmd) { switch msg.(type) { case TickMsg: // Return your Every command again to loop. return m, tickEvery() } return m, nil }
Every is analogous to Tick in the Elm Architecture.
func Exec ¶
func Exec(c ExecCommand, fn ExecCallback) Cmd
Exec is used to perform arbitrary I/O in a blocking fashion, effectively pausing the Program while execution is running and resuming it when execution has completed.
Most of the time you'll want to use ExecProcess, which runs an exec.Cmd.
For non-interactive i/o you should use a Cmd (that is, a tea.Cmd).
func ExecProcess ¶
func ExecProcess(c *exec.Cmd, fn ExecCallback) Cmd
ExecProcess runs the given *exec.Cmd in a blocking fashion, effectively pausing the Program while the command is running. After the *exec.Cmd exists the Program resumes. It's useful for spawning other interactive applications such as editors and shells from within a Program.
To produce the command, pass an *exec.Cmd and a function which returns a message containing the error which may have occurred when running the ExecCommand.
type VimFinishedMsg struct { err error } c := exec.Command("vim", "file.txt") cmd := ExecProcess(c, func(err error) Msg { return VimFinishedMsg{err: err} })
Or, if you don't care about errors, you could simply:
cmd := ExecProcess(exec.Command("vim", "file.txt"), nil)
For non-interactive i/o you should use a Cmd (that is, a tea.Cmd).
func Printf ¶
Printf prints above the Program. It takes a format template followed by values similar to fmt.Printf. This output is unmanaged by the program and will persist across renders by the Program.
Unlike fmt.Printf (but similar to log.Printf) the message will be print on its own line.
If the altscreen is active no output will be printed.
func Println ¶
func Println(args ...interface{}) Cmd
Println prints above the Program. This output is unmanaged by the program and will persist across renders by the Program.
Unlike fmt.Println (but similar to log.Println) the message will be print on its own line.
If the altscreen is active no output will be printed.
func ScrollDown
deprecated
ScrollDown adds lines to the bottom of the scrollable region, pushing existing lines above up. Lines that are pushed out of the scrollable region disappear from view.
For high-performance, scroll-based rendering only.
Deprecated: This option will be removed in a future version of this package.
func ScrollUp
deprecated
ScrollUp adds lines to the top of the scrollable region, pushing existing lines below down. Lines that are pushed out the scrollable region disappear from view.
For high-performance, scroll-based rendering only.
Deprecated: This option will be removed in a future version of this package.
func Sequence ¶
Sequence runs the given commands one at a time, in order. Contrast this with Batch, which runs commands concurrently.
func Sequentially
deprecated
Sequentially produces a command that sequentially executes the given commands. The Msg returned is the first non-nil message returned by a Cmd.
func saveStateCmd() Msg { if err := save(); err != nil { return errMsg{err} } return nil } cmd := Sequentially(saveStateCmd, Quit)
Deprecated: use Sequence instead.
func SetWindowTitle ¶
SetWindowTitle produces a command that sets the terminal title.
For example:
func (m model) Init() Cmd { // Set title. return tea.SetWindowTitle("My App") }
func SyncScrollArea
deprecated
SyncScrollArea performs a paint of the entire region designated to be the scrollable area. This is required to initialize the scrollable region and should also be called on resize (WindowSizeMsg).
For high-performance, scroll-based rendering only.
Deprecated: This option will be removed in a future version of this package.
func Tick ¶
Tick produces a command at an interval independent of the system clock at the given duration. That is, the timer begins precisely when invoked, and runs for its entire duration.
To produce the command, pass a duration and a function which returns a message containing the time at which the tick occurred.
type TickMsg time.Time cmd := Tick(time.Second, func(t time.Time) Msg { return TickMsg(t) })
Beginners' note: Tick sends a single message and won't automatically dispatch messages at an interval. To do that, you'll want to return another Tick command after receiving your tick message. For example:
type TickMsg time.Time func doTick() Cmd { return Tick(time.Second, func(t time.Time) Msg { return TickMsg(t) }) } func (m model) Init() Cmd { // Start ticking. return doTick() } func (m model) Update(msg Msg) (Model, Cmd) { switch msg.(type) { case TickMsg: // Return your Tick command again to loop. return m, doTick() } return m, nil }
func WindowSize ¶
func WindowSize() Cmd
WindowSize is a command that queries the terminal for its current size. It delivers the results to Update via a WindowSizeMsg. Keep in mind that WindowSizeMsgs will automatically be delivered to Update when the Program starts and when the window dimensions change so in many cases you will not need to explicitly invoke this command.
type ExecCallback ¶
ExecCallback is used when executing an *exec.Command to return a message with an error, which may or may not be nil.
type ExecCommand ¶
type ExecCommand interface { Run() error SetStdin(io.Reader) SetStdout(io.Writer) SetStderr(io.Writer) }
ExecCommand can be implemented to execute things in a blocking fashion in the current terminal.
type FocusMsg ¶
type FocusMsg struct{}
FocusMsg represents a terminal focus message. This occurs when the terminal gains focus.
type KeyMsg ¶
type KeyMsg Key
KeyMsg contains information about a keypress. KeyMsgs are always sent to the program's update function. There are a couple general patterns you could use to check for keypresses:
// Switch on the string representation of the key (shorter) switch msg := msg.(type) { case KeyMsg: switch msg.String() { case "enter": fmt.Println("you pressed enter!") case "a": fmt.Println("you pressed a!") } } // Switch on the key type (more foolproof) switch msg := msg.(type) { case KeyMsg: switch msg.Type { case KeyEnter: fmt.Println("you pressed enter!") case KeyRunes: switch string(msg.Runes) { case "a": fmt.Println("you pressed a!") } } }
Note that Key.Runes will always contain at least one character, so you can always safely call Key.Runes[0]. In most cases Key.Runes will only contain one character, though certain input method editors (most notably Chinese IMEs) can input multiple runes at once.
type KeyType ¶
type KeyType int
KeyType indicates the key pressed, such as KeyEnter or KeyBreak or KeyCtrlC. All other keys will be type KeyRunes. To get the rune value, check the Rune method on a Key struct, or use the Key.String() method:
k := Key{Type: KeyRunes, Runes: []rune{'a'}, Alt: true} if k.Type == KeyRunes { fmt.Println(k.Runes) // Output: a fmt.Println(k.String()) // Output: alt+a }
const ( KeyNull KeyType = keyNUL KeyBreak KeyType = keyETX KeyEnter KeyType = keyCR KeyBackspace KeyType = keyDEL KeyTab KeyType = keyHT KeyEsc KeyType = keyESC KeyEscape KeyType = keyESC KeyCtrlAt KeyType = keyNUL // ctrl+@ KeyCtrlA KeyType = keySOH KeyCtrlB KeyType = keySTX KeyCtrlC KeyType = keyETX KeyCtrlD KeyType = keyEOT KeyCtrlE KeyType = keyENQ KeyCtrlF KeyType = keyACK KeyCtrlG KeyType = keyBEL KeyCtrlH KeyType = keyBS KeyCtrlI KeyType = keyHT KeyCtrlJ KeyType = keyLF KeyCtrlK KeyType = keyVT KeyCtrlL KeyType = keyFF KeyCtrlM KeyType = keyCR KeyCtrlN KeyType = keySO KeyCtrlO KeyType = keySI KeyCtrlP KeyType = keyDLE KeyCtrlQ KeyType = keyDC1 KeyCtrlR KeyType = keyDC2 KeyCtrlS KeyType = keyDC3 KeyCtrlT KeyType = keyDC4 KeyCtrlU KeyType = keyNAK KeyCtrlV KeyType = keySYN KeyCtrlW KeyType = keyETB KeyCtrlX KeyType = keyCAN KeyCtrlY KeyType = keyEM KeyCtrlZ KeyType = keySUB KeyCtrlOpenBracket KeyType = keyESC // ctrl+[ KeyCtrlBackslash KeyType = keyFS // ctrl+\ KeyCtrlCloseBracket KeyType = keyGS // ctrl+] KeyCtrlCaret KeyType = keyRS // ctrl+^ KeyCtrlUnderscore KeyType = keyUS // ctrl+_ KeyCtrlQuestionMark KeyType = keyDEL // ctrl+? )
Control key aliases.
const ( KeyRunes KeyType = -(iota + 1) KeyUp KeyDown KeyRight KeyLeft KeyShiftTab KeyHome KeyEnd KeyPgUp KeyPgDown KeyCtrlPgUp KeyCtrlPgDown KeyDelete KeyInsert KeySpace KeyCtrlUp KeyCtrlDown KeyCtrlRight KeyCtrlLeft KeyCtrlHome KeyCtrlEnd KeyShiftUp KeyShiftDown KeyShiftRight KeyShiftLeft KeyShiftHome KeyShiftEnd KeyCtrlShiftUp KeyCtrlShiftDown KeyCtrlShiftLeft KeyCtrlShiftRight KeyCtrlShiftHome KeyCtrlShiftEnd KeyF1 KeyF2 KeyF3 KeyF4 KeyF5 KeyF6 KeyF7 KeyF8 KeyF9 KeyF10 KeyF11 KeyF12 KeyF13 KeyF14 KeyF15 KeyF16 KeyF17 KeyF18 KeyF19 KeyF20 )
Other keys.
type LogOptionsSetter ¶
LogOptionsSetter is an interface implemented by stdlib's log and charm's log libraries.
type Model ¶
type Model interface { // Init is the first function that will be called. It returns an optional // initial command. To not perform an initial command return nil. Init() Cmd // Update is called when a message is received. Use it to inspect messages // and, in response, update the model and/or send a command. Update(Msg) (Model, Cmd) // View renders the program's UI, which is just a string. The view is // rendered after every Update. View() string }
Model contains the program's state as well as its core functions.
type MouseAction ¶
type MouseAction int
MouseAction represents the action that occurred during a mouse event.
const ( MouseActionPress MouseAction = iota MouseActionRelease MouseActionMotion )
Mouse event actions.
type MouseButton ¶
type MouseButton int
MouseButton represents the button that was pressed during a mouse event.
const ( MouseButtonNone MouseButton = iota MouseButtonLeft MouseButtonMiddle MouseButtonRight MouseButtonWheelUp MouseButtonWheelDown MouseButtonWheelLeft MouseButtonWheelRight MouseButtonBackward MouseButtonForward MouseButton10 MouseButton11 )
Mouse event buttons
This is based on X11 mouse button codes.
1 = left button 2 = middle button (pressing the scroll wheel) 3 = right button 4 = turn scroll wheel up 5 = turn scroll wheel down 6 = push scroll wheel left 7 = push scroll wheel right 8 = 4th button (aka browser backward button) 9 = 5th button (aka browser forward button) 10 11
Other buttons are not supported.
type MouseEvent ¶
type MouseEvent struct { X int Y int Shift bool Alt bool Ctrl bool Action MouseAction Button MouseButton // Deprecated: Use MouseAction & MouseButton instead. Type MouseEventType }
MouseEvent represents a mouse event, which could be a click, a scroll wheel movement, a cursor movement, or a combination.
func (MouseEvent) IsWheel ¶
func (m MouseEvent) IsWheel() bool
IsWheel returns true if the mouse event is a wheel event.
func (MouseEvent) String ¶
func (m MouseEvent) String() (s string)
String returns a string representation of a mouse event.
type MouseEventType
deprecated
type MouseEventType int
MouseEventType indicates the type of mouse event occurring.
Deprecated: Use MouseAction & MouseButton instead.
const ( MouseUnknown MouseEventType = iota MouseLeft MouseRight MouseMiddle MouseRelease // mouse button release (X10 only) MouseWheelUp MouseWheelDown MouseWheelLeft MouseWheelRight MouseBackward MouseForward MouseMotion )
Mouse event types.
Deprecated: Use MouseAction & MouseButton instead.
type MouseMsg ¶
type MouseMsg MouseEvent
MouseMsg contains information about a mouse event and are sent to a programs update function when mouse activity occurs. Note that the mouse must first be enabled in order for the mouse events to be received.
type Msg ¶
type Msg interface{}
Msg contain data from the result of a IO operation. Msgs trigger the update function and, henceforth, the UI.
func ClearScreen ¶
func ClearScreen() Msg
ClearScreen is a special command that tells the program to clear the screen before the next update. This can be used to move the cursor to the top left of the screen and clear visual clutter when the alt screen is not in use.
Note that it should never be necessary to call ClearScreen() for regular redraws.
func ClearScrollArea
deprecated
func ClearScrollArea() Msg
ClearScrollArea deallocates the scrollable region and returns the control of those lines to the main rendering routine.
For high-performance, scroll-based rendering only.
Deprecated: This option will be removed in a future version of this package.
func DisableBracketedPaste ¶
func DisableBracketedPaste() Msg
DisableBracketedPaste is a special command that tells the Bubble Tea program to accept bracketed paste input.
Note that bracketed paste will be automatically disabled when the program quits.
func DisableMouse ¶
func DisableMouse() Msg
DisableMouse is a special command that stops listening for mouse events.
func DisableReportFocus ¶
func DisableReportFocus() Msg
DisableReportFocus is a special command that tells the Bubble Tea program to stop reporting focus events to the program.
func EnableBracketedPaste ¶
func EnableBracketedPaste() Msg
EnableBracketedPaste is a special command that tells the Bubble Tea program to accept bracketed paste input.
Note that bracketed paste will be automatically disabled when the program quits.
func EnableMouseAllMotion ¶
func EnableMouseAllMotion() Msg
EnableMouseAllMotion is a special command that enables mouse click, release, wheel, and motion events, which are delivered regardless of whether a mouse button is pressed, effectively enabling support for hover interactions.
Many modern terminals support this, but not all. If in doubt, use EnableMouseCellMotion instead.
Because commands run asynchronously, this command should not be used in your model's Init function. Use the WithMouseAllMotion ProgramOption instead.
func EnableMouseCellMotion ¶
func EnableMouseCellMotion() Msg
EnableMouseCellMotion is a special command that enables mouse click, release, and wheel events. Mouse movement events are also captured if a mouse button is pressed (i.e., drag events).
Because commands run asynchronously, this command should not be used in your model's Init function. Use the WithMouseCellMotion ProgramOption instead.
func EnableReportFocus ¶
func EnableReportFocus() Msg
EnableReportFocus is a special command that tells the Bubble Tea program to report focus events to the program.
func EnterAltScreen ¶
func EnterAltScreen() Msg
EnterAltScreen is a special command that tells the Bubble Tea program to enter the alternate screen buffer.
Because commands run asynchronously, this command should not be used in your model's Init function. To initialize your program with the altscreen enabled use the WithAltScreen ProgramOption instead.
func ExitAltScreen ¶
func ExitAltScreen() Msg
ExitAltScreen is a special command that tells the Bubble Tea program to exit the alternate screen buffer. This command should be used to exit the alternate screen buffer while the program is running.
Note that the alternate screen buffer will be automatically exited when the program quits.
func HideCursor ¶
func HideCursor() Msg
HideCursor is a special command for manually instructing Bubble Tea to hide the cursor. In some rare cases, certain operations will cause the terminal to show the cursor, which is normally hidden for the duration of a Bubble Tea program's lifetime. You will most likely not need to use this command.
func ShowCursor ¶
func ShowCursor() Msg
ShowCursor is a special command for manually instructing Bubble Tea to show the cursor.
type Program ¶
type Program struct {
// contains filtered or unexported fields
}
Program is a terminal user interface.
func NewProgram ¶
func NewProgram(model Model, opts ...ProgramOption) *Program
NewProgram creates a new Program.
func (*Program) DisableMouseAllMotion
deprecated
func (p *Program) DisableMouseAllMotion()
DisableMouseAllMotion disables All Motion mouse tracking. This will be called automatically when exiting a Bubble Tea program.
Deprecated: The mouse will automatically be disabled when the program exits.
func (*Program) DisableMouseCellMotion
deprecated
func (p *Program) DisableMouseCellMotion()
DisableMouseCellMotion disables Mouse Cell Motion tracking. This will be called automatically when exiting a Bubble Tea program.
Deprecated: The mouse will automatically be disabled when the program exits.
func (*Program) EnableMouseAllMotion
deprecated
func (p *Program) EnableMouseAllMotion()
EnableMouseAllMotion enables mouse click, release, wheel and motion events, regardless of whether a mouse button is pressed. Many modern terminals support this, but not all.
Deprecated: Use the WithMouseAllMotion ProgramOption instead.
func (*Program) EnableMouseCellMotion
deprecated
func (p *Program) EnableMouseCellMotion()
EnableMouseCellMotion enables mouse click, release, wheel and motion events if a mouse button is pressed (i.e., drag events).
Deprecated: Use the WithMouseCellMotion ProgramOption instead.
func (*Program) EnterAltScreen
deprecated
func (p *Program) EnterAltScreen()
EnterAltScreen enters the alternate screen buffer, which consumes the entire terminal window. ExitAltScreen will return the terminal to its former state.
Deprecated: Use the WithAltScreen ProgramOption instead.
func (*Program) ExitAltScreen
deprecated
func (p *Program) ExitAltScreen()
ExitAltScreen exits the alternate screen buffer.
Deprecated: The altscreen will exited automatically when the program exits.
func (*Program) Kill ¶
func (p *Program) Kill()
Kill stops the program immediately and restores the former terminal state. The final render that you would normally see when quitting will be skipped. [program.Run] returns a ErrProgramKilled error.
func (*Program) Printf ¶
Printf prints above the Program. It takes a format template followed by values similar to fmt.Printf. This output is unmanaged by the program and will persist across renders by the Program.
Unlike fmt.Printf (but similar to log.Printf) the message will be print on its own line.
If the altscreen is active no output will be printed.
func (*Program) Println ¶
func (p *Program) Println(args ...interface{})
Println prints above the Program. This output is unmanaged by the program and will persist across renders by the Program.
If the altscreen is active no output will be printed.
func (*Program) Quit ¶
func (p *Program) Quit()
Quit is a convenience function for quitting Bubble Tea programs. Use it when you need to shut down a Bubble Tea program from the outside.
If you wish to quit from within a Bubble Tea program use the Quit command.
If the program is not running this will be a no-op, so it's safe to call if the program is unstarted or has already exited.
func (*Program) ReleaseTerminal ¶
ReleaseTerminal restores the original terminal state and cancels the input reader. You can return control to the Program with RestoreTerminal.
func (*Program) RestoreTerminal ¶
RestoreTerminal reinitializes the Program's input reader, restores the terminal to the former state when the program was running, and repaints. Use it to reinitialize a Program after running ReleaseTerminal.
func (*Program) Run ¶
Run initializes the program and runs its event loops, blocking until it gets terminated by either Program.Quit, Program.Kill, or its signal handler. Returns the final model.
func (*Program) Send ¶
Send sends a message to the main update function, effectively allowing messages to be injected from outside the program for interoperability purposes.
If the program hasn't started yet this will be a blocking operation. If the program has already been terminated this will be a no-op, so it's safe to send messages after the program has exited.
func (*Program) SetWindowTitle
deprecated
func (*Program) Start
deprecated
Start initializes the program and runs its event loops, blocking until it gets terminated by either Program.Quit, Program.Kill, or its signal handler.
Deprecated: please use Program.Run instead.
func (*Program) StartReturningModel
deprecated
StartReturningModel initializes the program and runs its event loops, blocking until it gets terminated by either Program.Quit, Program.Kill, or its signal handler. Returns the final model.
Deprecated: please use Program.Run instead.
type ProgramOption ¶
type ProgramOption func(*Program)
ProgramOption is used to set options when initializing a Program. Program can accept a variable number of options.
Example usage:
p := NewProgram(model, WithInput(someInput), WithOutput(someOutput))
func WithANSICompressor
deprecated
func WithANSICompressor() ProgramOption
WithANSICompressor removes redundant ANSI sequences to produce potentially smaller output, at the cost of some processing overhead.
This feature is provisional, and may be changed or removed in a future version of this package.
Deprecated: this incurs a noticable performance hit. A future release will optimize ANSI automatically without the performance penalty.
func WithAltScreen ¶
func WithAltScreen() ProgramOption
WithAltScreen starts the program with the alternate screen buffer enabled (i.e. the program starts in full window mode). Note that the altscreen will be automatically exited when the program quits.
Example:
p := tea.NewProgram(Model{}, tea.WithAltScreen()) if _, err := p.Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) }
To enter the altscreen once the program has already started running use the EnterAltScreen command.
func WithContext ¶
func WithContext(ctx context.Context) ProgramOption
WithContext lets you specify a context in which to run the Program. This is useful if you want to cancel the execution from outside. When a Program gets cancelled it will exit with an error ErrProgramKilled.
func WithEnvironment ¶
func WithEnvironment(env []string) ProgramOption
WithEnvironment sets the environment variables that the program will use. This useful when the program is running in a remote session (e.g. SSH) and you want to pass the environment variables from the remote session to the program.
Example:
var sess ssh.Session // ssh.Session is a type from the github.com/charmbracelet/ssh package pty, _, _ := sess.Pty() environ := append(sess.Environ(), "TERM="+pty.Term) p := tea.NewProgram(model, tea.WithEnvironment(environ)
func WithFPS ¶
func WithFPS(fps int) ProgramOption
WithFPS sets a custom maximum FPS at which the renderer should run. If less than 1, the default value of 60 will be used. If over 120, the FPS will be capped at 120.
func WithFilter ¶
func WithFilter(filter func(Model, Msg) Msg) ProgramOption
WithFilter supplies an event filter that will be invoked before Bubble Tea processes a tea.Msg. The event filter can return any tea.Msg which will then get handled by Bubble Tea instead of the original event. If the event filter returns nil, the event will be ignored and Bubble Tea will not process it.
As an example, this could be used to prevent a program from shutting down if there are unsaved changes.
Example:
func filter(m tea.Model, msg tea.Msg) tea.Msg { if _, ok := msg.(tea.QuitMsg); !ok { return msg } model := m.(myModel) if model.hasChanges { return nil } return msg } p := tea.NewProgram(Model{}, tea.WithFilter(filter)); if _,err := p.Run(); err != nil { fmt.Println("Error running program:", err) os.Exit(1) }
func WithInput ¶
func WithInput(input io.Reader) ProgramOption
WithInput sets the input which, by default, is stdin. In most cases you won't need to use this. To disable input entirely pass nil.
p := NewProgram(model, WithInput(nil))
func WithInputTTY ¶
func WithInputTTY() ProgramOption
WithInputTTY opens a new TTY for input (or console input device on Windows).
func WithMouseAllMotion ¶
func WithMouseAllMotion() ProgramOption
WithMouseAllMotion starts the program with the mouse enabled in "all motion" mode.
EnableMouseAllMotion is a special command that enables mouse click, release, wheel, and motion events, which are delivered regardless of whether a mouse button is pressed, effectively enabling support for hover interactions.
This will try to enable the mouse in extended mode (SGR), if that is not supported by the terminal it will fall back to normal mode (X10).
Many modern terminals support this, but not all. If in doubt, use EnableMouseCellMotion instead.
To enable the mouse once the program has already started running use the EnableMouseAllMotion command. To disable the mouse when the program is running use the DisableMouse command.
The mouse will be automatically disabled when the program exits.
func WithMouseCellMotion ¶
func WithMouseCellMotion() ProgramOption
WithMouseCellMotion starts the program with the mouse enabled in "cell motion" mode.
Cell motion mode enables mouse click, release, and wheel events. Mouse movement events are also captured if a mouse button is pressed (i.e., drag events). Cell motion mode is better supported than all motion mode.
This will try to enable the mouse in extended mode (SGR), if that is not supported by the terminal it will fall back to normal mode (X10).
To enable mouse cell motion once the program has already started running use the EnableMouseCellMotion command. To disable the mouse when the program is running use the DisableMouse command.
The mouse will be automatically disabled when the program exits.
func WithOutput ¶
func WithOutput(output io.Writer) ProgramOption
WithOutput sets the output which, by default, is stdout. In most cases you won't need to use this.
func WithReportFocus ¶
func WithReportFocus() ProgramOption
WithReportFocus enables reporting when the terminal gains and loses focus. When this is enabled FocusMsg and BlurMsg messages will be sent to your Update method.
Note that while most terminals and multiplexers support focus reporting, some do not. Also note that tmux needs to be configured to report focus events.
func WithoutBracketedPaste ¶
func WithoutBracketedPaste() ProgramOption
WithoutBracketedPaste starts the program with bracketed paste disabled.
func WithoutCatchPanics ¶
func WithoutCatchPanics() ProgramOption
WithoutCatchPanics disables the panic catching that Bubble Tea does by default. If panic catching is disabled the terminal will be in a fairly unusable state after a panic because Bubble Tea will not perform its usual cleanup on exit.
func WithoutRenderer ¶
func WithoutRenderer() ProgramOption
WithoutRenderer disables the renderer. When this is set output and log statements will be plainly sent to stdout (or another output if one is set) without any rendering and redrawing logic. In other words, printing and logging will behave the same way it would in a non-TUI commandline tool. This can be useful if you want to use the Bubble Tea framework for a non-TUI application, or to provide an additional non-TUI mode to your Bubble Tea programs. For example, your program could behave like a daemon if output is not a TTY.
func WithoutSignalHandler ¶
func WithoutSignalHandler() ProgramOption
WithoutSignalHandler disables the signal handler that Bubble Tea sets up for Programs. This is useful if you want to handle signals yourself.
func WithoutSignals ¶
func WithoutSignals() ProgramOption
WithoutSignals will ignore OS signals. This is mainly useful for testing.
type QuitMsg ¶
type QuitMsg struct{}
QuitMsg signals that the program should quit. You can send a QuitMsg with Quit.
type ResumeMsg ¶
type ResumeMsg struct{}
ResumeMsg can be listen to to do something once a program is resumed back from a suspend state.
type SuspendMsg ¶
type SuspendMsg struct{}
SuspendMsg signals the program should suspend. This usually happens when ctrl+z is pressed on common programs, but since bubbletea puts the terminal in raw mode, we need to handle it in a per-program basis. You can send this message with Suspend.
type WindowSizeMsg ¶
WindowSizeMsg is used to report the terminal size. It's sent to Update once initially and then on every terminal resize. Note that Windows does not have support for reporting when resizes occur as it does not support the SIGWINCH signal.