Tmux 自定义备忘录

前言

  复习一遍神器操作,顺便强化一下功能,为研究生生活做准备。

简介

  Tmux 全称 Terminal Multiplexer,是一款非常优秀的终端复用软件。它允许在一个屏幕上创建、访问和控制多个终端。可以在如下场景中使用:

  • 即使用户非正常掉线,也能保证当前的任务运行,这一点对于远程 SSH 访问特别有用,网络不好的情况下仍然能保证工作现场不丢失;
  • 处于异地的两人可以对同一会话进行操作,一方的操作另一方可以实时看到;
  • 完全使用键盘实现终端间的切换功能。

  对于经常操作 Linux 系统的博主来说,绝对是一款提升工作效率的利器。

安装并启动

安装

sudo apt-get install tmux

启动

  安装完成后输入命令 tmux 即可打开软件,界面十分简单,类似一个下方带有状态栏的终端控制台。

选项

tmux [-2CluvV] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] [command [flags]]
选项 说明
-2 强制 Tmux 假定终端支持 256 种颜色。
-C 在控制模式下启动。给定两次(-CC)将禁用 echo
-l 表现为登录 Shell。此标志目前不起作用,并且在将 Tmux 用作登录 Shell 时与其他 Shell 兼容。
-u 启动时,Tmux 会查找 LC_ALLLC_CTYPELANG 环境变量。如果第一个找到的包含 UTF-8 的环境变量,则假定终端支持 UTF-8。这并不总是正确的,-u 显式地告知 Tmux 终端支持 UTF-8。注意,Tmux 本身总是接受 UTF-8,-u 控制它是否将 UTF-8 字符发送到它正在运行的终端(如果不是,它们将被替换为 _)。
-v 请求详细日志记录。日志消息将保存到当前目录中的 tmux-client-PID.logtmux-server-PID.log 文件中,其中 PID 是服务器或客户端进程的 PID。如果指定了两次 -v,则会生成一个额外的 tmux-out-PID.log 文件,其中包含 Tmux 向终端写入的所有内容的副本。
-V 显示 Tmux 的版本信息
-c Shell 命令。使用默认 Shell (如 Bash)执行 Shell 命令。如果需要,Tmux 服务器将启动以检索默认 Shell 选项。当 Tmux 用作登录 Shell 时(即启动 Tmux 时),此选项与 sh 相同。
-f file 指定备用配置文件。默认情况下,Tmux 从 /etc/tmux.conf 加载系统配置文件(如果存在),然后在 ~/.tmux.conf 处查找用户配置文件。配置文件是一组 Tmux 命令,在服务器首次启动时按顺序执行。当服务器进程启动时,Tmux 加载一次配置文件。以后可以使用 source file 命令加载文件。Tmux 在创建的第一个会话中显示来自配置文件中命令的任何错误消息,并继续处理配置文件的其余部分。
-L socket-name Tmux 将服务器 socket 存储在 TMUX_TMPDIR/tmp(如果未设置)下的目录中。默认 socket 命名为 default。此选项允许指定不同的 socket 名称,允许运行多个独立的 Tmux 服务器。与 -s 不同,不需要完整的路径:socket 创建都在同一目录中。如果意外删除了 socketSIGUSR1 信号可能会发送到 Tmux 服务器进程以重新创建它(请注意,如果缺少任何父目录,这将失败)。
-S socket-path 指定服务器 socket 的完整替代路径。如果指定了 -D,则不使用默认的 socket 目录,并且忽略任何 -L 标志。
command [flags] 输入一个用于控制 Tmux 的命令,命令详情看下面的内容。如果未指定任何命令,则假定使用 new-session 命令。

基本概念

  Tmux 使用 C/S 模型构建,主要包括以下单元模块:

  • 服务器(Server)。输入 tmux 命令时就开启了一个服务器。
  • 会话(Session)。会话是 Tmux 管理下的单个伪终端集合。每个会话都有一个或多个链接到它的窗口。每个会话可以有自己的名字便于任务之间的切换。底部的状态行显示当前会话的信息,用于输入交互式命令。
  • 窗口(Window)。一个会话可以包含多个窗口,一个窗口占据整个屏幕,可以分成矩形窗格。每个窗口有自己的编号,也可以认为和 ITerm2 中的 Tab 类似。
  • 窗格(Pane)。一个窗口可以包含多个窗格,类似于 Vim 中 ^w + v 后的效果,每个窗格都是一个单独的伪终端。

  根据 Tmux 的定义,在开启了 Tmux 服务器后,会首先创建一个会话(Session),而这个会话则会首先创建一个窗口(Window),其中仅包含一个窗格(Pane)。也就是说,这里看到的所谓终端控制台应该称作 Tmux 的一个窗格,虽然其使用方法与终端控制台完全相同。
  任何数量的 Tmux 实例都可以连接到同一会话,并且任何数量的窗口都可以出现在同一会话中。一旦所有会话都结束,Tmux 就退出。每个会话都是持久的,并且可以在意外断开(比如 SSH 连接超时)或有意断开(键入 ^b + d 删除)之后继续运行。可以使用以下方法重新连接 Tmux:

