joshmedeski/sesh

GitHub: joshmedeski/sesh

一款基于 Go 开发的智能 tmux 会话管理工具,通过整合 zoxide 实现项目间快速切换和会话自动化配置。

Stars: 2155 | Forks: 98

Sesh,智能 tmux 会话管理器

tests goreport

[English](README.md) | [简体中文](README.zh-cn.md)
Sesh 是一个 CLI 工具,可帮助你利用 zoxide 快速轻松地创建和管理 tmux 会话。 - **智能会话创建** - 根据 git 仓库、git 远程地址或目录自动命名会话 - **Zoxide 集成** - 瞬间跳转到你最常用的项目 - **会话配置** - 在 `sesh.toml` 中为每个项目定义启动命令、窗口和预览命令 - **通配符配置** - 将设置应用于所有匹配 glob 模式的项目 - **内置选择器** - 交互式会话选择器,或与 fzf、television、gum 集成 - **克隆并连接** - 一步完成 git 仓库克隆并启动会话 - **最近会话切换** - 在两个最近的会话之间无缝切换 - **根会话导航** - 跳转到 git worktree 或仓库的根目录 - **Nerd Font 图标** - 在选择器中显示会话类型图标 - **Shell 补全** - 支持 Bash、Zsh、Fish 和 PowerShell 的 Tab 补全 ## 目录
- [视频](#videos) - [如何安装](#how-to-install) - [Shell 补全](#shell-completion) - [扩展](#extensions) - [如何使用](#how-to-use) - [推荐的 tmux 设置](#recommended-tmux-settings) - [额外功能](#bonus) - [配置](#configuration) - [贡献](#contributing) - [背景("t" 脚本)](#background-the-t-script) - [贡献者](#contributors) - [Star 历史](#star-history)
## 视频
Smart tmux sessions with sesh

Intro from Josh Medeski (sesh's creator)

DevOps Toolbox - sesh

Review from DevOps Toolbox

## 如何安装
Homebrew 要安装 sesh,请运行以下 [homebrew](https://brew.sh/) 命令: ``` brew install sesh ```
Arch Linux AUR 要安装 sesh,请运行以下 [yay](https://aur.archlinux.org/packages/yay) 命令: ``` yay -S sesh-bin ```
Go 或者,你可以使用 Go 的 go install 命令安装 Sesh: ``` go install github.com/joshmedeski/sesh/v2@latest ``` 这将下载并安装最新版本的 Sesh。请确保你的 Go 环境已正确设置。
Conda 要安装 sesh,根据你的配置运行以下命令中的**一个**: - Conda/(micro)mamba 用户 ``` # 如果需要,替换为 mamba/micromamba conda -c conda-forge install sesh ``` - Pixi 用户 ``` pixi global install sesh ```
Nix 请参阅 [nix 包目录](https://search.nixos.org/packages?channel=unstable&show=sesh&from=0&size=50&sort=relevance&type=packages&query=sesh) 获取有关如何通过 nix 平台安装 sesh 的说明。
**注意:** 你希望在另一个包管理器上使用它吗?[创建一个 issue](https://github.com/joshmedeski/sesh/issues/new) 并告诉我! ## Shell 补全 Sesh 支持 Bash、Zsh、Fish 和 PowerShell 的 shell 补全(Tab 补全)。这有助于你通过按 Tab 键发现命令、标志和参数。
Bash ``` # 生成补全脚本 sesh completion bash > sesh-completion.bash # 安装到系统全局(推荐) sudo cp sesh-completion.bash /etc/bash_completion.d/ # 或者仅安装到当前用户 mkdir -p ~/.local/share/bash-completion/completions cp sesh-completion.bash ~/.local/share/bash-completion/completions/sesh # 重新加载 shell source ~/.bashrc ```
Zsh ``` # 生成补全脚本 sesh completion zsh > _sesh # 安装到系统全局(推荐) sudo mkdir -p /usr/local/share/zsh/site-functions sudo cp _sesh /usr/local/share/zsh/site-functions/ # 或者仅安装到当前用户 mkdir -p ~/.zsh/completions cp _sesh ~/.zsh/completions/ echo 'fpath=(~/.zsh/completions $fpath)' >> ~/.zshrc echo 'autoload -U compinit && compinit' >> ~/.zshrc # 重新加载 shell source ~/.zshrc ```
Fish ``` # 生成并安装补全 sesh completion fish > ~/.config/fish/completions/sesh.fish # 重新加载 fish 配置 source ~/.config/fish/config.fish ```
PowerShell ``` # 生成补全脚本 sesh completion powershell > sesh.ps1 # 创建 PowerShell 配置文件目录(如果不存在) mkdir -p (Split-Path $PROFILE) # 添加到 PowerShell 配置文件 Add-Content $PROFILE ". /path/to/sesh.ps1" # 重新加载 PowerShell & $PROFILE ```
设置完补全后,你可以在输入 `sesh` 时按 Tab 键查看可用的命令、标志和参数。 ## 扩展 ## Raycast 扩展 [Raycast](https://www.raycast.com/) 的 [sesh 伴侣扩展](https://www.raycast.com/joshmedeski/sesh) 让你可以在终端之外轻松使用 sesh。 以下是需要注意的限制: - 在使用扩展之前,tmux 必须处于运行状态 - 扩展会将结果缓存几秒钟,因此可能并不总是最新的 ## Ulauncher 扩展 对于使用 [Ulauncher](https://ulauncher.io/) 的 Linux 用户,有两个扩展可以在终端外使用 sesh: - [Sesh Session Manager](https://ext.ulauncher.io/-/github-jacostag-sesh-ulauncher) - [SESHion Manager](https://ext.ulauncher.io/-/github-mrinfinidy-seshion-manager) 以下是 Sesh Session Manager 需要注意的限制: - 在使用扩展之前,tmux 必须处于运行状态 ## Walker launcher 使用方法 (Linux) 直接在 $XDG_CONFIG_HOME/config.toml 中创建一个操作 ``` [[plugins]] name = "sesh" prefix = ";s " src_once = "sesh list -d -c -t -T" cmd = "sesh connect --switch %RESULT%" keep_sort = false recalculate_score = true show_icon_when_single = true switcher_only = true ``` ### 对于 dmenu 模式,你可以使用: #### Fish shell: set ssession $(sesh l -t -T -d -H | walker -d -f -k -p "Sesh sessions"); sesh cn --switch $ssession #### Bash/Zsh: ssession=$(sesh l -t -T -d -H | walker -d -f -k -p "Sesh sessions"); sesh cn --switch $ssession ##### 对于 dmenu 启动器,将 walker -dfk 替换为 dmenu 或 rofi) ### 如何使用 ### 用于会话的 tmux [tmux](https://github.com/tmux/tmux) 是一个强大的终端复用器,允许你创建和管理多个终端会话。Sesh 旨在简化 tmux 会话的管理。 ### 用于目录的 zoxide [zoxide](https://github.com/ajeetdsouza/zoxide) 是 `cd` 的一个极快替代品,它会跟踪你最常用的目录。Sesh 使用 zoxide 来管理你的项目。你需要先设置 zoxide,但一旦设置完成,你就可以用它快速跳转到最常用的目录。 ### 基本用法 一旦设置好 tmux 和 zoxide,`sesh list` 将列出你所有的 tmux 会话和 zoxide 结果,而 `sesh connect {session}` 将连接到一个会话(如果尚不存在则自动创建)。最好将其集成到你的 shell 和 tmux 中使用。 #### fzf 将 sesh 集成到你工作流程中最简单的方法是使用 [fzf](https://github.com/junegunn/fzf)。你可以用它来选择一个要连接的会话: ``` sesh connect $(sesh list | fzf) ``` #### tmux + fzf 为了与 tmux 集成,你可以在 tmux 配置(`tmux.conf`)中添加一个键绑定。例如,以下内容会将 `ctrl-a T` 绑定到以 tmux 弹出窗口形式打开 fzf 提示符(使用 `fzf-tmux`),并使用不同的命令列出活动会话(`sesh list -t`)、配置的会话(`sesh list -c`)、zoxide 目录(`sesh list -z`)以及查找目录(`fd...`)。 ``` bind-key "T" run-shell "sesh connect \"$( sesh list --icons | fzf-tmux -p 80%,70% \ --no-sort --ansi --border-label ' sesh ' --prompt '⚡ ' \ --header ' ^a all ^t tmux ^g configs ^x zoxide ^d tmux kill ^f find' \ --bind 'tab:down,btab:up' \ --bind 'ctrl-a:change-prompt(⚡ )+reload(sesh list --icons)' \ --bind 'ctrl-t:change-prompt(🪟 )+reload(sesh list -t --icons)' \ --bind 'ctrl-g:change-prompt(⚙️ )+reload(sesh list -c --icons)' \ --bind 'ctrl-x:change-prompt(📁 )+reload(sesh list -z --icons)' \ --bind 'ctrl-f:change-prompt(🔎 )+reload(fd -H -d 2 -t d -E .Trash . ~)' \ --bind 'ctrl-d:execute(tmux kill-session -t {2..})+change-prompt(⚡ )+reload(sesh list --icons)' \ --preview-window 'right:55%' \ --preview 'sesh preview {}' )\"" ``` 你可以根据需要自定义,有关不同选项的更多信息,请参阅 `man fzf`。 #### tmux + [television](https://github.com/alexpasmantier/television) 如果你更喜欢使用 television 而不是 fzf,你可以在 tmux 配置中添加一个绑定,以 tmux 弹出窗口的形式打开 [sesh channel](https://alexpasmantier.github.io/television/community/channels-unix/#sesh)。 ``` bind-key "T" display-popup -E -w 80% -h 70% -d '#{pane_current_path}' -T 'Sesh' tv sesh ``` 使用 `Ctrl-s` 在源之间切换,使用 `Ctrl-d` 终止高亮显示的会话。 ### 窗口管理 `sesh window`(别名 `w`)允许你在会话中列出、切换和创建 tmux 窗口 —— 类似于 `sesh list` 和 `sesh connect` 对会话的操作方式。 #### 列出当前会话中的窗口 ``` sesh window ``` #### 按名称切换到现有窗口 ``` sesh window editor ``` 如果当前会话中存在名为 `editor` 的窗口,sesh 将切换到该窗口。 #### 在目录中创建新窗口 ``` sesh window ~/projects/my-app ``` 如果不存在具有该名称的窗口,sesh 将创建一个以该目录(`my-app`)命名的新窗口,并将其工作目录设置为给定路径。 #### 定位特定会话 使用 `--session` / `-s` 管理非当前附加会话中的窗口: ``` sesh window --session work sesh window ~/projects/my-app --session work ``` #### fzf 集成 你可以将 `sesh window` 与 fzf 结合使用,以交互方式切换窗口: ``` sesh window $(sesh window | fzf) ``` 或者作为 tmux 键绑定: ``` bind-key "W" run-shell "sesh window \"$(sesh window | fzf-tmux -p 60%,50% --prompt '🪟 ')\"" ``` ## gum + tmux 如果你更喜欢使用 [charmbracelet 的 gum](https://github.com/charmbracelet/gum),那么你可以使用以下命令连接到会话: ``` bind-key "K" display-popup -E -w 40% "sesh connect \"$( sesh list -i | gum filter --limit 1 --no-sort --fuzzy --placeholder 'Pick a sesh' --height 50 --prompt='⚡' )\"" ``` **注意:** 与 fzf 相比,gum 可用的功能较少,但我发现它的匹配算法更快,而且感觉更现代。 请观看我的视频 [Top 4 Fuzzy CLIs](https://www.youtube.com/watch?v=T0O2qrOhauY),了解更多可以与 sesh 集成的工具灵感。 #### sesh 选择器 Sesh 有一个内置选择器,可以用作 tmux 弹出窗口: ``` bind-key "K" display-popup -h 90% -w 50% -E "sesh picker -i" ``` ## zsh 键绑定 如果你使用 zsh,可以将以下键绑定添加到 `.zshrc` 以连接到会话: ``` function sesh-sessions() { { exec /dev/null 2>&1 || true [[ -z "$session" ]] && return sesh connect $session } } zle -N sesh-sessions bindkey -M emacs '\es' sesh-sessions bindkey -M vicmd '\es' sesh-sessions bindkey -M viins '\es' sesh-sessions ``` 将其添加到 `.zshrc` 后,你可以按 `Alt-s` 打开 fzf 提示符以连接到会话。 ## 推荐的 tmux 设置 我建议你将这些设置添加到 `tmux.conf` 中,以便更好地使用此插件。 ``` bind-key x kill-pane # skip "kill-pane 1? (y/n)" prompt set -g detach-on-destroy off # don't exit from tmux when closing a session ``` ## 额外功能 ### Last(上一个) 默认的 `+L` 命令会“将附加的客户端切换回上一个会话”。但是,如果在设置了 `detach-on-destroy off` 的情况下关闭会话,则将找不到上一个会话。为了解决这个问题,我提供了一个 `sesh last` 命令,它将始终将客户端切换到已附加的倒数第二个会话。 将以下内容添加到 `tmux.conf` 以覆盖默认的 `last-session` 命令: ``` bind -N "last-session (via sesh) " L run-shell "sesh last" ``` ### 连接到 root 在嵌套会话中工作时,你可能希望连接到 git worktree 或 git 仓库的根会话。为此,你可以将 `--root` 标志与 `sesh connect` 命令一起使用。 我建议将其添加到 `tmux.conf` 中: ``` bind -N "switch to root session (via sesh) " 9 run-shell "sesh connect --root $(pwd)" ``` ### 按 root 筛选 如果要按活动项目的根目录筛选搜索,可以使用 `sesh root` 命令修改你的选择器: ``` bind-key "R" display-popup -E -w 40% "sesh connect \"$( sesh list -i -H | gum filter --value \"$(sesh root)\" --limit 1 --fuzzy --no-sort --placeholder 'Pick a sesh' --prompt='⚡'readme )\"" ``` 我将其绑定到 `+R`,这样我就可以使用备用绑定。 **注意:** 这仅在处于 git worktree 或 git 仓库中时才有效。目前,git worktrees 需要一个 `.bare` 文件夹。 ## 配置 你可以通过在 `$XDG_CONFIG_HOME/sesh` 或 `$HOME/.config/sesh` 目录中创建 `sesh.toml` 文件来配置 sesh。 ``` mkdir -p ~/.config/sesh && touch ~/.config/sesh/sesh.toml ``` ### 自定义配置路径 你可以使用 `--config`(或 `-C`)标志指定自定义配置文件路径。这对于 NixOS 包装器、维护单独的工作/私有配置或测试很有用。 ``` sesh -C /path/to/custom/sesh.toml list sesh --config /path/to/custom/sesh.toml connect my-session ``` 该标志适用于任何子命令。指定时,文件必须存在,否则 sesh 将返回错误。如果没有该标志,sesh 将使用默认配置路径。 ### 自定义复用器 Sesh 使用 `tmux` 作为默认终端复用器,但你可以通过在 `sesh.toml` 中设置 `tmux_command` 将其配置为使用任何兼容 tmux 的复用器,例如 [psmux](https://github.com/psmux/psmux): ``` tmux_command = "psmux" ``` 这将替换 sesh 运行的所有命令(会话创建、切换、附加等)中的 `tmux` 二进制文件。配置的复用器必须支持 tmux 的 CLI 接口。 ### Schema(编辑器自动补全) Sesh 为 `sesh.toml` 提供了一个 [JSON Schema](https://json-schema.org/),可在编辑器中启用自动补全、验证和文档功能。这适用于任何支持 [taplo](https://taplo.tamasfe.dev/) TOML 语言服务器的编辑器。 #### 快速设置 将此行添加到 `sesh.toml` 的顶部: ``` #:schema https://github.com/joshmedeski/sesh/raw/main/sesh.schema.json ``` 就是这样!Taplo 将读取指令并自动应用 schema。 #### Neovim 确保已安装 taplo: ``` brew install taplo ``` 如果你使用的是 [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig),taplo 应该可以与上述 `#:schema` 指令开箱即用。或者,你可以直接配置 schema 关联: ``` require("lspconfig").taplo.setup({ settings = { taplo = { schema = { associations = { [".*sesh\\.toml$"] = "https://github.com/joshmedeski/sesh/raw/main/sesh.schema.json", }, }, }, }, }) ``` ### 黑名单 你可能希望将某些 tmux 会话列入黑名单,使其不显示在结果中。例如,你可能希望从结果中排除 `scratch` 目录。 ``` blacklist = ["scratch"] ``` ### 目录长度 控制用于会话名称的目录组件数量。默认值为 1(仅目录基本名称)。 ``` dir_length = 2 # Uses last 2 directories: "projects/sesh" instead of just "sesh" ``` ### 排序 如果你想更改显示会的顺序,可以在 `sesh.toml` 文件中配置 `sort_order` ``` sort_order = [ "tmuxinator", # show first "config", "tmux", "zoxide", # show last ] ``` 默认顺序是 `tmux`、`config`、`tmuxinator`,然后是 `zoxide`。 如果你只关心特定类型的顺序,则可以省略会话类型。 ``` sort_order = [ "config", # resulting order: config, tmux, tmuxinator, zoxide ] ``` ### 缓存 Sesh 可以缓存会话列表以加速重复调用。缓存是可选加入的,默认禁用。启用后,sesh 将结果存储在 `$XDG_CACHE_HOME/sesh/sessions.gob`(默认为 `~/.cache/sesh/sessions.gob`),并使用带有 5 秒 TTL 的 stale-while-revalidate(过期重验证)策略: - **冷启动**:不存在缓存,获取实时数据并写入缓存 - **新鲜命中**(5 秒内):立即返回缓存数据 - **过期命中**(5 秒后):立即返回缓存数据并在后台刷新缓存 在 `sesh connect` 之后,缓存也会自动刷新。 ``` cache = true ``` ### 默认会话 可以将默认会话配置为在连接到会话时运行命令。这对于运行开发服务器或启动 tmux 插件很有用。 此外,你可以定义一个在预览会话目录时运行的预览命令。这对于使用 [eza](https://github.com/eza-community/eza) 或 [lsd](https://github.com/lsd-rs/lsd) 等工具显示文件很方便。 注意:`{}` 将自动替换为会话的路径。 ``` [default_session] startup_command = "nvim -c ':Telescope find_files'" preview_command = "eza --all --git --icons --color=always {}" ``` 如果要在特定会话上禁用默认启动命令,可以设置 `disable_startup_command = true`。 ### 会话配置 启动命令是在创建会话时运行的命令。它对于为给定项目设置环境很有用。例如,你可能希望运行 `npm run dev` 以自动启动开发服务器。 **注意:** 如果你使用 `--command/-c` 标志,则不会运行启动脚本。 我喜欢使用在会话启动时打开 nvim 的命令。 你还可以定义预览命令,以使用 [bat](https://github.com/sharkdp/bat) 或你选择的任何其他文件预览器显示特定文件的内容。 ``` [[session]] name = "Downloads 📥" path = "~/Downloads" startup_command = "ls" [[session]] name = "tmux config" path = "~/c/dotfiles/.config/tmux" startup_command = "nvim tmux.conf" preview_command = "bat --color=always ~/c/dotfiles/.config/tmux/tmux.conf" ``` ### 路径替换 如果要在启动或预览命令中使用所选会话的路径,可以使用 `{}` 占位符。 这将在运行命令时替换为会话的路径。 一个使用示例如下,其中 `tmuxinator` default_project 使用 [ERB 语法](https://github.com/tmuxinator/tmuxinator?tab=readme-ov-file#erb) 将路径作为键/值对: ``` [default_session] startup_command = "tmuxinator start default_project path={}" preview_command = "eza --all --git --icons --color=always {}" ``` ### 多窗口 如果你希望会话有多个窗口,可以在配置中定义窗口。然后,你可以在会话中使用这些窗口布局。这些窗口可以重复使用多次,并且可以根据需要向每个会话添加任意数量的窗口。 注意:如果未在窗口中指定路径,它将使用会话的路径。 ``` [[session]] name = "Downloads 📥" path = "~/Downloads" startup_command = "ls" [[session]] name = "tmux config" path = "~/c/dotfiles/.config/tmux" startup_command = "nvim tmux.conf" preview_command = "bat --color=always ~/c/dotfiles/.config/tmux/tmux.conf" windows = [ "git" ] [[window]] name = "git" startup_script = "git pull" ``` ### 通配符配置 通配符配置允许你定义应用于任何匹配 glob 模式目录的会话设置,而不是为每个项目创建一个 `[[session]]` 条目。当你有一个充满项目的目录,并且这些项目都应该使用相同的启动命令时,这很有用。 ``` [[wildcard]] pattern = "~/projects/*" startup_command = "nvim" [[wildcard]] pattern = "~/work/*" startup_command = "make dev" preview_command = "ls -la" [[wildcard]] pattern = "~/repos/**" startup_command = "git status" ``` 当你运行 `sesh connect ~/projects/myapp` 时,sesh 会将路径与你的通配符模式进行匹配,并自动创建一个以目录命名的会话(使用 git 远程地址或文件夹名称),运行配置的启动命令,并将路径添加到 zoxide。 可用字段: | 字段 | 描述 | |-------|-------------| | `pattern` | 匹配目录的 Glob 模式(例如 `~/projects/*`) | | `startup_command` | 会话创建时运行的命令(支持用 `{}` 代表路径) | | `preview_command` | 预览会话时运行的命令 | | `disable_startup_command` | 设置为 `true` 以禁止启动命令 | | `windows` | 要使用的窗口布局(来自 `[[window]]` 配置的窗口名称数组) | **注意:** 模式使用 Go 的 `filepath.Match` 语法,该语法支持 `*`(任何序列)、`?`(单个字符)和 `[...]`(字符类)。你也可以在模式末尾使用 `/**` 进行递归匹配 —— `~/projects/**` 匹配 `~/projects/foo`、`~/projects/foo/bar` 以及任何更深的嵌套。单个 `*` 仅匹配一级:`~/projects/*` 匹配 `~/projects/foo` 但不匹配 `~/projects/foo/bar`。显式 `[[session]]` 配置始终优先于通配符匹配。如果多个通配符匹配,则配置顺序中的第一个获胜。 ### 列出配置 如果未提供标志,会话配置将默认加载(在 tmux 会话之后和 zoxide 结果之前返回)。如果要显式列出它们,可以使用 `-c` 标志。 ``` sesh list -c ``` 将文件设置为可执行文件,当你连接到指定会话时它将运行。 ## 贡献 想要贡献?请查看我们的 [贡献指南](CONTRIBUTING.md) 以开始。 ## 背景("t" 脚本) Sesh 是我流行的 [t-smart-tmux-session-manager](https://github.com/joshmedeski/t-smart-tmux-session-manager) tmux 插件的继任者。经过一年的开发和超过 250 颗星,很明显人们喜欢智能会话管理器的想法。但是,我一直觉得 tmux 插件有点像是一个黑科技。它是一个在后台运行的 bash 脚本,解析 tmux 命令的输出。它虽然有效,但并不理想,也不够灵活,无法支持其他终端复用器。 我决定从头开始构建一个会话管理器。这一次,我使用了一种更适合该任务的语言:Go。Go 是一种编译语言,速度快,静态类型,并拥有出色的标准库。它非常适合这样的项目。我还决定让这个会话管理器与复用器无关。它将能够与任何终端复用器配合使用,包括 tmux、zellij、Wezterm 等。 第一步是构建一个可以与 tmux 交互的 CLI,并成为我以前的 tmux 插件的直接替代品。一旦完成,我将扩展它以支持其他终端复用器。 ## 贡献者 由 [contrib.rocks](https://contrib.rocks) 制作。 ## Star 历史 [![Star History Chart](https://api.star-history.com/svg?repos=joshmedeski/sesh&type=Date)](https://www.star-history.com/#joshmedeski/sesh&Date)
标签:CLI, EVTX分析, FZF, Git集成, Go语言, Linux 内核安全, Linux工具, Python安全, Shell脚本, tmux, WiFi技术, Zoxide, 会话管理器, 威胁情报, 工作流优化, 开发效率, 开发者工具, 日志审计, 智能命名, 模糊搜索, 程序破解, 端口探测, 终端增强, 终端复用, 网络可观测性, 网络调试, 自动化, 项目管理