libtmux 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e121eada829f9816c2d77a1910ae0ff9c473bb10539250a80a732156d7cf2804
4
- data.tar.gz: 725a646a69288b57ec37d9ded5f02444d40ac8968419bf0470706d2d3ec5505d
3
+ metadata.gz: 9c7861118a25d65384377328a89e53c6507e86cb637b3a2031ecb9e8ec143f3b
4
+ data.tar.gz: 7b31dfde49f96cbb624e132669f51243b2fe9a532a59e9aef54de1e68aa9834e
5
5
  SHA512:
6
- metadata.gz: 062be2f34e7a702808bc822350dca3bca1ef456957aab5f0885b069c518ce68b3bcfb3914b758ff1607ed98b25edef72c560e6c28ce79a5ef09ca566389261bd
7
- data.tar.gz: 0f2434316cd39f28f75618aa47b5fe3bb122f1dcec91017d256df182fcd564801602be30c7d84d803a3d4fa829a4af632fab3b5ff315f45f6ba3f29399788236
6
+ metadata.gz: 787ba61c6486d96e3c4545b2ee54cc2218df87cbcee97ba2ec27a9f7c5100a75447299f8f7fbfae80e7654be68126a03fd859d4d27210be6a8e48328302d1555
7
+ data.tar.gz: 1f95dd29c8d83649cedabbe5de990b210115f207484d67942c86a254d504292a7108ff6758555437e1c1b37cefdf769530d5fa0b29a21b6cbb8c29c7e597e89c
data/CHANGELOG.md ADDED
@@ -0,0 +1,89 @@
1
+ # Changelog
2
+
3
+ Notable changes to `libtmux`.
4
+
5
+ Releases are numbered `0.1.N`, and each release increments `N`. The API is not
6
+ settled: pin an exact version to avoid a break.
7
+
8
+ The gems are released together at one version, so every release has a section
9
+ here. Changes that span gems, such as documentation, CI and release tooling, are
10
+ in the [main changelog](../../CHANGELOG.md).
11
+
12
+ ## 0.1.3 (unreleased)
13
+
14
+ ## 0.1.2 (2026-11-04)
15
+
16
+ No entries for `libtmux`.
17
+
18
+ ## 0.1.1 (2026-10-31)
19
+
20
+ - `Window#select_layout` accepts a JSON layout only on tmux 3.8 or newer, and
21
+ raw `select-layout`, including control lines, now refuses one below tmux 3.8
22
+ instead of sending it. The `UnsupportedFeatureError` names tmux 3.8 as the
23
+ minimum; upgrade tmux, or apply a checksummed layout. (#67)
24
+ - **Behavior change:** `Endpoint.new`, `Server.new` and `Server.open` no longer
25
+ need a socket. With no `socket_path:` or `socket_name:`, they pick the socket
26
+ tmux picks when it is given none: the path in `LIBTMUX_SOCKET_PATH`, else the
27
+ name in `LIBTMUX_SOCKET`, else the socket `TMUX` names inside tmux, else
28
+ tmux's default socket. They raised `ArgumentError` before. A program started
29
+ inside tmux that names no socket now reaches that tmux's server; pass
30
+ `socket_name:` or `socket_path:` to keep it off, as a test suite should.
31
+ `Endpoint.from_env` still follows `TMUX` alone. Two edge cases now match
32
+ tmux: an empty `TMUX_TMPDIR` means `/tmp`, where `Endpoint.new(socket_name:)`
33
+ raised, and `Endpoint.from_env` reads `TMUX_TMPDIR` only from the hash it is
34
+ given and ignores a `TMUX` that starts with a comma, where it raised. (#71)
35
+
36
+ ## 0.1.0 (2026-10-25)
37
+
38
+ No entries for `libtmux`.
39
+
40
+ ## 0.1.0.alpha.3 (2026-10-24)
41
+
42
+ ### libtmux
43
+
44
+ - Refuse commands that misbehave on one tmux release before they run: named
45
+ buffer deletion and rename below 3.4, raw `break-pane` and colon or period
46
+ names on exact 3.7, raw `split-window -p` on 3.4, and malformed layouts below
47
+ 3.4. `Pane#break_out` now works on exact 3.7 and for a sole pane. Refusals
48
+ raise `UnsupportedFeatureError`. (#37)
49
+ - Raw `refresh-client -l`, in `Server#run` or a control line, raises
50
+ `UnsupportedFeatureError` below tmux 3.6a. On 3.3a, asking an attached
51
+ terminal for its clipboard stops the server, and on 3.4 through 3.6 the
52
+ server stops when that client leaves before its terminal answers. (#37)
53
+ - Snapshots and the daemon identity check no longer fire `after-display-message`
54
+ hooks. (#37)
55
+ - Record every tmux release gate in one internal registry and emit it as the
56
+ root `capabilities.json` manifest, which the docs site reads for its
57
+ capability pages. `Window#select_layout` raises `UnsupportedFeatureError`,
58
+ not `ArgumentError`, for a JSON layout below tmux 3.8-rc2. (#37)
59
+
60
+ ## 0.1.0.alpha.2 (2026-10-18)
61
+
62
+ ### libtmux
63
+
64
+ - Run on tmux 3.8 and tmux master (`next-3.9`). Snapshots decode metadata
65
+ with line feeds, `select_layout` accepts the JSON layouts that 3.8-rc2 and
66
+ later report, and owned servers start on releases that log more at startup.
67
+ (#36)
68
+ - **Breaking:** `Server.new` now reads the daemon's tmux release and blocks
69
+ for up to `version_timeout:` seconds (default five), so a socket with no
70
+ daemon raises `TargetNotFoundError` at construction instead of at the first
71
+ command. Read the result with the new `Server#tmux_version`. (#36)
72
+
73
+ ## 0.1.0.alpha.1 (2026-09-20)
74
+
75
+ ### libtmux
76
+
77
+ - Create sessions, windows and panes; arrange layouts, send text or keys, and
78
+ capture output through Ruby handles. Manage options, hooks, environment
79
+ values and binary buffers. [Quick start](../../README.md#quick-start).
80
+ - Start a private tmux server with `LibTmux::Server.start`, or borrow an
81
+ existing socket with `Server.open`. Block exit cleans up owned clients;
82
+ borrowed daemons stay running. [Ownership](../../docs/ownership-errors.md).
83
+ - Query immutable snapshots with `where`, `select`, `one`, `one_or_nil` and
84
+ `Enumerable`, without further tmux calls. `WindowLink` addresses a window's
85
+ placement in a session, including repeated links to the same window.
86
+ [Queries](../../examples/list_filter.rb) · [Linked windows](../../examples/window_links.rb).
87
+ - Use command deadlines and cancellation tokens, or subscribe to bounded
88
+ control-mode events with explicit overflow and gap reporting.
89
+ [Execution modes](../../docs/modes.md).
data/README.md CHANGED
@@ -612,8 +612,9 @@ application owns. Require `libtmux/async`, then open a scope with
612
612
  $ gem install libtmux-async
613
613
  ```
614
614
 
615
- Capture every pane concurrently with [`Scope#map`][async-scope-map]. `server`
616
- is an open [`LibTmux::Server`][server]:
615
+ Capture every pane concurrently with [`Scope#map`][async-scope-map]. This
616
+ excerpt uses an open [`LibTmux::Server`][server] and the `Example.check`
617
+ assertion helper from the [complete program](../../examples/async_cancel.rb):
617
618
 
618
619
  <!-- example: async_cancel/map -->
619
620
  ```ruby
@@ -729,14 +730,17 @@ server and lists every option.
729
730
 
730
731
  Releases are numbered `0.1.N`, and each release increments `N`. The API is not
731
732
  settled: any release may change or remove exported identifiers, and the
732
- changelog marks each break. Pin an exact version to avoid one.
733
- See the [changelog](../../CHANGELOG.md).
733
+ changelogs mark each break. Pin an exact version to avoid one.
734
+ See the [changelog](CHANGELOG.md), and the [main
735
+ changelog](https://github.com/libtmux/libtmux-ruby/blob/master/CHANGELOG.md)
736
+ for changes that span gems.
734
737
 
735
738
  - **Ruby 3.3 or newer.** The gem depends on `json`, `tmpdir`, `securerandom`,
736
739
  `fiddle` and `io-console`.
737
740
  - **tmux 3.3a or newer.** Unpatched 3.3 is below the minimum. A
738
741
  [server handle][server] checks the connected daemon's release before it sends
739
- a command, and refuses an older daemon even when its client is newer.
742
+ the requested command, and refuses an older daemon even when its client is
743
+ newer.
740
744
  - **Control connections need tmux 3.7 or newer.** An older daemon refuses
741
745
  [`open_control`][server-open_control] before a control client attaches.
742
746
  Subprocess operations and snapshots do not need it. The
@@ -68,23 +68,34 @@ module LibTmux
68
68
  end
69
69
  end
70
70
 
71
+ # Public methods that send a tmux command line the caller wrote. The
72
+ # command guard reads each line, so a capability it consults can refuse
73
+ # a command through any of them, and only for the command it gates.
74
+ RUN_CHANNELS = %w[
75
+ LibTmux::Server#run LibTmux::Server#run_group LibTmux::Async::Server#run LibTmux::Async::Server#run_group
76
+ ].freeze
77
+ # The control-client channels, which reach a capability only on a tmux
78
+ # that accepts control clients.
79
+ CONTROL_CHANNELS = %w[LibTmux::ControlConnection#exchange LibTmux::Async::ControlConnection#exchange].freeze
80
+
71
81
  CAPABILITIES = [
72
82
  Capability.new(id: "control-mode", name: "Control mode", since: "3.7", handling: :refuse, error: ERROR,
73
83
  summary: "Attach a library-managed control client and stream events.",
74
- apis: ["LibTmux::Server#open_control", "LibTmux::ControlConnection.open"],
84
+ apis: ["LibTmux::Server#open_control", "LibTmux::Async::Server#open_control",
85
+ "LibTmux::ControlConnection.open", "LibTmux::ControlConnection.new"],
75
86
  commands: [Command.new(command: "attach-session")]),
76
87
  Capability.new(id: "buffer-delete-named", name: "Named buffer deletion", since: "3.4", handling: :refuse, error: ERROR,
77
88
  summary: "Delete one paste buffer by name without risking another buffer.",
78
- apis: ["LibTmux::Server#delete_buffer", "LibTmux::Server#run"],
89
+ apis: ["LibTmux::Server#delete_buffer", "LibTmux::Async::Server#delete_buffer", *RUN_CHANNELS],
79
90
  commands: [Command.new(command: "delete-buffer", flags: ["-b"])]),
80
91
  Capability.new(id: "buffer-rename", name: "Buffer rename", since: "3.4", handling: :refuse, error: ERROR,
81
92
  summary: "Rename a paste buffer without risking another buffer.",
82
- apis: ["LibTmux::Server#run"],
93
+ apis: RUN_CHANNELS,
83
94
  commands: [Command.new(command: "set-buffer", flags: ["-b", "-n"])]),
84
95
  Capability.new(id: "layout-without-checksum", name: "Layouts without a checksum", since: "3.4",
85
96
  handling: :refuse, error: ERROR,
86
97
  summary: "Apply a layout string or a named layout that tmux validates before use.",
87
- apis: ["LibTmux::Window#select_layout", "LibTmux::Server#run"],
98
+ apis: ["LibTmux::Window#select_layout", *RUN_CHANNELS],
88
99
  commands: [Command.new(command: "select-layout")]),
89
100
  Capability.new(id: "layout-mirrored-main", name: "Mirrored main layouts", since: "3.5",
90
101
  handling: :refuse, error: ERROR,
@@ -94,11 +105,11 @@ module LibTmux
94
105
  Capability.new(id: "layout-json", name: "JSON layout strings", since: "3.8",
95
106
  handling: :refuse, error: ERROR,
96
107
  summary: "Apply a layout saved in the JSON form tmux reports.",
97
- apis: ["LibTmux::Window#select_layout", "LibTmux::Server#run", "LibTmux::ControlConnection#exchange"],
108
+ apis: ["LibTmux::Window#select_layout", *RUN_CHANNELS, *CONTROL_CHANNELS],
98
109
  commands: [Command.new(command: "select-layout")]),
99
110
  Capability.new(id: "clipboard-query", name: "Clipboard query", since: "3.6a", handling: :refuse, error: ERROR,
100
111
  summary: "Ask an attached client's terminal for its clipboard with refresh-client -l.",
101
- apis: ["LibTmux::Server#run", "LibTmux::ControlConnection#exchange"],
112
+ apis: [*RUN_CHANNELS, *CONTROL_CHANNELS],
102
113
  commands: [Command.new(command: "refresh-client", flags: ["-l"])])
103
114
  ].freeze
104
115
 
@@ -106,18 +117,18 @@ module LibTmux
106
117
  Workaround.new(id: "break-pane-misnames-windows", name: "break-pane window naming", releases: ["3.7"],
107
118
  handling: :repair,
108
119
  summary: "break-pane gets the new window wrong on exactly tmux 3.7; Pane#break_out names it again, and raw break-pane is refused. A nested break-pane is not checked and stops an exact 3.7 daemon: name every one with -n, which avoids the crash while 3.7 still ignores the name, or upgrade to 3.7a.",
109
- apis: ["LibTmux::Pane#break_out", "LibTmux::Server#run", "LibTmux::ControlConnection#exchange"],
120
+ apis: ["LibTmux::Pane#break_out", *RUN_CHANNELS, *CONTROL_CHANNELS],
110
121
  commands: [Command.new(command: "break-pane")]),
111
122
  Workaround.new(id: "split-window-percent-size", name: "split-window -p", releases: ["3.4"],
112
123
  handling: :refuse,
113
124
  summary: "split-window -p is broken on tmux 3.4; use -l N%.",
114
- apis: ["LibTmux::Server#run"],
125
+ apis: RUN_CHANNELS,
115
126
  commands: [Command.new(command: "split-window", flags: ["-p"])]),
116
127
  Workaround.new(id: "name-separators-rejected", name: "Colon and dot in names", releases: ["3.7"],
117
128
  handling: :refuse,
118
129
  summary: "tmux 3.7 rejects ':' and '.' in session and window names; the library refuses them before dispatch, typed or raw.",
119
- apis: ["LibTmux::Server#new_session", "LibTmux::Session#new_window", "LibTmux::Session#rename",
120
- "LibTmux::Window#rename", "LibTmux::Server#run"],
130
+ apis: ["LibTmux::Server#new_session", "LibTmux::Async::Server#new_session", "LibTmux::Session#new_window", "LibTmux::Session#rename",
131
+ "LibTmux::Window#rename", *RUN_CHANNELS],
121
132
  commands: [Command.new(command: "new-session", flags: ["-s"]), Command.new(command: "new-window", flags: ["-n"]),
122
133
  Command.new(command: "rename-session"), Command.new(command: "rename-window")])
123
134
  ].freeze
@@ -30,79 +30,120 @@ module LibTmux
30
30
  # The methods fall into the groups below. A {Session}, {Window}, or {Pane}
31
31
  # carries the operations on that one thing.
32
32
  #
33
- # **Connecting.** {#initialize Server.new} and {Server.open} bind an endpoint
34
- # that already exists; {Server.open} with a block closes the server when the
35
- # block ends. Given no `endpoint:`, `socket_path:` or `socket_name:`, they
36
- # bind the socket {Endpoint#initialize Endpoint.new} picks from
37
- # `LIBTMUX_SOCKET_PATH`, `LIBTMUX_SOCKET`, `TMUX` and tmux's default socket,
38
- # in that order. {Server.start} starts a private daemon instead, creates no
39
- # session, and owns the daemon's exit. {#endpoint} answers the {Endpoint}
40
- # and {#owned?} says whether this server started its daemon. {#diagnostics}
41
- # reports the request and control slots in use, and the limits. {#close}
42
- # retires the server's clients; on an owned server it also stops the daemon.
43
- # {#open_control} opens a {ControlConnection} to a session.
33
+ # **Connecting.** Binding an endpoint that already exists takes the
34
+ # constructor or the open class method, and open with a block closes the
35
+ # server when the block ends. Given no `endpoint:`, `socket_path:` or
36
+ # `socket_name:`, both bind the socket {Endpoint#initialize Endpoint.new}
37
+ # picks from `LIBTMUX_SOCKET_PATH`, `LIBTMUX_SOCKET`, `TMUX` and tmux's
38
+ # default socket, in that order. Starting a private daemon instead creates no
39
+ # session, and the started server owns the daemon's exit. A server answers its
40
+ # {Endpoint} and whether it started its daemon, and reports the request and
41
+ # control slots in use, and the limits. Closing retires the server's clients;
42
+ # on an owned server it also stops the daemon. Open a {ControlConnection} to a
43
+ # session.
44
44
  #
45
- # **Finding one thing.** {#session}, {#window}, {#pane}, and {#window_link}
46
- # wrap an {EntityRef} in a handle without running a command. Take the ref
47
- # from a handle or a snapshot record. A ref of the wrong kind raises
48
- # {TargetNotFoundError}; one whose entity has gone fails at its first
49
- # command.
45
+ # - Bind an endpoint: {#initialize Server.new}, {Server.open}
46
+ # - Start a private daemon: {Server.start}
47
+ # - Read the endpoint: {#endpoint}
48
+ # - Ask whether it started the daemon: {#owned?}
49
+ # - Slots in use and the limits: {#diagnostics}
50
+ # - Retire the clients: {#close}
51
+ # - Open a control connection: {#open_control}
50
52
  #
51
- # **Listing everything.** {#list_sessions}, {#list_windows}, and
52
- # {#list_panes} answer frozen arrays of handles in numeric ID order, and
53
- # {#list_window_links} answers every {WindowLink}. {#list_clients} answers
54
- # one hash per client. {#snapshot} captures the session, window, and pane
55
- # tree, and clients with `clients: true`, as one validated {Snapshot}.
53
+ # **Finding one thing.** Each lookup wraps an {EntityRef} in a handle without
54
+ # running a command. Take the ref from a handle or a snapshot record. A ref of
55
+ # the wrong kind raises {TargetNotFoundError}; one whose entity has gone fails
56
+ # at its first command.
56
57
  #
57
- # **Querying things and getting around.** {#search_panes} filters the panes
58
- # of a snapshot with `where:`, a hash of criteria or a {FilterExpr}, and
59
- # answers a {Selection}; {#explain_panes} answers the plan for a query
60
- # without running tmux. A {Selection} narrows with {Selection#where},
61
- # {Selection#select}, {Selection#filter}, and {Selection#reject}, tests with
62
- # {Selection#exists?}, and takes a single match with {Selection#one}, which
63
- # raises {NoMatchError} or {MultipleMatchesError} otherwise, or
64
- # {Selection#one_or_nil}. Build and compose criteria with
65
- # {FilterExpr.build}, {FilterExpr#and}, {FilterExpr#or}, {FilterExpr#not},
66
- # and {FilterExpr.from_json}.
58
+ # - Handles: {#session}, {#window}, {#pane}, {#window_link}
67
59
  #
68
- # A {Snapshot} answers relational questions without another command:
69
- # {Snapshot#sessions}, {Snapshot#windows}, {Snapshot#panes}, and
70
- # {Snapshot#clients}. Its records follow relations by name: a
71
- # {SessionSnapshot} reaches `windows`, `panes`, and `current_window`, a
72
- # {WindowSnapshot} reaches `panes` and `active_pane`, and a {PaneSnapshot}
73
- # reaches its `window`. {Entity#snapshot} reads one handle back as a record,
74
- # and {CapturedRecord#ref} with {#session}, {#window}, or {#pane} turns a
75
- # record into a handle. Live handles go down one command at a time with
76
- # {Session#list_windows}, {Session#list_panes}, and {Window#list_panes}, and
77
- # back up with {Entity#server}.
60
+ # **Listing everything.** Listing sessions, windows, or panes answers frozen
61
+ # arrays of handles in numeric ID order, and listing window links answers
62
+ # every {WindowLink}. Listing clients answers one hash per client. Taking a
63
+ # snapshot captures the session, window, and pane tree, and clients with
64
+ # `clients: true`, as one validated {Snapshot}.
78
65
  #
79
- # **Changing things.** {#new_session} starts a detached session running
66
+ # - Handles: {#list_sessions}, {#list_windows}, {#list_panes}
67
+ # - Window links: {#list_window_links}
68
+ # - Clients: {#list_clients}
69
+ # - One snapshot: {#snapshot}
70
+ #
71
+ # **Querying things and getting around.** A pane search filters the panes of a
72
+ # snapshot with `where:`, a hash of criteria or a {FilterExpr}, and answers a
73
+ # {Selection}; explaining a search answers the plan for a query without
74
+ # running tmux. A {Selection} narrows, tests whether anything matches, and
75
+ # takes a single match, raising {NoMatchError} or {MultipleMatchesError}
76
+ # otherwise, or takes one or nil. Build and compose criteria with
77
+ # {FilterExpr}. A {Snapshot} answers relational questions without another
78
+ # command. Its records follow relations by name: a {SessionSnapshot} reaches
79
+ # `windows`, `panes`, and `current_window`, a {WindowSnapshot} reaches `panes`
80
+ # and `active_pane`, and a {PaneSnapshot} reaches its `window`. A handle reads
81
+ # back as a record, and a record turns into a handle through its ref and the
82
+ # server's lookups. Live handles go down one command at a time and back up
83
+ # through the server.
84
+ #
85
+ # - Search the panes of a snapshot: {#search_panes}
86
+ # - Explain a search without running tmux: {#explain_panes}
87
+ # - Narrow: {Selection#where}, {Selection#select}, {Selection#filter},
88
+ # {Selection#reject}
89
+ # - Test: {Selection#exists?}
90
+ # - Take one: {Selection#one}
91
+ # - Take one or nil: {Selection#one_or_nil}
92
+ # - Build criteria: {FilterExpr.build}, {FilterExpr.from_json}
93
+ # - Compose criteria: {FilterExpr#and}, {FilterExpr#or}, {FilterExpr#not}
94
+ # - Read a snapshot's records: {Snapshot#sessions}, {Snapshot#windows},
95
+ # {Snapshot#panes}, {Snapshot#clients}
96
+ # - Read a handle back as a record: {Entity#snapshot}
97
+ # - Turn a record into a handle: {CapturedRecord#ref}, {#session}, {#window},
98
+ # {#pane}
99
+ # - Down: {Session#list_windows}, {Session#list_panes}, {Window#list_panes}
100
+ # - Up: {Entity#server}
101
+ #
102
+ # **Changing things.** Creating a session starts it detached, running
80
103
  # `command:`, an argv array rather than a shell string, and answers the
81
- # {Session} or, with `receipt: true`, a {CreationReceipt}. {#kill} stops the
82
- # tmux server, which {#close} does only for an owned server.
83
- # {#switch_client} points the client named by `client:` at a session.
104
+ # {Session} or, with `receipt: true`, a {CreationReceipt}. Kill stops the tmux
105
+ # server, which closing does only for an owned server. Switching a client
106
+ # points the client named by `client:` at a session.
107
+ #
108
+ # - Create a session: {#new_session}
109
+ # - Stop the tmux server: {#kill}
110
+ # - Point a client at a session: {#switch_client}
84
111
  #
85
- # **Options and hooks.** {#options} answers {Options} at server scope, or at
86
- # the global session or window scope. {#hooks} answers {Hooks} at the global
87
- # session or window scope. {#environment}, {#set_environment}, and
88
- # {#unset_environment} read, set, and unset one variable in the server's
89
- # global environment.
112
+ # **Options and hooks.** Ask for {Options} at server scope, or at the global
113
+ # session or window scope, and for {Hooks} at the global session or window
114
+ # scope. Read, set, and unset one variable in the server's global environment.
90
115
  #
91
- # **Everything else tmux keeps.** Paste buffers: {#list_buffers},
92
- # {#read_buffer}, {#write_buffer}, and {#delete_buffer}. {#source_file}
93
- # loads a configuration file. {#display} expands a tmux format; the argument
94
- # is a format, not literal text. {#wait_for} waits on, signals, locks, or
95
- # unlocks a channel, as `action:` says.
116
+ # - Options: {#options}
117
+ # - Hooks: {#hooks}
118
+ # - Read a variable: {#environment}
119
+ # - Set a variable: {#set_environment}
120
+ # - Unset a variable: {#unset_environment}
96
121
  #
97
- # **Things that need a terminal.** {#attach} runs an interactive client on a
122
+ # **Everything else tmux keeps.** List, read, write, and delete paste buffers.
123
+ # Load a configuration file. Display expands a tmux format; the argument is a
124
+ # format, not literal text. Wait on, signal, lock, or unlock a channel, as
125
+ # `action:` says.
126
+ #
127
+ # - Paste buffers: {#list_buffers}, {#read_buffer}, {#write_buffer},
128
+ # {#delete_buffer}
129
+ # - Load a configuration file: {#source_file}
130
+ # - Expand a format: {#display}
131
+ # - Wait on a channel: {#wait_for}
132
+ #
133
+ # **Things that need a terminal.** Attaching runs an interactive client on a
98
134
  # TTY the caller supplies and keeps, blocks until that client exits, and
99
- # answers a {TerminalResult}. Cancelling detaches the client and does not
100
- # stop pane commands.
135
+ # answers a {TerminalResult}. Cancelling detaches the client and does not stop
136
+ # pane commands.
137
+ #
138
+ # - Attach a client: {#attach}
139
+ #
140
+ # **Running a command.** Anything else tmux can do is reachable by running one
141
+ # command, which takes an argv array and keeps tmux's separators and format
142
+ # semantics, or by running several in one tmux invocation. A {GroupResult}
143
+ # cannot attribute the client's final status to a single step.
101
144
  #
102
- # Anything else tmux can do is reachable through {#run}, which runs one
103
- # command from an argv array and keeps tmux's separators and format
104
- # semantics, or {#run_group}, which runs several in one tmux invocation. A
105
- # {GroupResult} cannot attribute the client's final status to a single step.
145
+ # - Run one command: {#run}
146
+ # - Run several in one invocation: {#run_group}
106
147
  class Server
107
148
  attr_reader :endpoint
108
149
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LibTmux
4
- VERSION = "0.1.1"
4
+ VERSION = "0.1.2"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libtmux
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - libtmux contributors
@@ -85,6 +85,7 @@ executables: []
85
85
  extensions: []
86
86
  extra_rdoc_files: []
87
87
  files:
88
+ - CHANGELOG.md
88
89
  - LICENSE
89
90
  - README.md
90
91
  - assets/logo.png
@@ -131,7 +132,8 @@ licenses:
131
132
  - MIT
132
133
  metadata:
133
134
  source_code_uri: https://github.com/libtmux/libtmux-ruby
134
- documentation_uri: https://libtmux.org/en/ruby/v0.1.1/
135
+ changelog_uri: https://github.com/libtmux/libtmux-ruby/blob/master/gems/libtmux/CHANGELOG.md
136
+ documentation_uri: https://libtmux.org/en/ruby/v0.1.2/
135
137
  rdoc_options: []
136
138
  require_paths:
137
139
  - lib