Skip to content

Commit 6eabe5e

Browse files
authored
Merge pull request #235 from sebastianst/feat-options_after
Implement `options_after` window option
2 parents 7b4f626 + 648171d commit 6eabe5e

File tree

6 files changed

+108
-0
lines changed

6 files changed

+108
-0
lines changed

doc/examples.rst

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,25 @@ JSON
301301
.. literalinclude:: ../examples/options.json
302302
:language: json
303303

304+
Set window options after pane creation
305+
--------------------------------------
306+
307+
Apply window options after panes have been created. Useful for
308+
``synchronize-panes`` option after executing individual commands in each
309+
pane during creation.
310+
311+
YAML
312+
~~~~
313+
314+
.. literalinclude:: ../examples/2-pane-synchronized.yaml
315+
:language: yaml
316+
317+
JSON
318+
~~~~
319+
320+
.. literalinclude:: ../examples/2-pane-synchronized.json
321+
:language: json
322+
304323
Main pane height
305324
----------------
306325

examples/2-pane-synchronized.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"session_name": "2-pane-synchronized",
3+
"windows": [
4+
{
5+
"window_name": "Two synchronized panes",
6+
"panes": [
7+
"ssh server1",
8+
"ssh server2"
9+
],
10+
"options_after": {
11+
"synchronize-panes": true
12+
}
13+
}
14+
]
15+
}

examples/2-pane-synchronized.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
session_name: 2-pane-synchronized
2+
windows:
3+
- window_name: Two synchronized panes
4+
panes:
5+
- ssh server1
6+
- ssh server2
7+
options_after:
8+
synchronize-panes: on
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
session_name: tmuxp test window_options_after
2+
options:
3+
default-shell: /bin/bash
4+
windows:
5+
- window_name: test
6+
suppress_history: false
7+
panes:
8+
- echo 0
9+
- echo 1
10+
options_after:
11+
synchronize-panes: on

tests/test_workspacebuilder.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,51 @@ def test_window_options(session):
259259
w.select_layout(wconf['layout'])
260260

261261

262+
@pytest.mark.flaky(reruns=5)
263+
def test_window_options_after(session):
264+
yaml_config = loadfixture("workspacebuilder/window_options_after.yaml")
265+
s = session
266+
sconfig = kaptan.Kaptan(handler='yaml')
267+
sconfig = sconfig.import_config(yaml_config).get()
268+
sconfig = config.expand(sconfig)
269+
270+
builder = WorkspaceBuilder(sconf=sconfig)
271+
builder.build(session=session)
272+
273+
def assert_last_line(p, s):
274+
correct = False
275+
for _ in range(10):
276+
pane_out = p.cmd('capture-pane', '-p', '-J').stdout
277+
# delete trailing empty lines for tmux 1.8...
278+
while not pane_out[-1].strip(): pane_out.pop()
279+
if len(pane_out) > 1 and pane_out[-2].strip() == s:
280+
correct = True
281+
break
282+
283+
time.sleep(0.1)
284+
285+
# Print output for easier debugging if assertion fails
286+
if not correct:
287+
print('\n'.join(pane_out))
288+
289+
return correct
290+
291+
for i, pane in enumerate(session.attached_window.panes):
292+
assert assert_last_line(pane, str(i)), \
293+
"Initial command did not execute properly/" + str(i)
294+
pane.cmd('send-keys', 'Up') # Will repeat echo
295+
pane.enter() # in each iteration
296+
assert assert_last_line(pane, str(i)), \
297+
"Repeated command did not execute properly/" + str(i)
298+
299+
session.cmd('send-keys', ' echo moo')
300+
session.cmd('send-keys', 'Enter')
301+
302+
for pane in session.attached_window.panes:
303+
assert assert_last_line(pane, 'moo'), \
304+
"Synchronized command did not execute properly"
305+
306+
262307
def test_window_shell(session):
263308
yaml_config = loadfixture("workspacebuilder/window_shell.yaml")
264309
s = session

tmuxp/workspacebuilder.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,8 @@ def build(self, session=None):
188188
if 'focus' in wconf and wconf['focus']:
189189
focus = w
190190

191+
self.config_after_window(w, wconf)
192+
191193
if focus_pane:
192194
focus_pane.select_pane()
193195

@@ -308,6 +310,14 @@ def get_pane_start_directory():
308310

309311
yield p, pconf
310312

313+
"""
314+
Applies window configurations relevant after window and pane creation.
315+
"""
316+
def config_after_window(self, w, wconf):
317+
if 'options_after' in wconf and isinstance(wconf['options_after'], dict):
318+
for key, val in wconf['options_after'].items():
319+
w.set_window_option(key, val)
320+
311321

312322
def freeze(session):
313323
"""Freeze live tmux session and Return session config :py:obj:`dict`.

0 commit comments

Comments
 (0)