Zellij 布局系统:创建布局、面板属性与模板

Zellij 的布局系统让你可以在启动时预先定义好面板的排列方式,而不必每次手动分割。布局文件使用 KDL(KDL Document Language)格式编写,功能强大且灵活。本文将带你从最简单的布局开始,逐步掌握面板属性、浮动面板、标签页和模板的用法。

一、创建布局文件

布局文件位置

布局文件使用 .kdl 扩展名,存放在 Zellij 配置目录下的 layouts/ 文件夹中:

~/.config/zellij/layouts/my-layout.kdl

最简布局示例

以下是一个最简单的布局文件,将屏幕垂直分割为两个等大的面板:

// my-layout.kdl
layout {
    pane
    pane
}

每个 pane 节点代表一个面板。默认情况下,面板会按垂直方向排列(即左右分割)。

使用布局启动

通过 -l 选项指定布局名称(不含扩展名)来使用布局:

zellij -l my-layout

Zellij 会自动在布局目录中查找 my-layout.kdl 文件并加载。你也可以在已运行的会话中通过 zellij action new-tab -l my-layout 在新标签页中使用布局。

二、面板属性详解

面板节点支持多种属性,用于精确控制面板的行为和外观。

分割方向

split_direction 属性控制子面板的排列方向:

layout {
    pane split_direction="vertical" {
        pane
        pane
    }
}

vertical 表示左右排列(默认值),horizontal 表示上下排列。

面板大小

size 属性指定面板占用的空间,支持百分比和固定行数两种方式:

layout {
    pane size="70%"
    pane size="30%"
}

// 固定行数
layout {
    pane size=10
    pane
}

当使用固定行数时,剩余空间会分配给没有指定 size 的面板。

无边框与焦点

layout {
    pane borderless=true
    pane focus=true
}
  • borderless=true:面板不显示边框,可以与其他面板无缝融合,常用于状态栏或标题栏。
  • focus=true:启动时将焦点放到该面板。默认焦点在第一个面板上。

命名与工作目录

layout {
    pane name="编辑器"
    pane name="终端" cwd="/home/user/project"
}
  • name:为面板设置显示名称,方便在状态栏中识别。
  • cwd:指定面板的工作目录,面板中的 shell 会直接在该目录下启动。

运行命令

command 属性让面板在启动时自动运行指定命令,args 用于传递参数:

layout {
    pane command="htop"
    pane command="git" {
        args "status"
    }
}

命令会在面板中直接执行,退出命令后面板也会随之关闭(除非设置了 close_on_exit=false)。

在编辑器中打开文件

edit 属性可以在面板中打开编辑器并加载指定文件:

layout {
    pane edit="src/main.rs"
    pane
}

Zellij 会使用 $EDITOR$VISUAL 环境变量指定的编辑器打开文件。

其他属性

  • close_on_exit=true:命令退出时自动关闭面板。默认为 true。
  • start_suspended=true:面板以挂起状态启动,需要手动唤醒后才会开始执行命令。

面板属性速查表

属性类型说明
split_directionvertical / horizontal子面板的排列方向
size百分比或整数面板大小,百分比如 "70%",整数为固定行数
borderless布尔值是否隐藏面板边框
focus布尔值启动时是否聚焦该面板
name字符串面板名称,显示在状态栏
cwd路径字符串面板的工作目录
command字符串启动时运行的命令
args子节点命令的参数列表
edit文件路径在编辑器中打开指定文件
close_on_exit布尔值命令退出后是否关闭面板
start_suspended布尔值是否以挂起状态启动面板

三、浮动面板布局

布局文件中可以使用 floating_panes 块来定义浮动面板:

layout {
    pane
    pane

    floating_panes {
        pane {
            x 10
            y 10
            width "60%"
            height "40%"
            command "htop"
        }
    }
}

浮动面板通过 xy 定位左上角坐标,widthheight 指定尺寸。它们悬浮在普通面板之上,不会影响底层布局。你可以在一个 floating_panes 块中定义多个浮动面板。

四、标签页

布局文件中可以使用 tab 节点定义标签页:

layout {
    tab name="编辑器" {
        pane size="70%"
        pane size="30%"
    }
    tab name="终端" {
        pane
    }
}

每个 tab 会创建一个独立的标签页,name 属性设置标签页标题。标签页内的面板排列规则与顶层布局相同。

五、标签页模板

default_tab_template

当你有多个标签页,且希望它们共享相同的默认面板结构时,可以使用 default_tab_template

layout {
    default_tab_template {
        pane size="80%"
        pane size=1 borderless=true {
            command "statusbar"
        }
    }

    tab name="编辑器" {
        pane edit="src/main.rs"
        // children 占位符被替换为上面的内容
    }
    tab name="终端" {
        pane command="bash"
    }
}

default_tab_template 定义了一个模板,每个标签页都会自动继承该模板中的面板。标签页内部定义的面板会替换模板中的 children 占位符。如果标签页没有定义任何面板,则会直接使用模板的完整内容。

new_tab_template

new_tab_templatedefault_tab_template 类似,但它只应用于用户在运行时新建的标签页(通过快捷键或命令创建的标签页),不影响布局文件中预定义的标签页。

layout {
    new_tab_template {
        pane size="80%"
        pane size=1 borderless=true {
            command "statusbar"
        }
    }

    // 预定义标签页不受 new_tab_template 影响
    tab name="主面板" {
        pane
    }
}

六、面板模板

面板模板(pane_template)允许你定义可复用的面板配置,避免在多个地方重复相同的属性:

layout {
    pane_template name="monitor" {
        pane size="30%" borderless=true command="btop"
    }

    pane size="70%"
    // 使用模板
    monitor
    monitor
}

通过 pane_template name="xxx" 定义模板后,就可以像使用 pane 节点一样使用模板名来创建面板。所有模板中定义的属性会被自动应用。

更实用的例子——为每个标签页统一添加状态监控面板:

layout {
    pane_template name="status" {
        pane size=1 borderless=true {
            command "bash"
            args "-c" "while true; do date; sleep 1; clear; done"
        }
    }

    tab name="开发" {
        pane size="70%" edit="src/main.rs"
        pane size="30%"
        status
    }

    tab name="监控" {
        pane command="htop"
        status
    }
}

面板模板结合标签页模板,能够大幅减少布局文件中的重复代码,让复杂布局的维护更加轻松。

返回博客列表