Published on

让 tmux 窗口像浏览器标签一样左右移动

Authors

痛点

浏览器里按 Cmd+Shift+[ / Cmd+Shift+] 就能把当前标签左右挪动,非常顺手。切到 tmux,很多人第一反应是绑定 swap-window

bind < swap-window -t -1
bind > swap-window -t +1

看起来能用,但有两个毛病:

  1. 焦点会跟着窗口跑——窗口挪到第 5 个位置,你的视线和当前激活窗口也跳走了,连续移动时眼花。
  2. 虽然能交换,但缺少 -r(repeat)修饰,每次都要重新按 prefix,不够连贯。

解决方案

~/.tmux.conf 里加两行:

# 当前窗口左移 / 右移,焦点保持不变
bind -r < swap-window -d -t -1
bind -r > swap-window -d -t +1

配合我的 prefix 是 Ctrl+s,操作就是:

  • Ctrl+s 然后 < —— 当前窗口左移一位;
  • Ctrl+s 然后 > —— 当前窗口右移一位;
  • 由于 -r,按完一次后可以连按 < < <,无需重复 prefix。

到达最左/最右边界时自动停止,不会循环,也不报错。

三个参数为什么都不能省

-d:不要跟着窗口走

swap-window 默认会把当前激活焦点移到交换后的位置。加了 -d(detached),焦点留在原地(也就是交换后窗口所在的新位置……实际上是你视觉上"窗口在动、屏幕不动"的效果)。连续移动时这一点至关重要。

-t -1 / -t +1:相对索引

-t 接受相对当前窗口的偏移-1 是前一个、+1 是后一个,tmux 自动处理到边界的情况。

-r:可重复按键

bind -r 声明的键,在 prefix 后的 repeat 时间窗内可以连续按下而不必每次重按 prefix。这是"像浏览器一样丝滑"的关键。

完整片段

# ~/.tmux.conf
set -g prefix C-s
unbind C-b
bind C-s send-prefix

# 窗口左右移动(焦点不动,可连续按)
bind -r < swap-window -d -t -1
bind -r > swap-window -d -t +1

# 可选:用 Shift+Left/Right 直接触发,连 prefix 都省了
bind -r S-Left swap-window -d -t -1
bind -r S-Right swap-window -d -t +1

最后两行是进阶玩法:直接用 Shift+方向键,连 prefix 都不必按——但记得 bind -r 仍然提供 repeat 能力。

小结

swap-window -d -t ±1 加上 bind -r,三件套凑齐,tmux 的窗口重排就能达到浏览器标签的顺滑程度。-d 保证焦点稳定,-t 用相对索引省去心算,-r 让连续操作无需重复 prefix。