Skip to content

Instantly share code, notes, and snippets.

@n-WN
Created December 23, 2025 09:51
Show Gist options
  • Select an option

  • Save n-WN/9d35176e3b5ebf09194a19cfe6899232 to your computer and use it in GitHub Desktop.

Select an option

Save n-WN/9d35176e3b5ebf09194a19cfe6899232 to your computer and use it in GitHub Desktop.
Kitty 会话/恢复/自动保存:调研与实现思路

Kitty 会话/恢复/自动保存:调研与实现思路

目标:回答「kitty 终端的日志在哪、如何恢复此前会话」并进一步调研社区/官方方案,给出可实现的“自动保存 + 恢复工作现场”的设计。

结论(先说人话)

  • Kitty 默认不会把终端输出持久化为“日志文件”;窗口关闭后 scrollback 也会丢失(除非你自己导出/录制)。
  • Kitty 的 session 本质是“重建布局 + 重跑命令”:能恢复 tabs/windows/layout/cwd/要启动的程序,但不能做到 tmux-resurrect 那种“进程不断、断线重连”
  • 避免误关导致任务中断:官方建议用 confirm_os_window_close(见 issue #5448 回复)。

1) 日志(log)与“历史”分别是什么

1.1 终端输出日志

  • Kitty 没有默认的 per-window 输出日志落盘。
  • 可替代方案:
    • script -q ~/terminal.log 录制整段交互
    • command | tee -a ~/terminal.log 记录单条命令输出
    • Kitty remote control 导出:kitty @ get-text --extent all(可导出 scrollback 文本)

1.2 命令历史

  • 命令历史一般在 shell(如 zsh ~/.zsh_history)。

2) Kitty 原生 Sessions 能力边界

官方 Sessions 文档:

2.1 Session 文件做什么

  • Session 是一个文本文件,描述:OS Window、tab、window、layout、cwd、要运行的命令等。
  • 常见关键字:new_os_window / new_tab / layout / cd / launch --title ... / focus / os_window_size 等。
  • 启动:kitty --session /path/to/file.kitty-sessionstartup_session

2.2 会话切换(单进程多会话)

  • goto_session 可绑定快捷键:在同一 kitty 进程内“跳转/加载”不同 session。
  • tab_title_template 可显示 {session_name}

2.3 保存当前状态为 session

  • save_as_session action 能把当前打开的 OS windows/tabs/windows/程序/cwd 等保存成 session 文件。
  • 关键参数:
    • --save-only:仅保存不打开编辑器
    • --relocatable:cwd 用相对路径(以 session 文件所在目录为基准)
    • --match=session:.:只保存当前活动 session 内的窗口
    • --use-foreground-process:把“shell 里当前前台进程”也写进 session(风险:如果你正在跑危险命令,恢复时会重跑)

2.4 把新开的 tab/window 也“归属到当前 session”

  • 文档建议用 new_tab_with_cwd / new_window_with_cwd,或 launch --add-to-session=.
  • 归属只是运行时概念,不会自动改写 session 文件;需要再 save_as_session --match=session:. . 更新。

2.5 “session 作为新 tab 加入现有窗口?”

  • 直接 kitty --session 通常会开新 OS window。
  • 讨论 #4348 提到:可以用 remote control / combine + launch --type tab 的方式拼装;或写自定义 kitten。
  • kovidgoyal/kitty#4348

3) 官方对“自动保存/恢复”诉求的态度

  • issue #5448:请求类似 tmux-resurrect(自动保存并复活)。维护者回复:duplicate of #1197,并建议误关用 confirm_os_window_close 1
  • issue #5991:同样诉求,被标记 dup #1197。
  • #1197(长期 open):最早是 macOS “系统恢复应用窗口状态”类诉求。

补充:2025 年 RFC #8911 说明 save_as_session/goto_session 相关功能在 master/nightly 中推进,并给出了推荐 keymap。

4) 第三方工具观察

4.1 monoira/kitty-tabs

4.2 dflock/kitty-save-session

  • https://github.com/dflock/kitty-save-session
  • 思路:kitty @ ls 导出 JSON → 脚本生成 session 文件 → kitty --session 恢复。
  • 亮点:提供批量保存/恢复多个 kitty 实例的脚本;要求配置 remote control socket(allow_remote_control + listen_on)。
  • 限制:OS window size 不恢复;环境变量复制可能脆弱(可 --no-copy-env)。

4.3 kitty-sesh(reddit 帖子提到的项目)

4.4 FOSSUnited hack 页面

5) 我会如何实现“自动保存 + 恢复工作现场”

目标不做“进程不断”,而是做到:崩溃/误关后能快速恢复布局、目录、命令、编辑器等(重跑)。

5.1 原则:优先调用 kitty 自带 save_as_session

  • 不建议自己解析 kitty @ ls 再拼 session:容易遗漏 kitty 内部的 set_layout_state 等细节。
  • 更稳的做法是远程控制直接触发 action:
    • kitty @ action "save_as_session --save-only ..."

5.2 远程控制前置配置

kitty.conf

  • allow_remote_control socket-only
  • listen_on unix:/tmp/kitty-{kitty_pid}.sock(或其他可写目录;目录必须存在)
  • 防误关:confirm_os_window_close -1 count-background

5.3 自动保存(autosave)脚本结构

  • 发现所有实例:遍历 listen_on 创建的 socket(例如 /tmp/kitty-*.sock)。
  • 对每个实例执行:
    • kitty @ --to unix:/tmp/kitty-123.sock action "save_as_session --save-only --relocatable --match=session:. /path/to/autosave/123.kitty-session"
  • 保存策略:
    • 定时(每 N 分钟)
    • 退出/关窗钩子(只能尽力而为;最可靠仍是定时)

5.4 恢复(restore)策略

  • “恢复多个 OS windows”:遍历保存目录,对每个 session 文件启动:kitty --session <file>
  • “单实例/多会话”:用 goto_session 组织,或只维护一个 last.kitty-session 然后 startup_session 指向它。

5.5 想尽量保存“历史输出”

  • Session 无法把 scrollback 缓冲区原样写回,但可以另存文本:
    • kitty @ get-text --extent all --ansi --match=... > logs/...
  • 恢复后可用 less 打开这些日志作为“历史回放”。

5.6 仍想要“进程不断/可重连”

  • 这属于“终端复活”以外的问题:用 tmux/zellij 或把长期任务变成系统服务。

参考链接

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment