Zellij

用它替了 tmux,主要图配置是结构化的 KDL、插件用 WASM、布局能存成文件。但让我真正离不开的只有一件事:和 Neovim 的无缝跳格。

在 nvim 里按 Ctrl+h/j/k/l 是切 vim 窗口,到了最边上再按一下,焦点直接跨出去到相邻的 Zellij 面板,反过来也一样。整个屏幕被切成一堆格子,我不需要记"现在光标在 vim 里还是 zellij 里、该用哪套键"——就一套 Ctrl+hjkl 走天下。这靠 nvim 侧的 smart-splits 和 Zellij 侧的 vim-zellij-navigator 插件对接。

要让这套成立,前提是 Zellij 别乱抢键。它默认会吃掉一堆快捷键和底下程序打架,所以我让它常驻 locked 模式⁠——基本什么都不拦,把键让给 nvim 和 shell,Ctrl+g 才进它自己的 normal 模式去做分屏、开标签那些操作。

locked {
    bind "Ctrl g" { SwitchToMode "normal"; }
}
shared_except "tmux" {
    bind "Alt e" { EditScrollback; }   // 把回滚缓冲丢进 nvim 去搜
    bind "Ctrl h" { MessagePlugin ".../vim-zellij-navigator.wasm" {
        name "move_focus_or_tab"; payload "left"; move_mod "ctrl"; }; }
    // j/k/l 同理
}

Alt e 那条我用得很勤:日志刷过去了,一键把回滚内容扔进 nvim,该搜搜该抄抄。

进了 normal 模式(Ctrl+g)之后是分模式操作,Zellij 的设计是一级菜单 + 子键:p 进 pane 模式(再按方向键开/切面板)、t 进 tab、r 进 resize、s 进 scroll/search、o 进 session。和 tmux 的"一个前缀键 + 一堆要背的字母"比,它每进一个模式底栏直接把可用键画出来,基本不用记。常用的就开面板、切标签、w 把面板浮起来当临时窗口、f 全屏专注。

真正让多路复用器有价值的是会话持久⁠,这块值得单说:

  • detach / attach:zellij attach 接回上次的会话,SSH 断了、手滑关了终端,里面跑着的进程和整个布局都还在。这是我"终端可替换、会话不丢"那条原则的落点。
  • 布局存成文件⁠:常用的工作区(比如左边代码、右下日志、右上 REPL)写成 .kdl 布局,zellij --layout dev 一把铺好,不用每次手动切。布局里能预设每个面板的初始命令和工作目录。
  • resurrection:会话异常退出后,Zellij 会记下布局,下次能"复活"——面板结构回来,跑过的命令可一键重跑。

配色和状态栏跟着 matugen 走(MaterialYou.kdl),底栏不用默认那条、换成 zjstatus 自己画:把模式、标签、会话名、时间按自己的格式排,信息密一些也和整桌面一套色。