tmux学习笔记
这是一份简要的tmux笔记和速查手册,主要参考 Tmux 的 Github 文档
基本概念
tmux 为终端复用器,可以启动一系列终端会话,可以将会话和终端窗口分离:关闭终端窗口再打开,会话并不终止,而是继续运行在执行,这可以有效避免因网络波动等导致的会话中断,也便于开启多窗口任务。
tmux 在逻辑上主要有三层概念:session(会话)> window(窗口)> pane(窗格)。
- session
- session 具有索引(默认从0开始),同时也有名称(默认名称是数字编号)
- 远程登录时开启 tmux client 客户端,然后可以 attach 到一个 session
- session 可以被一个或多个 client attach(相当于从多个设备同时登入),或者处于 detached 状态,此时 session 保持在后台运行
- session 可以包含一组 window:一个屏幕装不下了,把所有东西暂移出去,新建一个空的 window。在同一时刻只能呈现一个 current window
- window
- window 具有索引(默认从0开始),同时也有名称(默认名称是当前 active pane 运行的程序名,会变化)
- window 可以被一个或多个 session 包含,通常只属于一个 session
- window 可以包含一组 pane,但是同一时刻只有一个 active pane,即光标所在的pane
- window 记录了其中的 pane 的布局规则
- pane
- pane 是最小单位,程序或指令在一个 pane 上运行,多个程序分别在多个 pane 同时运行
一个window下的不同pane如下图
tmux支持查看当前的所有session+window+pane(快捷键prefix+w
),如下图所示
关于tmux命令的使用:
- 可以通过输入命令来执行 tmux 命令,例如
tmux attach
- 可以使用组合快捷键,tmux
的组合快捷键通常需要使用一个固定前缀来触发,默认前缀
prefix=ctrl+b
太不方便了,可以修改为其他前缀,例如ctrl+a
,此时完整的组合快捷键prefix+w
表示ctrl+a w
- 可以像 vim
一样,在
prefix
之后使用:
然后键入指令,此时的指令不再需要输入tmux
,例如prefix
加上:detach
- 在tmux中才允许使用快捷键,但是此时某些tmux命令是不允许使用的。
tmux
使用的配置文件为~/.tmux.conf
,也可以是满足XDG标准的~/.config/tmux/tmux.conf
(在官方文档中没有提到,但是实际确实支持),个人的配置文件存放在fenglielie/dotfiles仓库。
补充说明:
- 不同设备同时打开一个 session,即多个 client 连接到同一个 session 时,可能会因为屏幕尺寸不同发生冲突,出现显示异常,下面会说明如何处理这种问题。
- 如果 tmux 一直有后台 session
在运行,那么对于某些配置的修改可能不会生效,例如我们通过 bash 启动 tmux
后,再次对
.bashrc
的修改可能不会生效,必须完全重启 tmux。与之类似的还有 tmux 自身的配置文件。 - 默认window和pane的编号从0开始,对于快捷切换操作不太友好,通常在配置中会改成从1开始。
session操作
new-session
使用如下指令均可以创建新的session,默认使用从0开始的索引
1
2
3tmux new-session
tmux new
tmux
new
可以作为new-session
的缩写,直接输入tmux
也会自动创建新的session
在创建时可以使用-s
选项指定session的名称,注意 session
的名称不能重复 1
tmux new-session -s mysession
使用-A
选项在指定名称的 session
不存在时自动创建,已存在时则自动进入 1
tmux new-session -A -s session_name
创建 session 时使用-d
选项可以直接将其挂到后台,而非自动
attach 1
tmux new-session -d
attach/detach
使用如下指令可以脱离当前session,但是并不会关闭,session会在后台保持运行(快捷键prefix+d
)
1
tmux detach
使用attach
可以进入一个已存在的 session 1
2tmux attach
tmux a
a
可以作为attach
的缩写
默认会attach到最近的一个session,也可以指定session 1
tmux attach -t mysession
如果多个会话同时打开一个
session,可能会导致尺寸问题,可以在加入时使用-d
选项断开其它会话
1
tmux attach -d -t mysession
kill-session/server
使用如下指令可以关闭当前的 session(或者最近的一个 session)
1
tmux kill-session
也可以使用-s
选项指定关闭某一个session 1
tmux kill-session -t mysession
使用-a
选项会关闭除了当前session之外的所有session
1
tmux kill-session -a
使用-a
选项加上-t
选项会关闭除了指定session之外的所有session
1
tmux kill-session -a -t mysession
使用kill-server
可以在 server
层面直接删除所有的tmux后台进程,包括所有的session 1
tmux kill-server
补充
可以重命名指定的session(快捷键prefix+$
)
1
tmux rename-session -t 0 new_name
可以直接切换到指定的session 1
tmux switch -t mysession
window操作
new-window
使用new-window
可以创建
window,(快捷键prefix+c
) 1
2tmux new-window
tmux neww
neww
可以作为new-window
的缩写
默认使用当前程序(例如bash
或fish
)作为名称,名称可能会随着当前进程而变化,也可以使用-n
自定义名称,给定的名称则不会自动变化
1
tmux new-window -n window_name
创建window后会直接切换过去,如果当前不在 session 中,则会在最近的
session 创建 window。 使用-d
选项则可以在后台创建
window,但不会切换过去 1
tmux new-window -d
补充
使用快捷键prefix+n
和prefix+p
可以切换到下一个和上一个
window。
使用prefix+<n>
则可以切换到指定编号的 window。
使用kill-window
可以删除当前 window 以及它的所有
pane(快捷键prefix+&
) 1
tmux kill-window
可以重命名指定的window(快捷键prefix+,
)
1
tmux rename-window -t 0 new_name
pane操作
可以拆分当前 window 得到多个
pane,可以支持上下分割和左右分割(通常基于快捷键操作)
1
2tmux split-window -v # 上下分割
tmux split-window -h # 左右分割
对于多个 pane
的情况,使用prefix + <space>
可以在多个布局方案中切换。
使用prefix+q
可以显示当前屏幕的所有pane的编号,然后输入编号就可以切换到对应的pane。
使用prefix+Up|Down|Left|Right
可以切换到上下左右的
pane。(鼠标操作也很快)
使用prefix+;
可以切换到上一个活跃的
pane(基于光标);使用prefix+o
可以切换到下一个 pane
(基于编号)。
使用prefix+z
可以临时放大当前的 pane
为全屏(再按一次恢复)。
使用prefix+!
可以将当前 pane 设置为一个独立的
window。
使用kill-pane
可以删除当前
pane(快捷键prefix+x
,通过快捷键删除可能需要确认)
1
tmux kill-pane
查询状态
使用tmux ls
可以查询当前运行的所有session
1
2tmux ls
tmux list-session
查询并处理当前所有的 session/window/pane,以树的方式呈现
- 进入有如下两组快捷键
- 快捷键
prefix+w
默认展开所有项 - 快捷键
prefix+s
默认只呈现 session 层信息,可以使用左右键展开或收起不同的层
- 快捷键
- 查询并移动到树的指定位置,然后回车即可完成session以及window的切换;或者使用
q
撤销切换 - 使用
x
可以删除指定的项,需要y
确认
复制粘贴
tmux提供了一套复制粘贴机制,首先开启vi操作 1
set -g mode-keys vi
复制:
prefix+[
进入复制模式- 使用vim风格的方向键进行移动,移动光标到开始复制的位置
- 按下
space
空格开始选择文本(自动高亮选中的文本) - 继续移动光标,选中需要复制的范围
- 按下回车键完成复制
在此过程中可以使用q
或enter
等退出复制。
粘贴:prefix+]
粘贴文本。
可以使用下面的命令查询tmux最近一次复制的或指定名称的文本缓存
1
2tmux show-buffer
tmux show-buffer -b buffer2
下面的命令则会展示所有的复制缓存(对应的快捷键为prefix+#
,此时会开一个单独的界面,在这个页面仍然可以进行复制)
1
tmux list-buffers
tmux顺便提供了导出复制内容的命令 1
2
3
4# save to a file
tmux save-buffer foo.txt
# save buffer n to file
tmux save-buffer -b buffer2 foo.txt
上面这一套机制只是由tmux自身提供的复制粘贴操作,不包括tmux的鼠标操作,系统中的其它工具也可能在终端提供复制粘贴的快捷键,而且tmux的复制粘贴默认情况下不会和系统中的复制粘贴合并,可能需要额外的配置。
鼠标支持
开启鼠标支持后,支持很多常见的鼠标操作,例如:
- 使用鼠标左键选择片段后会自动进行复制;
- 使用鼠标点击不同区域,就可以进行 pane 之间的切换;
- 使用鼠标拖动边,就可以调整 pane 的边框;
- 使用鼠标点击状态栏,就可以进行 window 之间的切换。
补充
查询命令和快捷键
可以使用下面的命令查询所有的tmux
命令 1
tmux list-commands
使用快捷键prefix+?
可以查看所有的快捷键说明,按q
退出。
使用快捷键prefix+/
,然后按下任何按键会显示对应的快捷键说明。(太方便了)
退出操作
logout
和exit
也能直接退出并删除当前的
pane,但是prefix+x
看起来更方便,虽然可能需要确认。
在删除操作时,如果当前只有一个 pane,则会删除整个
window,如果当前只有一个 window,则会删除整个 session。
默认的tmux
命令太复杂了,使用不太友好,下面的bash函数可以对使用进行一些简化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32tm() {
# Check for help options
if [[ "$1" == "-h" || "$1" == "--help" ]]; then
echo "Usage: tm [SESSION_NAME]"
echo
echo "Examples:"
echo " tm - List all tmux sessions."
echo " tm my_session - Attach to the 'my_session' tmux session or create it if it doesn't exist."
return 0
fi
# Handle session name
local session_name="${1:-}"
if [ -z "$session_name" ]; then
# List all tmux sessions if no session name is provided
tmux ls
else
# Check if the session exists
tmux has-session -t "$session_name" 2>/dev/null
if [ $? != 0 ]; then
echo "No session '$session_name' found. Creating a new session..."
# Create a new session if it doesn't exist
tmux new-session -s "$session_name"
else
echo "Attaching to existing session '$session_name'..."
# Attach to the existing session
tmux attach-session -t "$session_name"
fi
fi
}