Core LibraryAPI Reference

Choose documentation 1

latest

Current version

latest
English

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

method libtmux-scala latest

Pane.sendKeys

Package io.github.libtmux.scaladsl.Pane.sendKeys io.github.libtmux.scaladsl

Sends an ordered group of key names to this pane, as tmux resolves them.

View as Markdown

Source and package
Module
io.github.libtmux.scaladsl
Declared in
Pane
Package
io.github.libtmux:libtmux-scala_3
Source
libtmux-scala/build/generated/sources/catalog/scala/operations/GeneratedOperations.scala
Other languages
PythonRubyLuaTypeScriptRustGo Java C#C++SwiftKotlin F#
Scala extension methods Adds methods callable on the receiver type without changing its definition. Language documentation (self: Pane) Scala method declarations Declares a method, with its name, parameter lists and return type. Language documentation sendKeys(keys: Vector[String]): Unit Scala extension methods Adds methods callable on the receiver type without changing its definition. Language documentation (self: Pane) Scala method declarations Declares a method, with its name, parameter lists and return type. Language documentation sendKeys(keys: Vector[String], beforeSend: () => Unit): Unit
methodoverload2 overloads [source]

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 f56392b5d9bc7f1f9c1631842333fb90f3d82d40

Save this consumer setup as settings.gradle.kts: View source

rootProject.name = "api-example"
includeBuild("libtmux-source") {
dependencySubstitution {
substitute(module("io.github.libtmux:libtmux-scala_3"))
.using(project(":libtmux-scala"))
}
}

Save this consumer setup as build.gradle.kts: View source

plugins {
scala
application
}
repositories { mavenCentral() }
dependencies {
implementation("io.github.libtmux:libtmux-scala_3:0.0.1-alpha.17-SNAPSHOT")
implementation("org.scala-lang:scala3-library_3:3.9.0")
}
java { toolchain { languageVersion.set(JavaLanguageVersion.of(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-8
kotlin.daemon.jvmargs=-Xmx2g
org.gradle.workers.max=2

Save 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/sh
set -eu
if [ "$#" -eq 0 ]; then
printf 'Usage: sh run.sh program [arguments...]\n' >&2
exit 2
fi
binary=$(command -v "${TMUX_BIN:-tmux}")
mkdir -p /tmp/libtmux-java-dev
directory=$(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 TERM
if alive; then
if ! "$binary" -S "$socket" kill-server; then
printf 'Cannot stop tmux; kept %s\n' "$directory" >&2
exit 1
fi
attempts=0
while alive && [ "$attempts" -lt 100 ]; do
sleep 0.05
attempts=$((attempts + 1))
done
if alive; then
printf 'tmux is still responding; kept %s\n' "$directory" >&2
exit 1
fi
fi
rm -rf "$directory" || exit 1
exit "$status"
}
trap cleanup 0
trap 'exit 1' HUP INT TERM
unset TMUX TMUX_PANE
printf '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/scala/Capture.scala. It opens an ordinary client for the launcher's server; closing the client releases its transport. View source

package io.github.libtmux.examples.api.scaladirect
import io.github.libtmux.{
ServerConfig,
ServerEndpoint,
SessionSpec,
TextOutcome
}
import java.nio.file.Path
import io.github.libtmux.scaladsl.*
import scala.concurrent.duration.*
import scala.util.Using
import scala.util.control.NonFatal
/** Send input and wait for output before capturing the pane. */
object Capture {
def main(args: Array[String]): Unit = {
try {
require(args.length == 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()
Using.resource(Server.open(config)) { server =>
val session = server.newSession(
SessionSpec.builder().named("api-capture").running("/bin/sh").build()
)
val pane = session.windows.head.panes.head
pane.sendKeys(Vector("printf 'api-%s\\n' keys", "Enter"))
require(
!pane.awaitText("api-keys", 5.seconds).equals(TextOutcome.TIMED_OUT),
"timed out waiting for keys output"
)
pane.sendLine("printf 'api-%s\\n' line")
require(
!pane.awaitText("api-line", 5.seconds).equals(TextOutcome.TIMED_OUT),
"timed out waiting for line output"
)
val lines = pane.capture()
Vector("api-keys", "api-line").foreach { expected =>
require(
lines.exists(_.trim.equals(expected)),
"capture is missing " + expected
)
println(expected)
}
}
} catch {
case NonFatal(error) =>
System.err.println("Example failed: " + error.getMessage)
sys.exit(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.scaladirect.Capture && \
sh run.sh build/install/api-example/bin/api-example

Expected output:

api-keys
api-line
Parameters
  • keys ( Vector[String] )

  • beforeSend ( () => Unit ) (for sendKeys(keys, beforeSend))

tmux command send-keys

In other ports Send keystrokes to a pane
Esc

Type to search.