tmux attach

  在 Tmux 中,一个会话由客户端显示在屏幕上,所有会话由一个服务器管理。服务器和每个客户端是通过 /tmp 中的 socket 进行通信的独立进程。

按键绑定

  Tmux 可以通过使用前缀键 ^bCTRL + B)的组合键在连接的客户机上进行控制。默认情况下,组合键后面是命令键。

注意:每次输入命令键前都要输入前缀键 ^b。本文用 ^ 代表 CTRL 键,! 代表 ALT 键,按键用小写字母(如 a)表示,大写字母(如 A)表示 SHIFT + 按键

  可以通过键入 ^b + : 进入命令模式,输入 bind-keyunbind-key 命令修改按键绑定,默认的按键绑定如下表:

帮助

按键 说明
? 列出所有的按键绑定。

会话管理

按键 说明
s 列出所有会话。
$ 重命名当前的会话。
d 断开当前的会话。
D 选择要脱离的会话,在同时开启多个会话时使用。
( 或者 L 将连接的客户端切换到上一个会话。
) 将连接的客户端切换到下一个会话。

窗口管理

按键 说明
c 创建一个新窗口。
w 列出所有窗口。
, 重命名当前窗口。
& 关闭当前窗口。
% 水平分割窗口。
" 竖直分割窗口。
f 在所有会话的所有窗口中查找关键词。
' 提示输入要选择的窗口编号。
. 修改当前窗口编号,相当于重新排序。
n 切换到下一个窗口。
!n 切换到下一个带 bell 或 activity 标志的窗口。
p 切换到上一个窗口。
!p 切换到上一个带 bell 或 activity 标志的窗口。
0~9 切换到编号 0~9 对应的窗口。
i 显示一些当前窗口的信息

窗格管理

