15 个版本

0.3.5 2024 年 6 月 25 日
0.3.4 2024 年 6 月 24 日
0.2.1 2024 年 6 月 11 日
0.1.6 2024 年 2 月 17 日
0.1.3 2024 年 1 月 15 日

#306命令行工具

Download history 111/week @ 2024-06-02 194/week @ 2024-06-09 312/week @ 2024-06-16 370/week @ 2024-06-23 95/week @ 2024-06-30

每月 755 次下载

MIT/Apache

160KB
4K SLoC

sessionizer CI 状态 Crates.io 文档 许可证:MIT OR Apache-2.0 Rust 版本:1.75.0

从运行中的会话列表或项目选择中选择一个新的 tmux 会话。

[!WARNING] 非常处于开发阶段。目前可能只对我有用。可能以后会有可配置性。

安装

[!IMPORTANT] 不支持 Windows。虽然可以使用 WSL,但尚未测试。

通过 Cargo

发布版本

cargo install sessionizer

开发版本

cargo install --git https://github.com/knutwalker/sessionizer

从源码

make; make install

这些步骤可能需要根据您的环境进行调整(例如,为 make install 提升权限)。在 macOS 上,您必须使用 homebrew 中的 gmake

快速入门

$ sessionizer

用法

sessionizer 允许您快速创建和切换到多个 tmux 会话。

它面向那些希望将各个项目作为独立的 tmux 会话管理的人,每个会话包含自己的窗口和工具列表。这与在一个工具(例如 neovim)中管理不同的会话形成对比。

工作流程

调用 sessionizer 将在一系列路径中搜索适合作为项目目录的目录。

sessionizer 将列出打开的 tmux 会话以及所有目录,在一个类似 fzf 的界面中(fzf 不需要安装,并且在底层也不使用)。

如果选择了现有的会话,则 sessionizer 将根据您是否已处于会话中而连接到该会话或切换客户端到该会话。

当选择一个目录时,sessionizer将为该项目创建一个新的会话。该会话将使用该目录作为默认目录(用于新窗口/标签页的位置)。

此外,还设置了两个环境变量

  • SESSION_NAME:tmux会话的命名方式
  • SESSION_ROOT:所选目录(例如,cd $SESSION_ROOT 将进入该目录)

搜索路径配置

sessionizer读取环境变量SESSIONIZER_PATH以确定搜索路径。该变量的值是冒号分隔的路径列表,类似于PATH环境变量。

SESSIONIZER_PATH中列出的路径将被建议作为项目目录。为了搜索该路径以及建议子目录,使用特殊路径组件_*作为通配符

