Pane.capture
This pane's visible content, one element per line.
Source and package
- Module
- io.github.libtmux.kotlin
- Declared in
- Pane
- Package
- io.github.libtmux:libtmux-kotlin
- Source
- libtmux-kotlin/build/generated/sources/operations/kotlin/io/github/libtmux/kotlin/PaneOperations.kt
- Other languages
- PythonRubyLuaTypeScriptRustGoJavaC#C++SwiftScalaF#
- public Kotlin suspending functions Allows a function to call suspending operations and pause without blocking a thread. It does not start a coroutine by itself. Language documentation fun Pane.capture(): List<String>public Kotlin suspending functions Allows a function to call suspending operations and pause without blocking a thread. It does not start a coroutine by itself. Language documentation fun Pane.capture(spec: Capture
Spec ): List<String> -
Examples#
Send input and wait for output before capturing the pane. Use JDK 25, Git, and tmux 3.2a through 3.7c on Linux, with /bin/cat and /bin/sh available. In an empty directory, fetch the documented library revision:
Terminal window $ git clone https://github.com/libtmux/libtmux-java.git libtmux-source && \git -C libtmux-source checkout f56392b5d9bc7f1f9c1631842333fb90f3d82d40Save this consumer setup as settings.gradle.kts: View source
rootProject.name = "api-example"includeBuild("libtmux-source")Save this consumer setup as build.gradle.kts: View source
plugins {kotlin("jvm") version "2.4.10"application}repositories { mavenCentral() }dependencies {implementation("io.github.libtmux:libtmux-kotlin:0.0.1-alpha.17-SNAPSHOT")}java { toolchain { languageVersion.set(JavaLanguageVersion.of(25)) } }kotlin { jvmToolchain(25) }application { mainClass.set(providers.gradleProperty("exampleMain")) }Save this consumer setup as gradle.properties: View source
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=768m -Dfile.encoding=UTF-8kotlin.daemon.jvmargs=-Xmx2gorg.gradle.workers.max=2Save this launcher as run.sh. It creates and stops a private tmux server, including after program failure. A shutdown failure retains its socket directory and exits unsuccessfully. View source
#!/bin/shset -euif [ "$#" -eq 0 ]; thenprintf 'Usage: sh run.sh program [arguments...]\n' >&2exit 2fibinary=$(command -v "${TMUX_BIN:-tmux}")mkdir -p /tmp/libtmux-java-devdirectory=$(mktemp -d /tmp/libtmux-java-dev/api.XXXXXX)socket="$directory/tmux.sock"config="$directory/tmux.conf"alive() {"$binary" -S "$socket" display-message -p '#{pid}' >/dev/null 2>&1}cleanup() {status=$?trap - 0 HUP INT TERMif alive; thenif ! "$binary" -S "$socket" kill-server; thenprintf 'Cannot stop tmux; kept %s\n' "$directory" >&2exit 1fiattempts=0while alive && [ "$attempts" -lt 100 ]; dosleep 0.05attempts=$((attempts + 1))doneif alive; thenprintf 'tmux is still responding; kept %s\n' "$directory" >&2exit 1fifirm -rf "$directory" || exit 1exit "$status"}trap cleanup 0trap 'exit 1' HUP INT TERMunset TMUX TMUX_PANEprintf 'set-option -g default-shell /bin/sh\n' > "$config""$binary" -S "$socket" -f "$config" new-session -d -s work-one -n editor /bin/cat"$binary" -S "$socket" split-window -h -t '=work-one:editor' /bin/cat"$binary" -S "$socket" new-window -d -t '=work-one' -n logs /bin/cat"$binary" -S "$socket" new-session -d -s work-two -n editor /bin/cat"$@" "$binary" "$socket" "$config""$binary" -S "$socket" has-session -t '=work-one'"$binary" -S "$socket" has-session -t '=work-two'Save this complete program as src/main/kotlin/Capture.kt. It opens an ordinary client for the launcher's server; closing the client releases its transport. View source
package io.github.libtmux.examples.api.kotlinimport io.github.libtmux.ServerConfigimport io.github.libtmux.ServerEndpointimport io.github.libtmux.SessionSpecimport io.github.libtmux.TextOutcomeimport io.github.libtmux.kotlin.*import java.nio.file.Pathimport kotlin.system.exitProcessimport kotlinx.coroutines.runBlockingimport kotlin.time.Duration.Companion.seconds/** Send input and wait for output before capturing the pane. */fun main(args: Array<String>) {try {require(args.size == 3) { "expected: tmux-binary socket-path config-file" }val config = ServerConfig.builder().binary(args[0]).endpoint(ServerEndpoint.socketPath(Path.of(args[1]))).configFile(Path.of(args[2])).build()runBlocking {withServer(config) { server ->val session = server.newSession(SessionSpec.builder().named("api-capture").running("/bin/sh").build())val pane = session.windows.first().panes.first()pane.sendKeys(listOf("printf 'api-%s\\n' keys", "Enter"))check(pane.awaitText("api-keys", timeout = 5.seconds) != TextOutcome.TIMED_OUT) {"timed out waiting for keys output"}pane.sendLine("printf 'api-%s\\n' line")check(pane.awaitText("api-line", timeout = 5.seconds) != TextOutcome.TIMED_OUT) {"timed out waiting for line output"}val lines = pane.capture()for (expected in listOf("api-keys", "api-line")) {check(lines.any { it.trim() == expected }) { "capture is missing $expected" }println(expected)}}}} catch (error: Exception) {if (error is InterruptedException) Thread.currentThread().interrupt()System.err.println("Example failed: ${error.message}")exitProcess(1)}}Build the minimal consumer and run the saved program with the private fixture. An operation or cleanup error makes the command exit unsuccessfully:
Terminal window $ ./libtmux-source/gradlew --project-dir . --console=plain --quiet \installDist -PexampleMain=io.github.libtmux.examples.api.kotlin.CaptureKt && \sh run.sh build/install/api-example/bin/api-exampleExpected output:
api-keysapi-line- Parameters
-
-
spec ( Capture
Spec ) (forcapture(spec))
-
tmux command
capture-paneDiscussed in Coroutines and flows
In other ports Read a pane’s visible contents
- Python
libtmux.Pane.capture_pane - Ruby
LibTmux::Pane#capture - Lua
libtmux.Pane:capture - TypeScript
pane.Pane.capture - Rust
pane.Pane.capture - Go
tmux.Pane.Capture - Java
io.github.libtmux.Pane.capture - C#
LibTmux.Pane.CaptureAsync - C++
libtmux::Pane::capture - Swift
Server.capture(_:includingHistory:) - Scala
io.github.libtmux.scaladsl.Pane.capture - F#
LibTmux.FSharp.Pane.capture