Core Library0.xAPI Reference

Choose documentation 1

latest

Current version

latest
English

Early release libtmux is released, and its APIs may still change between releases. This site's structure and URLs may change too.

attribute libtmux-lua latest

Snapshot.windows

Source and package
Qualified name
libtmux.Snapshot.windows
Module
libtmux
Declared in
Snapshot
Package
libtmux
Source
lua/libtmux/_internal/server.lua
Other languages
Perlmethod Erlangfunction PowerShellcmdlet Juliafunction Elixirfunction Haskell Common Lispfunction PythonRubyTypeScriptRustGoJavaC#C++SwiftKotlinScalaOCamlfunction F#function Clojurefunction

Examples#

List sessions, windows, and panes from one captured server snapshot. Use Lua 5.1 or newer with LuaRocks, tmux 3.3a or newer, and a C compiler and CMake for luv on Linux. In a new directory, install the library and its standalone runtime dependency from LuaRocks:

Terminal window
$ luarocks --tree ./rocks install luv &&
luarocks --tree ./rocks install libtmux &&
eval "$(luarocks --tree ./rocks path)"

Save this complete launcher as run.sh. It starts a private tmux daemon and cleans up after success or failure. A failed daemon shutdown reports and retains its socket directory. View source

#!/bin/sh
set -eu
program=${1:?Pass the complete Lua example filename}
binary=$(command -v "${TMUX_BIN:-tmux}")
case "$binary" in
/*) ;;
*) printf '%s\n' 'tmux must resolve to an absolute path' >&2; exit 1 ;;
esac
# The check that a server stopped connects to its socket, which takes perl.
command -v perl >/dev/null 2>&1 || { printf '%s\n' 'perl is required to confirm that tmux stopped' >&2; exit 1; }
# A socket path must fit sun_path, 104 bytes on macOS. The longest path under
# the directory is the default socket of a program that forgets -S, so a TMPDIR
# that leaves no room for it gives way to /tmp.
root=${TMPDIR:-/tmp}
longest="/libtmux-lua-api.XXXXXX/tmux-$(id -u)/default"
bytes=$(printf '%s%s' "$root" "$longest" | wc -c)
if [ $((bytes)) -gt 100 ]; then
printf '%s\n' 'TMPDIR is too long for a tmux socket path; using /tmp' >&2
root=/tmp
fi
directory=$(mktemp -d "$root/libtmux-lua-api.XXXXXX")
socket="$directory/tmux.sock"
# Succeeds only when a connection to the socket is refused or its path is gone.
# Any other outcome leaves a server unproven stopped, including one that a tmux
# client could not talk to.
gone() {
probed=0
perl -MSocket -e 'socket(my $s, PF_UNIX, SOCK_STREAM, 0) or exit 0;
connect($s, sockaddr_un($ARGV[0])) and exit 0;
exit(($!{ECONNREFUSED} || $!{ENOENT} || $!{ENOTSOCK}) ? 1 : 0)' "$1" || probed=$?
[ "$probed" -eq 1 ]
}
# Stops the server on a socket, then connects until nothing answers: a server
# leaves a moment after kill-server returns. The client runs in the background
# because it waits for a reply, which a server that never answers does not send.
stop() {
"$binary" -S "$1" kill-server >/dev/null 2>&1 &
client=$!
tries=0
until gone "$1"; do
tries=$((tries + 1))
if [ "$tries" -ge 30 ]; then
kill "$client" 2>/dev/null || true
wait "$client" 2>/dev/null || true
return 1
fi
sleep 0.1
done
wait "$client" 2>/dev/null || true
}
cleanup() {
status=$?
trap - 0 HUP INT TERM
kept=0
# A socket anywhere in the directory is a server to stop. Any but the
# launcher's own is one the program started.
sockets=$(find "$directory" -type s 2>/dev/null || true)
while IFS= read -r found; do
[ -n "$found" ] || continue
name=${found#"$directory"/}
if [ "$found" != "$socket" ]; then
printf 'The program left a tmux socket in the run directory: %s\n' "$name" >&2
[ "$status" -ne 0 ] || status=1
fi
if ! stop "$found"; then
printf 'tmux still answers at %s\n' "$name" >&2
kept=1
fi
done <<SOCKETS
$sockets
SOCKETS
if [ "$kept" -ne 0 ]; then
printf 'Cannot stop tmux; kept %s\n' "${directory##*/}" >&2
exit 1
fi
rm -rf "$directory" || exit 1
exit "$status"
}
trap cleanup 0
trap 'exit 1' HUP INT TERM
unset TMUX TMUX_PANE LIBTMUX_SOCKET LIBTMUX_SOCKET_PATH LIBTMUX_SOCKET_NAME
export TMUX_BIN="$binary" TMUX_SOCKET="$socket" TMUX_TMPDIR="$directory" ENV=/dev/null BASH_ENV=/dev/null
"$binary" -S "$socket" -f /dev/null new-session -d -s bootstrap -n bootstrap /bin/cat
"${LUA_BIN:-lua}" "$program"
"$binary" -S "$socket" has-session -t '=bootstrap'