以下规则控制了如何使用语法来定义路径的搜索方式

  • 遍历路径的每个组件,但不进行匹配。
  • 路径必须以常规组件开头,且不能为空
  • 开头的~扩展到用户的主目录
  • 以常规组件结束的路径将直接使用
  • 如果路径包含通配符,它将被用作搜索的起点,但不直接包含
  • 通配符_遍历该级别的任何路径,但不包含它
  • 通配符*遍历并包含该级别的任何路径
  • 通配符必须是自己的组件(例如,*_表示常规组件*_
  • 可以使用\来转义通配符(例如,\_将按常规组件遍历名为_的目录)
  • 通配符_必须后跟另一个_通配符或*通配符
  • *通配符可能后跟另一个*通配符

示例

输入路径 行为
/dir 建议/dir作为一个项目
/dir/* 建议/dir的所有直接子目录,但不包括/dir本身
/dir/*:/dir 建议/dir的所有直接子目录,以及/dir本身
/dir/_/* 建议/dir的所有子子目录,但 neither /dir itself nor any of its immediate subdirectories
/dir/*/* 建议/dir的所有直接子目录和子子目录,但 neither /dir itself nor any of its immediate subdirectories
/dir/\* 建议/dir/*作为一个项目
/dir/** 建议/dir/**作为一个项目

后备行为

如果未设置SESSIONIZER_PATH,则sessionizer将使用CDPATH。在这种情况下,将每个条目视为如果它有一个末尾的*通配符,并且将跳过非绝对路径。

如果 CDPATH 也没有设置,sessionizer 将会使用 zoxide 查询目录列表,通过 zoxide query --list

如果 zoxide 没有安装,sessionizer 将会回退使用 ~/.config/* 并打印警告。

有用的集成

TMUX

要在 tmux 中使用 <prefix> <C-f> 打开 sessionizer,请将以下内容添加到您的 ~/.tmux.conf

bind-key -r C-f run-shell 'tmux neww sessionizer'

请注意,这 不是 sessionizer 运作所必需的。您也可以直接从 shell 运行它。

Neovim

要在 neovim 中使用 <C-f> 打开 sessionizer,您可以添加以下内容到您的配置文件中

vim.keymap.set("n", "<C-f>", "<cmd>silent !tmux neww sessionizer<CR>")

我倾向于在 tmux 内部始终打开 neovim,并且倾向于使用上述快捷键而不是 neovim 的快捷键。我发现与 tmux 相比,neovim 更容易出现快捷键冲突。

Alacritty

要将 sessionizer 作为“shell”或 alacritty 的入口点,请将以下内容添加到您的 alacritty.toml

[shell]
program = "/opt/homebrew/bin/bash" # ! Change this to your shell
args = ["--login", "-c", "/usr/local/bin/sessionizer"] # ! Change this to the path of your sessionizer

Shell

我在 shell 中有以下别名

alias z='sessionizer --quiet'
alias zz='sessionizer --quiet --tmux-only'
alias cdsessionroot='cd $SESSION_ROOT'

第一个别名允许我输入 z 来打开 sessionizer。第二个别名允许我输入 zz 来仅打开在 sessionizer 中运行的 tmux 会话。最后一个别名允许我快速切换到会话根目录(周围的单引号 ' 非常重要,这样值才会被惰性解析)。

会话初始化

sessionizer 可以被指示在创建新会话时运行一些代码和自定义操作。这可以通过创建两个文件之一来实现。

[!NOTE] 会话初始化是完全可选的。您也可以直接使用 sessionizer 而不进行任何配置。

TOML 初始化

要使用 TOML 自定义会话,创建一个文件,它应该:

  • 位于会话根目录下
  • 命名为 .sessionizer.tomlsessionizer.toml(如果两者都存在,则点号文件优先)
  • 权限为 040006000700

该 TOML 文件具有以下结构(见 example/sessionizer.toml

[env]
ENV_VAR_NAME = "env var value"

[[windows]]
name = "window name"
dir = "window path"
command = "window command"
remain = true

[[run]]
command = "command to run"
[env] 部分

[env] 部分是一个键值对表。它们定义了为会话中的每个窗口设置的 附加 环境变量。

[!IMPORTANT] 这些变量的值可以通过检查程序调用在 tmux 之外可见。保留敏感信息(如 API 密钥)可能会暴露给同一台机器上的其他用户。

[[windows]] 部分

[windows] 是一个表格数组。可以通过使用 [[windows]] 语法添加新的条目,该语法可以重复多次。

对于 [[windows]] 数组中的每个条目,都会创建一个新的 tmux 窗口。该窗口始终在后台启动。

每个 [[windows]] 部分 的表格支持以下键

用途 必需 别名
名称 新窗口的名称(通常显示在 tmux 状态栏中) 否(但推荐,否则将派生名称)
dir 新窗口的基础目录。路径相对于会话根目录 否(默认为会话根目录) pathworkdirwdpwdcwd
command 在新窗口中运行的命令。 cmdrun
on_exit 命令完成后窗口的处理方式(见下文)。 否(默认行为取决于 tmux 中的 remain-on-exit 设置) keep-aliveremain
[[windows.on_exit]]

on_exit 的值可以是布尔值或字符串,允许以下值

用途
"destroy""kill"false 命令完成后窗口将被销毁。使用 false 可能更符合将键称为 remain 的含义。
"keep""shell""stay"true 命令完成后窗口将保持活动状态,并切换到 shell。使用 true 可能更符合将键称为 remain 的含义。
"deactivate""inactive""remain" 命令完成后窗口将被停用。可以使用 tmux 命令 respawn-window 重新激活(有关详细信息,请参阅 man tmux

on_exit 仅在设置 command 时才被解释,否则没有效果。

[[run]] 部分

[run] 是一个表格数组。可以通过使用 [[run]] 语法添加新条目,该语法可以重复多次。

对于 [[run]] 数组中的每个条目,将在新会话的第一个 tmux 窗口中执行一个新命令。

每个 [[run]] 部分的表格支持以下键

用途 必需 别名
command 在第一个窗口内运行的命令。 cmdrun

[!NOTE] 此选项类似于使用带有 on_exit 选项设置为 keep 的新 [[windows]]command

基于脚本的初始化

要使用脚本文件自定义会话,创建一个名为

  • 位于会话根目录下
  • 名为 .sessionizer.initsessionizer.init 的文件(如果两者都存在,则点文件优先)
  • 权限为 05000700

[!NOTE] 如果同时存在 TOML 和脚本文件,则 TOML 文件优先,脚本文件将被忽略。为了使用这两个文件,请将一个具有值 source .sessionizer.toml[[run.command]] 添加到 TOML 文件中。

该文件基本上是一个将被 source 的 shell 脚本。它可以包含您在启动会话时在其他情况下会在 shell 中输入的任何命令。

[!TIP] 要在 vim/neovim 中获得支持,您可以添加 modeline # vim: set ft=bash:。您可以根据您使用的 shell 调整 ft

灵感

sessionizer 最初是 The Primeagen 的 tmux-sessionizer 的更个性化的工作流程。

所有添加和修改都是基于我的个人偏好。如果我没有想要或使用它们,我可能不会添加功能(例如,我通常不关心预定义布局和面板,因此没有对这些提供支持)。

许可证

sessionizer 可以选择以下任意一个许可证


依赖项

~18–31MB
~484K SLoC