下班前几分钟,我彻底学废了tmux

1. tmux简介

tmux(terminal multiplexer)是一个非常强大的工具,主要有以下几点功能:

  • 终端复用: tmux 使你能够在一个单独的窗口或终端会话中运行并管理多个终端。这不仅允许你在不同的任务之间快速地切换,而且还可以在同一屏幕中并排显示多个任务。例如,你可能希望在一个窗口中运行一个文本编辑器,而在另一个窗口中运行一个服务器,或者你可能需要同时监视多个日志文件。tmux 使所有这些都变得可能。
  • 会话管理: tmux 允许你创建、访问和控制多个会话。每个会话都是一个完全独立的工作空间,其中可以包含多个窗口和窗格。这就意味着你可以在一个单独的会话中进行一项任务,比如开发一个特定的项目,而在另一个会话中进行另一项任务,比如管理系统。这种方式使得组织工作变得更加容易。
  • 持久性: 当你的 SSH 连接断开,或者你的网络连接出现问题时,tmux 仍然会保持运行。所有的会话、窗口和窗格都会被保留,就像你从未离开一样。当你重新连接时,你可以恢复到你离开时的状态,继续你的工作,而不会丢失任何东西。
  • 协作: 通过 tmux,多个用户可以在同一会话中工作。这使得团队成员可以共享他们的终端,进行协同编辑,或者进行故障排查。

安装tmux:

# Ubuntu
sudo apt-get install tmux

# MacOS
brew install tmux

我们首先需要了解tmux的三大概念:Session(会话)Window(窗口)Pane(窗格)

为方便理解,可以简单认为Session是一个浏览器,而Window则是其中的标签页,Pane则是标签页下的工作区(似乎标签页下没有工作区这个概念,但也只能这么强行解释了 )。

命令行中键入 tmux 命令就可以新建一个会话,观察下方的状态栏,它具有以下形式:

可以看到,对于会话而言,它只有名称这一个概念。而对于窗口而言,它同时有编号和名称这两个概念。* 代表当前所在的窗口,- 代表上一个所在的窗口。

在会话中,输入 exit 或按 Ctrl + d 以退出会话(同时会话也会删除)。

2. Session

直接在命令行中执行

tmux

可快速新建一个tmux会话。该会话的名称默认为 已存在的会话数。例如,若当前已经存在两个会话,那么新的会话名称将是 2

下表列出了常用的会话相关的命令:

命令 作用
tmux new -s [会话名称] 使用自定义名称新建一个会话
tmux rename-session -t [旧会话名称] [新会话名称] 重命名某个已存在的会话
tmux detach 从当前会话中脱离
tmux ls 列出所有会话
tmux a -t [会话名称] 重新接入某个已存在的会话(a是attach的意思)
tmux kill-session -t [会话名称] 杀死某个会话
tmux kill-session -a 杀死所有会话
tmux switch -t [会话名称] 切换到某个会话(必须要在会话中执行该命令)

接下来到了tmux最为关键的部分——快捷键。快捷键由前缀键(prefix key)和命令键组成,且只能在tmux的会话中使用

tmux的前缀键是 Ctrl + b,要使用快捷键,应当先按下前缀键,然后再按下命令键,而不是前缀键和命令键一起按。

下表列出了常用的会话相关的快捷键(这里省略了前缀键,下同):

命令键 作用
$ 重命名当前会话
s 列出所有会话(方向键上下切换会话,左右展开会话中的窗口)
d 从当前会话中脱离

例如,若要从当前会话中脱离,应当先按下 Ctrl + b,然后再按 d,切勿一起按 Ctrl + b + d

3. Window

下表列出了常用的窗口相关的快捷键:

命令键 作用
c 新建一个窗口
, 重命名当前窗口
& 删除当前窗口
0-9中的一个数字 根据窗口编号跳转到相应的窗口
w 列出所有窗口(假如窗口编号大于9可以通过这种方式进行跳转)

4. Pane

下表列出了常用的窗格相关的快捷键:

命令键 作用
% 横向切分出一个窗格
" 纵向切分出一个窗格
x 删除当前窗格
0-9中的一个数字 根据窗口编号跳转到相应的窗口
w 列出所有窗口(假如窗口编号大于9可以通过这种方式进行跳转)
方向键 在窗格中来回跳转
q 显示所有窗格编号(在编号消失前按下编号可以跳转到相应的窗格)
z 最大化当前窗格(最大化后执行相同的操作可以恢复成原样)

5. 自定义tmux配置

tmux配置文件在 ~/.tmux.conf,这里贴一份博主自己的配置:

# 启用鼠标模式
# 可使用鼠标点击以在窗格中跳转
# 也可以使用鼠标改变窗格大小
set -g mouse on

# 设置历史命令缓存为 20000
set -g history-limit 20000

# 设置状态栏背景色为品红色
set -g status-bg magenta
# 设置状态栏文字颜色为白色
set -g status-fg white
# 设置状态栏左侧显示会话名称
set -g status-left "[#S] "
# 设置状态栏右侧显示当前日期和时间
set -g status-right "%Y-%m-%d %H:%M"

# 设置当前窗口状态显示格式
set -g window-status-current-format '#[fg=black](#I:#W)'
# 设置非当前窗口状态显示格式
set -g window-status-format '#[default]#I:#W'
# 设置窗口自动重命名
setw -g automatic-rename

# 设置快捷键 Ctrl + h/j/k/l 来切换窗口面板
# -n代表不需要按前缀键
bind -n C-h select-pane -L
bind -n C-j select-pane -D
bind -n C-k select-pane -U
bind -n C-l select-pane -R

# 按下命令键y后,可以在所有窗格同步进行输入
bind y setw synchronize-panes

# 按下命令键r后,重新加载tmux配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

配置完后,我们需要执行

tmux source-file ~/.tmux.conf

来使配置文件生效。但注意到我们已经配置了快捷键,所以只需要在tmux会话中先按 Ctrl + b,再按 r 即可加载新的配置。

如果仍未成功加载配置,执行以下命令即可

tmux kill-server

6. 在shell脚本中操纵tmux

在shell脚本中,我们通常会加上 -d 来在后台创建tmux会话(这样可以保证创建会话后不会立即进入会话):

tmux new -ds [会话名称]

创建会话后,使用 send-keys 来向指定的会话发送按键(注意是按键),语法如下:

tmux send-keys -t [会话名称] [按键1] [按键2] ...

例如

tmux new -ds abc
tmux send-keys -t abc pwd
tmux a -t abc

可以看到命令并没有被执行

这是因为 send-keys 的作用只是发送按键,要想让命令被执行,我们还需要在最后发送一个回车键,即修改第二行为

tmux send-keys -t abc pwd Enter

对于包含空格的命令,我们可以使用字符串将它们包裹起来,也可以使用 Space 键。以下两行命令是等价的:

tmux send-keys -t abc "ls -l" Enter
tmux send-keys -t abv ls Space -l Enter

我们还可以发送 Ctrl + c 来中断一个正在执行的命令:

tmux send-keys -t abc C-c

假如会话中有多个窗口,每个窗口有多个窗格,则上述按键会默认发送至该会话的当前活动窗口的当前活动窗格。若要指定窗口窗格进行发送,可以使用如下的语法:

tmux send-keys -t [会话名称]:[窗口编号/窗口名称].[窗格编号] [按键1] [按键2] ...

References

[1] https://github.com/tmux/tmux/wiki/Getting-Started
[2] https://www.cnblogs.com/zuoruining/p/11074367.html

猜你喜欢

转载自blog.csdn.net/raelum/article/details/131613773