When creating a new window/tab with the same cwd as the current window automatically put the newwindow into the same session as the current window

This commit is contained in:
Kovid Goyal
2025-08-23 13:24:48 +05:30
parent d3c46a829d
commit e176b723f5
6 changed files with 59 additions and 16 deletions

View File

@@ -187,12 +187,13 @@ Making newly created windows join an existing session
Normally, after activating a session, if you create new windows/tabs Normally, after activating a session, if you create new windows/tabs
they don't belong to the session. If you would prefer to have them belong they don't belong to the session. If you would prefer to have them belong
to the currently active session, you can use the :option:`launch --add-to-session` to the currently active session, you can use the :ac:`new_window_with_cwd`
option, like this: and :ac:`new_tab_with_cwd` actions instead, like this::
map kitty_mod+enter launch --add-to-session=. map kitty_mod+enter new_window_with_cwd
map kitty_mod+t new_tab_with_cwd
This will cause newly created windows to belong to the currently active This will cause newly created windows and tabs to belong to the currently active
session, if any. Note that adding a window to a session in this way is session, if any. Note that adding a window to a session in this way is
temporary, it does not edit the session file. If you wish to update the temporary, it does not edit the session file. If you wish to update the
session file of the currently active session, you can use the following session file of the currently active session, you can use the following
@@ -201,6 +202,9 @@ mapping for it::
map f5 save_as_session --relocatable --use-foreground-process --match=session:. . map f5 save_as_session --relocatable --use-foreground-process --match=session:. .
The two can be combined, using the :ac:`combine` action. The two can be combined, using the :ac:`combine` action.
For even more control of what session a window is added to use
the :doc:`launch <launch>` command with the :option:`launch --add-to-session`
flag.
Sessions with remote connections Sessions with remote connections

View File

@@ -644,7 +644,14 @@ class Boss:
else: else:
sw = self.args_to_special_window(args, cwd_from) if args else None sw = self.args_to_special_window(args, cwd_from) if args else None
startup_session = next(create_sessions(get_options(), special_window=sw, cwd_from=cwd_from)) startup_session = next(create_sessions(get_options(), special_window=sw, cwd_from=cwd_from))
return self.add_os_window(startup_session) startup_session.session_name = ''
ans = self.add_os_window(startup_session)
if cwd_from is not None and (sow := cwd_from.window) and (tm := self.os_window_map.get(ans)) and sow.created_in_session_name:
for tab in tm:
tab.created_in_session_name = sow.created_in_session_name
for w in tab:
w.created_in_session_name = sow.created_in_session_name
return ans
@ac('win', 'New OS Window') @ac('win', 'New OS Window')
def new_os_window(self, *args: str) -> None: def new_os_window(self, *args: str) -> None:
@@ -2758,11 +2765,14 @@ class Boss:
args = args[1:] args = args[1:]
allow_remote_control = True allow_remote_control = True
if args: if args:
return tab.new_special_window( w = tab.new_special_window(
self.args_to_special_window(args, cwd_from=cwd_from), self.args_to_special_window(args, cwd_from=cwd_from),
location=location, allow_remote_control=allow_remote_control) location=location, allow_remote_control=allow_remote_control)
else: else:
return tab.new_window(cwd_from=cwd_from, location=location, allow_remote_control=allow_remote_control) w = tab.new_window(cwd_from=cwd_from, location=location, allow_remote_control=allow_remote_control)
if cwd_from is not None and (sw := cwd_from.window):
w.created_in_session_name = sw.created_in_session_name
return w
@ac('win', 'Create a new window') @ac('win', 'Create a new window')
def new_window(self, *args: str) -> None: def new_window(self, *args: str) -> None:

View File

