diff --git a/tests/fixtures/workspacebuilder/first_pane_start_directory.yaml b/tests/fixtures/workspacebuilder/first_pane_start_directory.yaml new file mode 100644 index 00000000000..c45ed9059f8 --- /dev/null +++ b/tests/fixtures/workspacebuilder/first_pane_start_directory.yaml @@ -0,0 +1,5 @@ +session_name: sampleconfig +windows: + - panes: + - start_directory: /usr + - start_directory: /etc diff --git a/tests/test_workspacebuilder.py b/tests/test_workspacebuilder.py index 223c47bddb0..8968fff4bcd 100644 --- a/tests/test_workspacebuilder.py +++ b/tests/test_workspacebuilder.py @@ -1154,3 +1154,32 @@ def test_load_workspace_sleep( time.sleep(0.1) captured_pane = "\n".join(pane.capture_pane()) assert output in captured_pane + + +def test_first_pane_start_directory(session, tmp_path: pathlib.Path): + yaml_config = test_utils.read_config_file( + "workspacebuilder/first_pane_start_directory.yaml" + ) + + sconfig = kaptan.Kaptan(handler="yaml") + sconfig = sconfig.import_config(str(yaml_config)).get() + sconfig = config.expand(sconfig) + sconfig = config.trickle(sconfig) + + builder = WorkspaceBuilder(sconf=sconfig) + builder.build(session=session) + + assert session == builder.session + dirs = ["/usr", "/etc"] + + assert session.windows + window = session.windows[0] + for path, p in zip(dirs, window.panes): + + def f(): + p.server._update_panes() + pane_path = p.current_path + return path in pane_path or pane_path == path + + # handle case with OS X adding /private/ to /tmp/ paths + assert retry_until(f) diff --git a/tmuxp/workspacebuilder.py b/tmuxp/workspacebuilder.py index 4f085b1e15a..ca346caa476 100644 --- a/tmuxp/workspacebuilder.py +++ b/tmuxp/workspacebuilder.py @@ -261,6 +261,11 @@ def iter_create_windows(self, session, append=False): else: sd = None + # If the first pane specifies a start_directory, use that instead. + panes = wconf["panes"] + if panes and "start_directory" in panes[0]: + sd = panes[0]["start_directory"] + if "window_shell" in wconf: ws = wconf["window_shell"] else: