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 在 命令行工具
每月 755 次下载
160KB
4K SLoC
sessionizer
从运行中的会话列表或项目选择中选择一个新的 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.toml
或sessionizer.toml
(如果两者都存在,则点号文件优先) - 权限为
0400
、0600
或0700
该 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 |
新窗口的基础目录。路径相对于会话根目录 | 否(默认为会话根目录) | path 、workdir 、wd 、pwd 、cwd |
command |
在新窗口中运行的命令。 | 否 | cmd 、run |
on_exit |
命令完成后窗口的处理方式(见下文)。 | 否(默认行为取决于 tmux 中的 remain-on-exit 设置) | keep-alive 、remain |
[[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 |
在第一个窗口内运行的命令。 | 否 | cmd 、run |
[!NOTE] 此选项类似于使用带有
on_exit
选项设置为keep
的新[[windows]]
的command
。
基于脚本的初始化
要使用脚本文件自定义会话,创建一个名为
- 位于会话根目录下
- 名为
.sessionizer.init
或sessionizer.init
的文件(如果两者都存在,则点文件优先) - 权限为
0500
或0700
[!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 可以选择以下任意一个许可证
- Apache License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT License (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
依赖项
~18–31MB
~484K SLoC