# Pane interaction

Source: https://libtmux.org/en/csharp/latest/topics/pane-interaction/

> Input defaults, screen capture, and waiting for a command to finish.

Send input to a pane and capture its screen to interact with a running program.
[Attach and send keys](https://libtmux.org/en/csharp/latest/examples/attach-and-send-keys/) provides examples.
[Sending keys](https://libtmux.org/en/csharp/latest/guides/sending-keys/) and [Capturing
output](https://libtmux.org/en/csharp/latest/guides/capturing-output/) are task guides; this page covers input
defaults, capture ranges, and completion handling.

## Typing into a pane

Two questions come up every time you send something to a pane: should tmux
press Enter afterward, and should tmux interpret what you sent as key names
([`Enter`](<https://libtmux.org/en/csharp/latest/reference/libtmux-sendkeysrequest-enter/>), `C-c`) rather than literal characters? Choose both explicitly when
a command depends on them.

**Type without Enter:** [`SendKeysAsync(new SendKeysRequest(text, enter: false))`](<https://libtmux.org/en/csharp/latest/reference/libtmux-pane-sendkeysasync/>)

**Type + Enter (default):** [`SendTextAsync(text)`](<https://libtmux.org/en/csharp/latest/reference/libtmux-pane-sendtextasync/>) (defaults `enter: true`)

**How "literal" is chosen:** [`SendKeysRequest.Literal`](<https://libtmux.org/en/csharp/latest/reference/libtmux-sendkeysrequest-literal/>) field;
[`SendTextAsync`](<https://libtmux.org/en/csharp/latest/reference/libtmux-pane-sendtextasync/>) hardcodes it

### Examples

Text and Enter can be separate tmux commands. If the second operation fails,
the text may already be in the pane. Check the current state before retrying;
repeating the whole request can duplicate input.

Send a command line and press Enter:

```csharp
await pane.SendKeysAsync(new SendKeysRequest("echo hi", enter: false));
await pane.SendTextAsync("echo hi"); // defaults enter: true
```

## Reading a pane back

Capture reads the pane's visible screen by default. Request scrollback when
you need earlier output. A capture is a snapshot of terminal contents, including
any input echoed by the application.

```csharp
await pane.CaptureAsync();
```

## Waiting for something to finish

A send call completes when input reaches tmux. It does not wait for the shell
command to finish. Wait for expected output or a completion signal.

Use [`TmuxWaitChannel`](<https://libtmux.org/en/csharp/latest/reference/libtmux-tmuxwaitchannel/>) when the command can signal a named tmux `wait-for`
channel. Use a cancellation token to bound the wait.

[Capture pane output](https://libtmux.org/en/csharp/latest/examples/capture-pane-output/) shows capture and waiting
examples. [Waiting and retrying](https://libtmux.org/en/csharp/latest/topics/waiting-and-retry/) explains completion
conditions and timeouts.

<details>
<summary>tmux manual and source</summary>

The tmux manual defines [key-name and literal input](https://github.com/tmux/tmux/blob/94796f6b1182507efac8a272fc309a79e22e58a5/tmux.1#L4457)
and [screen and history capture](https://github.com/tmux/tmux/blob/94796f6b1182507efac8a272fc309a79e22e58a5/tmux.1#L2798).
A send operation delivers input; it does not establish the program's exit status.

</details>