@@ -26,6 +26,7 @@ class LaunchSpec(NamedTuple):
args: list[str] args: list[str]
# Options definition {{{
env_docs = '''\ env_docs = '''\
type=list type=list
Environment variables to set in the child process. Can be specified multiple Environment variables to set in the child process. Can be specified multiple
@@ -148,10 +149,13 @@ flag to prevent the new window from closing when the connection is terminated.
--add-to-session --add-to-session
Add the newly created window/tab to the specified session. Use :code:`.` to add Add the newly created window/tab to the specified session. Use :code:`.` to add
to the currently active session, if any. See :ref:`sessions` to the session of the :option:`source window <launch --source-window>`, if any. See :ref:`sessions`
for what a session is and how to use one. Adding a newly created window to a session for what a session is and how to use one. By default, the window is added to the
is purely temporary, it does not change the actual session file, for that you have session of the :option:`source window <launch --source-window>` when :option:`launch --cwd`
to resave the session. Note that using this flag in a launch is set to use the the working directory from that window, otherwise the newly created window
does not belong to any session. To force adding to no session, use the value :code:`!`.
Adding a newly created window to a session is purely temporary, it does not change the actual
session file, for that you have to resave the session. Note that using this flag in a launch
command within a session file has no effect as the window is always added to the command within a session file has no effect as the window is always added to the
session belonging to that file. session belonging to that file.
@@ -415,6 +419,7 @@ When using :option:`--cwd`:code:`=current` or similar from a window that is runn
the new window will run a local shell after disconnecting from the remote host, when this option the new window will run a local shell after disconnecting from the remote host, when this option
is specified. is specified.
""" """
# }}}
def parse_launch_args(args: Sequence[str] | None = None) -> LaunchSpec: def parse_launch_args(args: Sequence[str] | None = None) -> LaunchSpec:
@@ -781,8 +786,14 @@ def _launch(
child_death_callback(0, None) child_death_callback(0, None)
else: else:
add_to_session = opts.add_to_session or '' add_to_session = opts.add_to_session or ''
if add_to_session == '.': match add_to_session:
add_to_session = boss.active_session case '.':
add_to_session = source_window.created_in_session_name if source_window else ''
case '!':
add_to_session = ''
case '':
if kw['cwd_from'] is not None and source_window:
add_to_session = source_window.created_in_session_name
kw['hold'] = opts.hold kw['hold'] = opts.hold
if force_target_tab and target_tab is not None: if force_target_tab and target_tab is not None:
tab = target_tab tab = target_tab

View File

@@ -1473,6 +1473,8 @@ use :code:`{sup.index}`. All data available is:
The current layout name. The current layout name.
:code:`session_name` :code:`session_name`
The name of the kitty session file from which this tab was created, if any. The name of the kitty session file from which this tab was created, if any.
:code:`active_session_name`
The name of the kitty session file from which the active window in this tab was created, if any.
:code:`num_windows` :code:`num_windows`
The number of windows in the tab. The number of windows in the tab.
:code:`num_window_groups` :code:`num_window_groups`

View File

@@ -52,6 +52,7 @@ class TabBarData(NamedTuple):
total_progress: int total_progress: int
last_focused_window_with_progress_id: int last_focused_window_with_progress_id: int
session_name: str session_name: str
active_session_name: str
class DrawData(NamedTuple): class DrawData(NamedTuple):
@@ -278,6 +279,8 @@ def draw_title(draw_data: DrawData, screen: Screen, tab: TabBarData, index: int,
eval_locals = { eval_locals = {
'index': index, 'index': index,
'layout_name': tab.layout_name, 'layout_name': tab.layout_name,
'session_name': tab.session_name,
'active_session_name': tab.active_session_name,
'num_windows': tab.num_windows, 'num_windows': tab.num_windows,
'num_window_groups': tab.num_window_groups, 'num_window_groups': tab.num_window_groups,
'title': tab.title, 'title': tab.title,

View File

@@ -977,6 +977,11 @@ class Tab: # {{{
def num_window_groups(self) -> int: def num_window_groups(self) -> int:
return self.windows.num_groups return self.windows.num_groups
@property
def active_session_name(self) -> str:
w = self.active_window
return '' if w is None else w.created_in_session_name
def __contains__(self, window: Window) -> bool: def __contains__(self, window: Window) -> bool:
return window in self.windows return window in self.windows
@@ -1297,11 +1302,19 @@ class TabManager: # {{{
cwd_from: CwdRequest | None = None, cwd_from: CwdRequest | None = None,
as_neighbor: bool = False, as_neighbor: bool = False,
empty_tab: bool = False, empty_tab: bool = False,
location: str = 'last' location: str = 'last',
) -> Tab: ) -> Tab:
idx = len(self.tabs) idx = len(self.tabs)
orig_active_tab_idx = self.active_tab_idx orig_active_tab_idx = self.active_tab_idx
self._add_tab(Tab(self, no_initial_window=True) if empty_tab else Tab(self, special_window=special_window, cwd_from=cwd_from)) session_name = ''
if cwd_from is not None and (sw := cwd_from.window):
session_name = sw.created_in_session_name
t = Tab(self, no_initial_window=True, session_name=session_name) if empty_tab else Tab(
self, special_window=special_window, cwd_from=cwd_from, session_name=session_name)
if not empty_tab and session_name:
for w in t:
w.created_in_session_name = session_name
self._add_tab(t)
if as_neighbor: if as_neighbor:
location = 'after' location = 'after'
if location == 'neighbor': if location == 'neighbor':
@@ -1392,7 +1405,7 @@ class TabManager: # {{{
has_activity_since_last_focus, t.active_fg, t.active_bg, has_activity_since_last_focus, t.active_fg, t.active_bg,
t.inactive_fg, t.inactive_bg, t.num_of_windows_with_progress, t.inactive_fg, t.inactive_bg, t.num_of_windows_with_progress,
t.total_progress, t.last_focused_window_with_progress_id, t.total_progress, t.last_focused_window_with_progress_id,
t.created_in_session_name, t.created_in_session_name, t.active_session_name,
)) ))
return ans return ans