Core LibraryalphaTopics

Choose documentation 3

latest

Current version

latest
English

Prerelease This site documents an alpha of libtmux. Its structure, URLs and APIs are subject to change.

Edit this page on GitHub

Waiting and retrying

After sending input or starting a process, wait for the state your next step requires. Pane interaction covers waiting for screen text. This page covers arbitrary conditions and tmux’s named wait-for signal channels.

Polling a condition

Polling checks a condition repeatedly until it succeeds or a deadline expires. Set a deadline and choose an interval that limits unnecessary tmux commands.

Helper: tmuxtest.WaitFor(ctx, interval, condition)

Where it lives: tmuxtest, a separate test-support package from tmux

Examples

tmuxtest.WaitFor probes immediately, then at the requested positive interval. It returns a probe error or context error unchanged. Each probe must read fresh state and honor its context. Session.Windows() only reads a stored snapshot; use Session.SearchWindows to query tmux on every probe.

waitCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
err := tmuxtest.WaitFor(waitCtx, 50*time.Millisecond, func(ctx context.Context) (bool, error) {
windows, err := session.SearchWindows(ctx, nil)
if err != nil {
return false, err
}
for _, w := range windows {
if name, ok := w.Name(); ok && name == "build" {
return true, nil
}
}
return false, nil
})
if err != nil {
return fmt.Errorf("wait for build window: %w", err)
}

tmux’s own wait-for channel

Use tmux wait-for -S <channel> to signal and tmux wait-for <channel> to block until signalled. This avoids repeated screen captures when the command can announce its own completion:

Call Server.WaitFor with a WaitForRequest. Set its mode to WaitForModeSignal to signal the channel; the zero-value mode waits.

if err := server.WaitFor(ctx, tmux.WaitForRequest{
Channel: "built", Mode: tmux.WaitForModeSignal,
}); err != nil {
return err
}
if err := server.WaitFor(ctx, tmux.WaitForRequest{Channel: "built"}); err != nil {
return err
}

tmux remembers a signal sent before a waiter starts. The next wait on that channel returns immediately, so completion is not lost when the command finishes first.

A raw wait-for client can exit zero when the server dies, as well as when the channel is signalled. Verify server liveness when a lost server must be treated as a failed task.

Use a channel name specific to the task. A remembered signal can otherwise satisfy an unrelated later wait.

tmux manual and source

The tmux manual describes completion channels. The channel implementation retains an early signal until a waiter consumes it. Use a fresh channel name for each operation.

Esc

Type to search.

Reference preview Open reference