按键 说明
% 水平创建一个窗格。每次创建窗格,会重新对所有窗格排序。
" 竖直创建一个窗格。每次创建窗格,会重新对所有窗格排序。
! 在新窗口中显示当前窗格。
x 关闭当前窗格。
h(*) 或者 LEFT 切换到左侧的窗格。
j(*) 或者 DOWN 切换到下方的窗格。
l(*) 或者 RIGHT 切换到右侧的窗格。
k(*) 或者 UP 切换到上方的窗格。
} 与下一个窗格交换位置。
{ 与上一个窗格交换位置。
; 将光标移入上一个活动的窗格。
q 显示窗格的编号。
o 切换到下一个序号的窗格。
m 标记当前的窗格
M 清除标记的窗格
CTRL + 方向键 以 1 个单元格为单位移动边缘以调整当前窗格大小。
ALT + 方向键 以 5 个单元格为单位移动边缘以调整当前窗格大小。
!o 以逆时针旋转的方式,调整窗格中内容的位置,窗格编号和光标位置不变。
^o 以顺时针旋转的方式,调整窗格中内容的位置,窗格编号和光标位置不变。
z 最大化当前所在窗格,再按 ^b + z 显示所有窗格。
ALT + 数字 窗格排列方式:1 表示所有窗格横向排列;2 表示所有窗格纵向排列;3 表示编号 0 窗口为主窗格,其余窗格在主窗格下方横向排列;4 表示 0 窗口为主窗格,其余窗格在主窗格右方纵向排列;5 表示瓦片排列。
SPACE 选择下一种窗格排列方式。

  要使用带 * 的快捷键需要提前配置,配置方法可以参考“在窗格间移动光标”一节。

复制粘贴

按键 说明
[ 进入复制模式,光标移动到复制内容位置,SPACEV 开始,方向键选择复制,ENTER 确认,q/ESC 退出。查看历史。
] 进入粘贴模式,粘贴之前复制的内容\。
PAGEUP 进入复制模式,向上滚动一页。
PAGEDOWN 进入复制模式,向下滚动一页。
# 列出复制缓冲区中的所有内容(只对复制模式有效),按 q 退出。
- 删除最近一条复制缓冲区的内容。
= 通过列表的形式选择复制缓冲区的内容立即粘贴。

其他

按键 说明
: 进入命令行模式。
t 在当前窗格显示时间。
r 强制重画 attached 的客户端。

命令

  这节主要包含 Tmux 支持的命令列表,键入 ^b + : 进入命令模式。

目标

  大多数命令都带有指定目标客户机 target-client、目标会话 target-session、目标窗口 target-window 或目标窗格 target-pane 之一的可选 -t(有时 -s)参数。
  会话、窗口和窗格都用唯一的 ID 编号。会话 ID 的前缀为 $,窗口的前缀为 @,窗格的前缀为 %。它们是唯一的,并且在 Tmux 服务器中的会话、窗口或窗格的生命周期内保持不变。窗格 ID 将传递给 Tmux 窗格环境变量中窗格的子进程。可以使用 session_idwindow_idpane_id 格式(参见格式部分)以及 display-message, list-sessions, list-windows 或者 list-panes 命令来显示 ID。

目标客户机

  target-client 应该是客户机的名称,通常是客户机连接到的 pty 文件,例如,对于附加到 /dev/ttyp1 的客户机,客户机名字可以是 /dev/ttyp1ttyp1。如果未指定客户端,Tmux 将尝试计算当前使用的客户端;如果失败,则报告错误。可以使用 list clients 命令列出客户机。

目标会话

  按以下顺序尝试目标会话 target-session

  1. $ 开头的会话 ID;
  2. 会话的确切名称(由 list sessions 命令列出);
  3. 会话名称的开头(例如 mysess)将与名为 mysession 的会话匹配;
  4. 与会话名称匹配的 fnmatch 模式。

  如果会话名称的前缀为 =,则只接受完全匹配。因此 =mysess 将仅与 mysess 完全匹配,而不是 mysession
  如果只找到一个会话,则将其用作目标会话;多个匹配项会产生错误。如果省略会话,则使用当前会话(如果可用);如果没有当前会话可用,则选择最近使用的会话。

目标窗口

  目标窗口 target-window(或 src-windowdst-window)指定 session:window 中的窗口。session 遵循与目标会话相同的规则,而 window 按以下顺序查找窗口:

  1. 一种特殊的标记,如下所示;
  2. 窗口索引,例如 mysession:1 是会话 mysession 中的窗口 1,表示第一个会话;
  3. 窗口 ID,比如 @1,不一定是第一个窗口;
  4. 确切的窗口名称,如 mysession:mywindow
  5. 窗口名称的开头,如 mysession:mywin
  6. 作为一个与窗口名匹配的 fnmatch 模式。

  像会话一样,前缀 = 只会完全匹配。空窗口名称指定下一个未使用的索引(如 new-windowlink-window 命令),否则将选择会话中的当前窗口。
  以下特殊标记可用于指示特定窗口,每个都有一个单独的字符替代形式。

标记 代替字符 说明
{start} ^ 编号最小的窗口
{end} $ 编号最大的窗口
{next} + 下一个编号的窗口
{previous} - 上一个编号的窗口
{last} ! 历史记录中的上一个窗口

目标窗格

  目标窗格target-pane(或 src-panedst-pane)可以是窗格 ID(以 % 开头的窗格 ID),也可以采用与目标窗口类似的形式,但可以选择在窗格索引或窗格 ID 后面添加句点,例如 mysession:mywindow.1。如果省略窗格索引,则使用指定窗口中当前活动的窗格。以下特殊标记可用于窗格索引:

标记 代替字符 说明
{last} ! 历史记录中的上一个窗格
{next} + 下一个编号的窗格
{previous} - 上一个编号的窗格
{top} 最上面的窗格
{bottom} 最下面的窗格
{left} 最左边的窗格
{right} 最右边的窗格
{top-left} 左上角的窗格
{top-right} 右上角的窗格
{bottom-left} 左下角的窗格
{bottom-right} 右下角的窗格
{up-of} 活动窗格的上方一个窗格
{down-of} 活动窗格的下方一个窗格
{left-of} 活动窗格的左方一个窗格
{right-of} 活动窗格的右方一个窗格

  标记 +- 后面可以跟一个偏移量,例如:

select-window -t:+2

其他

  此外,目标会话、目标窗口或目标窗格可能完全由标记 {mouse}(替代形式 =,以指定最近的鼠标事件,参见鼠标支持部分)或 {mark}(替代形式 ~,以指定标记的窗格,参见 select-pane -m)组成。

命令参数

  命令的参数可以是 sh 命令。这必须是传递给 Shell 的单个参数,例如:

new-window 'vi /etc/passwd'

  和在新窗口执行下面的命令一样:

/bin/sh -c 'vi /etc/passwd'

  此外,new-windownew-sessionsplit-windowrespawn-windowrespawn-pane 命令允许多个 Shell 命令作为参数提供并直接执行(不使用 sh -c)。这可以避免 Shell 引用的问题。例如在 Shell 中输入:

tmux new-window vi /etc/passwd

  将直接运行 vi 命令,而不调用 Shell。
  command [arguments] 指的是一个 Tmux 命令,该命令和参数分开传递,例如:

bind-key F1 set-window-option force-width 81

  或者使用 sh


   转载规则


《Tmux 自定义备忘录》 Huang Pan 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录