tmux 的 Windows 版本 psmux,无需 WSL Cygwin

文章目录

    一直想找一个 Windows 下的 tmux 版本,因为最近都是在 Windows 下开发,调试和编译也是在 Windows 下进行的。没有 tmux 感觉很不自在。没想到居然找到一个 Windows 下的 tmux 版本 psmux,完全脱离 WSL Cygwin 或 MSYS2,直接在 Windows 下运行。不得不佩服这帮搞 Rust 的大兄弟,战斗力太强了。Github 地址:

    https://github.com/psmux/psnet

    psmux windows tmux

    安装

    在 Windows PowerShell 下执行:

    winget install psmux
    

    验证安装成功

    > psmux --version
    tmux 3.3.7
    psmux 3.3.7 (05cc5d4 2026-07-20)
    

    配置文件

    用户根目录下的 ~/.psmux.conf。例如,在 psmux 中把默认的 Ctrl+b 前缀键改成 Ctrl+a

    > cat ~/.psmux.conf
    # 将前缀键改为 Ctrl+a
    set -g prefix C-a
    

    完全兼容 tmux 配置

    于是我把之前 ~/.tmux.conf 文件中的部分配置复制了过来:

    # 将前缀键改为 Ctrl+a
    set -g prefix C-a
    
    # 窗口编号从 1 开始
    set -g base-index 1
    # 面板(pane)编号也从 1 开始(可选,看你是否也需要)
    set -g pane-base-index 1
    
    # split window
    bind | split-window -h
    bind _ split-window -v
    
    # pane navigation
    bind -r h select-pane -L  # move left
    bind -r j select-pane -D  # move down
    bind -r k select-pane -U  # move up
    bind -r l select-pane -R  # move right
    bind > swap-pane -D       # swap current pane with the next one
    bind < swap-pane -U       # swap current pane with the previous one
    
    # maximize current pane
    bind + run 'cut -c3- ~/.tmux.conf | sh -s _maximize_pane "#{session_name}" #D'
    
    # pane resizing
    bind -r H resize-pane -L 2
    bind -r J resize-pane -D 2
    bind -r K resize-pane -U 2
    bind -r L resize-pane -R 2
    
    # window navigation
    unbind n
    unbind p
    bind -r C-h previous-window # select previous window
    bind -r C-l next-window     # select next window
    bind Tab last-window        # move to last active window
    

    实现类似 smug / tmuxinator / tmuxp 的功能

    项目文件管理,参考:

    https://github.com/psmux/psmux/blob/master/docs/use-cases.md#6-reproducible-development-environments-in-one-command

    例如,新建一个名为 dev-myapp.ps1 的 powershell 脚本,内容如下:

    $proj = "C:\Projects\myapp"
    psmux new-session  -d -s myapp -n edit  -c $proj -- nvim
    psmux new-window   -t myapp   -n server -c $proj -- pwsh -c "npm run dev"
    psmux new-window   -t myapp   -n build  -c $proj -- pwsh -c "cargo watch -x build"
    psmux split-window -t myapp:build -v -c $proj -- pwsh -c "Get-Content .\dev.log -Wait"
    psmux select-window -t myapp:edit
    psmux attach -t myapp
    

    防止退出

    为何运行当前 powershell 脚本后,没有出现 server window,而是窗口一闪而过。
    使用 -c(或 -Command)参数时,PowerShell 会在执行完指定的命令(这里是 ls)后立即退出。当 psmux 发现该窗口内运行的进程结束时,就会自动关闭这个窗口,所以你会看到它一闪而过。

    在 pwsh 命令中加上了 -NoExit 参数:

    加入 -NoExit 后,PowerShell 执行完 ls 会继续保持交互模式,窗口就不会自动留在那里而不会闪退。

    示例

    $projBackend = "D:\work\backend"
    $projFrontend = "D:\work\frontend"
    
    psmux new-session -d -s some_project -n backend -c $projBackend -- pwsh -NoExit -c "ls"
    psmux new-window -t some_project -n frontend -c $projFrontend -- pwsh -NoExit -c "npm run dev"
    psmux select-window -t some_project:backend
    psmux attach -t some_project
    

    放哪里

    可以仿照 linux 的做法,放到用户目录的 bin 目录下,即在用户目录下新建一个 bin 目录,然后把这个 bin 目录加到系统环境变量 Path 中,这样就可以在任意目录下直接运行这个脚本了。或者放到 .local/bin 下,我发现一些 python 相关的程序已经在里面了。

    至于脚本名,可以以 psmux_ 为前缀,例如 psmux_project1.ps1 等。

    查看 session 列表

    > psmux ls
    0: 2 windows (created Fri Jul 24 19:48:29 2026)
    1: 1 windows (created Fri Jul 24 19:56:15 2026)
    some_project: 3 windows (created Fri Jul 24 19:44:00 2026)
    

    kill session

    psmux kill-session some_project
    psmux kill-session 0
    psmux kill-session 1
    

    有了这个,就能完全脱离 WSL 了。

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式