Save the complete program as snapshot.lua. Closing the library connection leaves the daemon running; the launcher owns its lifetime. View source

local adapter = require("libtmux.runtime.luv")
local function must(value, err)
if err ~= nil then
error(tostring(err), 0)
end
return value
end
local binary = assert(os.getenv("TMUX_BIN"), "set TMUX_BIN to an absolute tmux executable")
local socket = assert(os.getenv("TMUX_SOCKET"), "set TMUX_SOCKET to the private socket")
must(adapter.run(function(runtime)
local server = must(runtime:connect({ binary = binary, socket_path = socket }):await())
must(server
:new_session({
name = "demo",
window_name = "main",
argv = { "/bin/cat" },
})
:await())
local snapshot = must(server:snapshot({ strict = true }):await())
local sessions, windows = {}, {}
for _, session in ipairs(snapshot.sessions) do
sessions[#sessions + 1] = session.name
end
for _, window in ipairs(snapshot.windows) do
windows[#windows + 1] = window.name
end
table.sort(sessions)
table.sort(windows)
assert(#snapshot.sessions == 2 and #snapshot.windows == 2 and #snapshot.panes == 2)
print("sessions: " .. table.concat(sessions, ", "))
print("windows: " .. table.concat(windows, ", "))
print("panes: " .. #snapshot.panes)
must(server:close():await())
return true
end))

Run the saved files. Assertions and operation errors produce a failing exit status:

Terminal window
$ eval "$(luarocks --tree ./rocks path)" &&
sh run.sh snapshot.lua

Guides#

Pages that discuss windows.

In other ports#

List the server's windows

Equivalents of List the server's windows in other languages
Language Equivalent
Python libtmux.Server.windows
Ruby LibTmux::Server#list_windows
PowerShell LibTmux\Get-TmuxWindow Use the -Server parameter set to acquire window placements across all sessions.
Julia LibTmux.windows windows with a Snapshot reads every captured physical window. Use windowlinks for session placements.
Erlang tmux_snapshot:windows/1 Returns unique captured physical windows. window_links/1 lists session memberships.
Elixir LibTmux.Snapshot.windows/1 Returns a Selection of every captured physical window. window_links/1 lists session placements.
Haskell No public Haskell equivalent is implemented; the current modules expose scalar values and version parsing.
Common Lisp libtmux:windows windows on a snapshot returns captured physical windows once each.
TypeScript server.Server.windows
Rust server.Server.windows
Go tmux.Server.Windows
Java io.github.libtmux.Server.windows
Clojure libtmux.core/windows! Acquires a new graph and returns its window placements without deduplicating linked windows.
Kotlin io.github.libtmux.kotlin.Server.windows
Scala io.github.libtmux.scaladsl.Server.windows
C# LibTmux.Server.Windows
F# LibTmux.FSharp.Server.windows Builds a deferred query for placements across all sessions. Query.list acquires the results; a linked window appears once for each session placement.
C++ libtmux::Server::windows
Swift Server.windows()
OCaml Libtmux.Snapshot.windows Reads captured global windows; use window_links for indexed session placements.
Perl LibTmux::Snapshot::windows One entry per physical identity. window_links retains all session placements.
Esc

Type to search.

Reference previewOpen reference