跳转至内容

tmux

来自 ArchWiki

tmux 是一个“终端复用器:它允许您从单个屏幕创建、访问和控制多个终端(或窗口),每个终端运行一个独立的程序。tmux 可以从屏幕分离并在后台继续运行,然后稍后重新附加。”

tmux 是一个与 GNU Screen 类似但采用 ISC 许可的替代品。尽管功能相似,但这两个程序之间存在许多差异,如 tmux FAQ 页面所述。

安装

安装 tmux 包。

配置

默认情况下,tmux 在 3.2 版本之后,会依次查找用户特定配置 $XDG_CONFIG_HOME/tmux/tmux.conf~/.config/tmux/tmux.conf。全局配置文件可以在 /etc/tmux.conf 提供,但默认情况下 Arch 不提供此类文件。

按键绑定

默认情况下,命令快捷键以前缀 Ctrl+b 开头。例如,要垂直分割窗口,请键入 Ctrl+b %

将窗口分割成多个窗格后,可以通过按前缀键(例如 Ctrl+b),然后按住 Ctrl 的同时按下 Left/Right/Up/Down 来调整窗格大小。交换窗格的操作方式相同,但用 o 代替方向键。

可以使用 tmux.conf 中的 bindunbind 命令更改快捷键。例如,通过在配置文件中添加以下命令,可以将默认的前缀绑定 Ctrl+b 更改为 Ctrl+a

unbind C-b
set -g prefix C-a
bind C-a send-prefix
提示 使用引号括起特殊字符以将它们用作前缀。您也可以使用 Alt(称为 Meta)代替 Ctrl。例如:set -g prefix m-'\'

要创建新窗口,可以使用 Ctrl+b c,向前切换窗口使用 Ctrl+b n,向后切换窗口使用 Ctrl+b p

在窗口之间移动的其他方法包括:

Ctrl+b l (Move to the previously selected window)
Ctrl+b w (List all windows / window numbers)
Ctrl+b <window number> (Move to the specified window number, the default bindings are from 0 – 9)
Ctrl+b q  (Show pane numbers, when the numbers show up type the key to goto that pane)

tmux 具有 find-window 选项和快捷键,以方便导航大量窗口。

Ctrl+b f <window name> (Search for window name)
Ctrl+b w (Select from interactive list of windows)

复制模式

tmux 窗口可以处于几种模式之一。默认模式允许直接访问附加到该窗口的终端;另一种是复制模式。进入复制模式后,您可以导航缓冲区,包括滚动历史记录。在复制模式下可以使用 viemacs 风格的快捷键。默认是 emacs 模式,除非 VISUAL 或 EDITOR 包含 'vi'。

要进入复制模式,请执行以下操作:

Ctrl+b [

您可以在复制模式下像在默认编辑器中一样导航缓冲区。

要退出复制模式,请使用以下快捷键之一:

vi 模式

q

emacs 模式

Esc

浏览 URL

要在 tmux 中浏览 URL,您必须安装并配置 urlviewAUR

在新终端中

bind-key u capture-pane \; save-buffer /tmp/tmux-buffer \; run-shell "$TERMINAL -e urlview /tmp/tmux-buffer"

或在新 tmux 窗口中(无需新终端)

bind-key u capture-pane \; save-buffer /tmp/tmux-buffer \; new-window -n "urlview" '$SHELL -c "urlview < /tmp/tmux-buffer"'

设置正确的终端类型

256色

如果您使用的是 256 色终端,则需要为 tmux 设置正确的终端类型:tmuxtmux-256color。这可以在配置文件中设置:

tmux.conf
set -g default-terminal "tmux-256color"

此外,如果 tmux 出现问题,您可以通过在 .bashrc 中添加以下别名,强制 tmux 假定终端支持 256 色:

alias tmux="tmux -2"

24位色

tmux 支持 24 位色。如果您的终端支持此模式(请参阅 [1]),请将其添加到 terminal-features 设置中。

例如,如果您使用 Alacritty 终端,则会添加:

set -as terminal-features ",alacritty*:RGB"

对于其他终端,请将上面的 alacritty 替换为 $TERM 中存储的相应终端类型。

有关 RGB terminfo 标志的详细信息,请参阅 tmux(1)

xterm-keys

要启用 xterm-keys,请将以下行添加到配置文件中:

tmux.conf
set-option -g xterm-keys on

如果您在 tmux.conf 中启用了 xterm-keys,则需要构建一个自定义 terminfo 来声明新的转义码,否则应用程序将无法识别它们。使用 tic 编译以下内容,您就可以使用 "xterm-screen-256color" 作为您的 TERM:

# A screen- based TERMINFO that declares the escape sequences
# enabled by the tmux config "set-window-option -g xterm-keys".
#
# Prefix the name with xterm- since some applications inspect
# the TERM *name* in addition to the terminal capabilities advertised.
xterm-screen-256color|GNU Screen with 256 colors bce and tmux xterm-keys,

# As of Nov'11, the below keys are picked up by
# .../tmux/blob/master/trunk/xterm-keys.c:
	kDC=\E[3;2~, kEND=\E[1;2F, kHOM=\E[1;2H,
	kIC=\E[2;2~, kLFT=\E[1;2D, kNXT=\E[6;2~, kPRV=\E[5;2~,
	kRIT=\E[1;2C,

# Change this to screen-256color if the terminal you run tmux in
# doesn't support bce:
	use=screen-256color-bce,

要检查您的终端是否支持 bce,可以使用 tic -c

$ tic -c xterm-screen-256color 
"xterm-screen-256color", line 16, terminal 'xterm-screen-256color': resolution of use=screen-256color-bce failed

使用 tic 编译

$ tic xterm-screen-256color 

文件将被编译并保存在 $HOME/.terminfo 中,或者如果以 root 身份运行,则保存在 /usr/share/terminfo/ 中(因此可供系统级使用)。

主题

tmux 可以进行主题化,但要做到这一点,首先需要了解颜色代码。这可以通过执行以下命令来实现,该命令将打印颜色代码及颜色样本:

$ for i in {0..255}; do printf "\x1b[38;5;${i}mcolor${i} - ██████████\n"; done

使用上述命令打印的颜色代码可以用来更改 tmux 的颜色方案。以下是一个关于如何更改状态栏颜色的示例:

# Status line colors
set -g status-bg "color4"         # blue background
set -g status-fg "color7"         # gray text color
set -g status-right "%l:%M %p"    # time format
set-window-option -g window-status-current-style "bg=color75,fg=color231 bold"    # current window background + foreground colors

也可以像下面的示例一样对窗格边框进行主题化:

# border colors
set -g pane-border-style        fg="colour255"
set -g pane-active-border-style fg="colour33"

其他设置

将滚动缓冲区限制为 10000 行:

set -g history-limit 10000

可以通过以下方式切换鼠标:

bind-key m set-option -g mouse \; display "Mouse: #{?mouse,ON,OFF}"

使用 systemd 自动启动

在启动时启动 tmux 服务器有一些显着的优点。特别是,当您启动一个新的 tmux 会话时,由于服务已在运行,因此启动延迟会减少。

此外,附加到 tmux 会话的任何自定义设置都将保留,并且如果您的 tmux 会话从未登录过,仍然可以使其保持活动状态,如果您有这样的需求(例如,复杂的脚本化 tmux 配置或共享用户 tmux 会话)。

以下服务为指定用户启动 tmux(即,使用 tmux@username.service 启动/启用):

/etc/systemd/system/tmux@.service
[Unit]
Description=tmux session for user %I

[Service]
Type=forking
User=%I
# WARNING: use %I instead of %u here; %u=root in system services.
ExecStart=/usr/bin/tmux new-session -s %I -d
ExecStop=/usr/bin/tmux kill-session -t %I

[Install]
WantedBy=multi-user.target
提示
  • 您可能需要添加 WorkingDirectory=custom_path 来自定义工作目录。如果设置为 ~,则使用 User= 中指定用户的主目录。
  • 添加 -v tmux 参数可在 WorkingDirectory 中生成 tmux 客户端和服务器日志。
  • 如果要导入与图形会话相关的环境变量,例如 DISPLAYWAYLAND_DISPLAYSESSION_MANAGER,请将 WantedBy 选项更改为 graphical-session.target,并在 [Unit] 部分添加 After=graphical-session.target
  • 或者,您可以创建一个脚本,该脚本在桌面环境、窗口管理器或 Wayland 合成器加载后自动运行,并使用 tmux setenv -g name [value] 导入相关变量。

或者,您可以将此文件放在您的 systemd/User 目录中(不带 User=%I,并在 WantedBy 中将 multi-user.target 替换为 default.target),例如 ~/.config/systemd/user/tmux.service。这样,tmux 服务将在您登录时启动,除非您还启用了 systemd/User#Automatic start-up of systemd user instances。由于此方法中 systemd/User#Kill user processes on logout 中解释的默认设置,用户服务将在注销后保持活动状态。

使用 systemd 用户实例和套接字激活启动

通过 systemd 启动 tmux 的另一种方法是使用以下一对单元:

/etc/systemd/user/tmux@.socket
[Unit]
Description=Terminal Multiplexer Activation Socket (listen on: %i)
Documentation=man:tmux(1)

[Socket]
ListenStream=/tmp/tmux-%U/%i
SocketMode=0600
DirectoryMode=0700

[Install]
WantedBy=sockets.target
/etc/systemd/user/tmux@.service
[Unit]
Description=Terminal Multiplexer (listen on: %i)
Documentation=man:tmux(1)
Requires=tmux@%i.socket

[Service]
Environment=TMUX_SERVER_ARGS=
ExecStart=tmux -D $TMUX_SERVER_ARGS
ExecStartPost=tmux -L%i start
Slice=app-tmux-%i.slice

[Install]
WantedBy=default.target
Also=tmux@%i.socket

(或者将它们放入 ~/.config/systemd/user。) 这会为每个服务实例创建一个 tmux 进程,每个进程都有一个单独的套接字。tmux -D 启动一个非 fork 的 tmux 服务器,它会正确传递激活 FD;但该进程不会执行配置文件指令。tmux start 运行一个瞬时客户端,它会强制服务器执行会话(如果存在)。

要仅启用激活,请运行 systemctl --user enable tmux@NAME.socket;正常启动客户端,使用 tmux -L NAME(如果 NAMEdefault,则仅为 tmux)。套接字激活本身只是确保 tmux 服务器被移动到其自己的切片(tmux.slice/tmux-NAME.slice)中。这相当于 systemd 开发人员的建议(请参阅 systemd-run(1) § EXAMPLES,在 screen 下),并防止它被 会话清理机制杀死。这也允许对整个组进行操作,例如 systemctl --user freeze tmux-NAME.slice

要启用服务器启动,请运行 systemctl --user enable tmux@NAME.service。如果您的用户 systemd 实例是 活动的,则 tmux 会在启动时运行;否则,在登录时运行。要使服务器初始化并运行程序,请在您的 tmux 配置文件中定义会话。

请注意,以这种方式启动的 tmux 会继承您的 systemd 环境;除非为每个窗格生成登录 shell,否则请参阅 Systemd/User#Environment_variables 了解如何填充它。

要更改单个实例的配置文件,请使用 下拉文件

/etc/systemd/user/tmux@topic.service.d/override.conf
[Service]
Environment="TMUX_SERVER_ARGS=-f %h/.tmux-topic.conf"

会话初始化

您可以通过在 ~/.tmux.conf 中包含预加载窗口的详细信息,使 tmux 打开一个会话:

new  -n WindowName Command
neww -n WindowName Command
neww -n WindowName Command

要以分割的窗口(多个窗格)启动会话,请在您想要分割的新窗口下方包含 splitw 命令;例如:

new  -s SessionName -n WindowName Command
neww -n foo/bar foo
splitw -v -p 50 -t 0 bar
selectw -t 1 
selectp -t 0

将打开 2 个窗口,第二个窗口名为 foo/bar,将垂直平分(50%),foo 在 bar 的上方运行。焦点将位于窗口 2 (foo/bar) 的顶部窗格 (foo)。

注意 会话、窗口和窗格的编号从零开始,除非您在 .conf 中指定了 base-index 为 1。

要管理多个会话,请从配置文件中引用单独的会话文件:

# initialize sessions
bind F source-file ~/.tmux/foo
bind B source-file ~/.tmux/bar

剪贴板集成

提示 tmux 插件 tmux-yank 提供了类似的功能。

可以将 tmux 选择复制到显示服务器剪贴板(主/辅助选择),并将其粘贴到 tmux 中。以下 tmux 配置文件片段将 X11 和 Wayland 剪贴板/选择与当前 tmux 选择集成。

注意 为了使 Vim 风格的示例正常工作,可能需要使用 unbind p 卸载“上一个窗口”快捷键。

在 Xorg 上

第一种可能性是使用 xsel

Emacs 风格

bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
bind-key C-y run "xsel -o | tmux load-buffer - ; tmux paste-buffer"

Vim 风格

bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xsel -i -p && xsel -o -p | xsel -i -b"
bind-key p run "xsel -o | tmux load-buffer - ; tmux paste-buffer"

也可以使用 xclip 来实现此目的。与 xsel 不同,它在打印不适合当前区域设置的原始比特流时效果更好。然而,使用 xsel 更方便,因为 xclip 不会在读取完 tmux 缓冲区后关闭 STDOUT。因此,tmux 不知道复制任务已完成,并继续等待 xclip 终止,从而导致 tmux 无响应。解决方法是将 STDOUT 重定向到 /dev/null

Emacs 风格

bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
bind-key C-y run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

Vim 风格

bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -i -sel clip > /dev/null"
bind-key p run "xclip -o -sel clip | tmux load-buffer - ; tmux paste-buffer"

在 Wayland 上

确保安装了 wl-clipboard

Emacs 风格

bind-key -T copy-mode y send-keys -X copy-pipe-and-cancel "wl-copy && wl-paste -n | wl-copy -p"
bind-key C-y run "wl-paste -n | tmux load-buffer - ; tmux paste-buffer"

Vim 风格

bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "wl-copy && wl-paste -n | wl-copy -p"
bind-key p run "wl-paste -n | tmux load-buffer - ; tmux paste-buffer"

Urxvt 中键单击

注意 要使用此功能,您需要启用鼠标支持。

有一个非官方的 Perl 扩展(在官方 FAQ提及),用于通过鼠标中键单击在 urxvt 中复制/粘贴到 tmux 中。

首先,您需要下载 Perl 脚本并将其放入 urxvt 的 Perl 库中:

wget http://anti.teamidiot.de/static/nei/*/Code/urxvt/osc-xterm-clipboard
mv osc-xterm-clipboard /usr/lib/urxvt/perl/

您还需要在您的 .Xdefaults 中启用该 Perl 脚本:

~/.Xdefaults
...
*URxvt.perl-ext-common:		osc-xterm-clipboard
...

接下来,您需要告诉 tmux 关于新功能并启用鼠标支持(如果您还没有的话):

~/.tmux.conf
...
set-option -ga terminal-override ',rxvt-uni*:XT:Ms=\E]52;%p1%s;%p2%s\007'
set -g mouse on
...

就是这样。在尝试新的 MiddleClick 功能之前,请确保关闭所有 tmux 实例。

在 tmux 中,Shift+MiddleMouseClick 将粘贴剪贴板选择,而仅 MiddleMouseClick 将粘贴您的 tmux 缓冲区。在 tmux 之外,只需使用 MiddleMouseClick 粘贴您的 tmux 缓冲区,并使用标准的 Ctrl+c 进行复制。

技巧与提示

使用默认会话布局启动 tmux

tmuxinatortmuxp 这样的会话管理器可以轻松管理常见的会话配置。

对于 tmuxinator,安装 tmuxinatorAUR。使用以下命令测试您的安装:

$ tmuxinator doctor

获取默认布局值

像往常一样启动 tmux 并根据需要配置您的窗口和窗格布局。完成后,通过执行以下命令获取当前布局值(当您仍在当前 tmux 会话中时):

tmux list-windows

输出可能如下所示(两个窗口,一个有 3 个窗格,一个有 2 个窗格):

0: default* (3 panes) [274x83] [layout 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]}] @2 (active)
1: remote- (2 panes) [274x83] [layout e3d3,274x83,0,0[274x41,0,0,4,274x41,0,42,7]] @3                                         

您需要复制以供以后使用的有趣部分从 [layout... 开始,并排除 ... ] @2 (active)。对于第一个窗口布局,您需要复制例如 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]}

定义默认 tmux 布局

了解这一点后,您可以退出当前 tmux 会话。之后,通过编辑 tmuxinator 的配置文件来创建您的默认 tmux 会话布局(不要复制示例,请按照上述说明获取您的布局值):

~/.tmuxinator/default.yml
name: default
root: ~/
windows:
  - default:
      layout: 20a0,274x83,0,0{137x83,0,0,3,136x83,138,0[136x41,138,0,5,136x41,138,42,6]}
      panes:
        - clear
        - vim
        - clear && emacs -nw
  - remote:
      layout: 24ab,274x83,0,0{137x83,0,0,3,136x83,138,0,4}
      panes:
        - 
        - 

示例定义了两个名为“default”和“remote”的窗口。使用您确定的布局值。对于每个窗格,您必须至少使用一行 -。在第一个窗口的窗格中,在窗格一中启动命令行“clear”,在窗格二中启动“vim”,在每个 tmux 启动时,在窗格三中执行两个命令“clear && emacs -nw”。第二个窗口布局有两个窗格,而没有定义任何启动命令。

使用以下命令测试新的默认布局:

tmuxinator default

使用默认 tmux 布局自动启动 tmux

如果您想使用默认的 tmux 会话布局启动终端会话,请编辑:

~/.bashrc
 if [ -z "$TMUX" ]; then
   tmuxinator default          
 fi                     

默认会话的替代方法

除了使用上述方法,还可以编写一个 bash 脚本,该脚本在运行时会创建默认会话并附加到它。然后,您可以从终端执行它,以在该终端中获得预先设计的配置。

#!/bin/bash
tmux new-session -d -n WindowName Command
tmux new-window -n NewWindowName
tmux split-window -v
tmux selectp -t 1
tmux split-window -h
tmux selectw -t 1
tmux -2 attach-session -d

在 urxvt 中启动 tmux

使用此命令使用启动的 tmux 会话启动 urxvt。我将其与我的 .ratpoisonrc 文件中的 exec 命令一起使用。

urxvt -e bash -c "tmux -q has-session && exec tmux attach-session -d || exec tmux new-session -n$USER -s$USER@$HOSTNAME"

每次 shell 登录时启动 tmux

if [ -x "$(command -v tmux)" ] && [ -n "${DISPLAY}" ] && [ -z "${TMUX}" ]; then
    exec tmux new-session -A -s ${USER} >/dev/null 2>&1
fi

上面的代码片段的作用如下:

  1. 检查 tmux 是否可执行;
  2. 并且如果正在运行图形会话(如果您希望 tmux 在任何登录 shell 中启动,请**删除此条件**,但这可能会干扰 登录时自动启动 X);
  3. 并且如果我们尚未在 tmux 会话中;
  4. 然后尝试附加,如果附加失败,则启动一个新会话。

如果您正在使用 systemd 作为用户来保持会话活动,您可以将 if 块中的命令替换为以下命令来附加到该会话并分离所有其他已连接的客户端:

if ! systemctl --user is-active --quiet tmux.service; then
    systemctl --user start tmux.service
fi
exec tmux attach-session -d -t "${USER}" >/dev/null 2>&1

启动非登录 shell

tmux 默认启动一个 登录 shell ,这可能会导致多种负面影响

  • fortune(Unix)用户在创建新面板时可能会注意到打印了引语。
  • 登录 shell 的配置文件(如 ~/.profile)会在每次创建新面板时被解释,因此会执行旨在会话初始化时运行的命令(例如,设置音频级别)。

要禁用此行为,请将以下内容添加到 ~/.tmux.conf

set -g default-command "${SHELL}"

将 tmux 窗口用作标签页

添加到 ~/.tmux.conf 的以下设置允许将 tmux 窗口用作标签页,例如由以下快捷键提供参考 - urxvt 的标签扩展。其优点之一是这些虚拟“标签页”独立于终端模拟器。

#urxvt tab like window switching (-n: no prior escape seq)
bind -n S-down new-window
bind -n S-left prev
bind -n S-right next
bind -n C-left swap-window -t -1
bind -n C-right swap-window -t +1

当然,这些不应与其他应用程序的快捷键(例如终端)重叠。考虑到它们取代了可能已被禁用的终端标签功能。

将 EOT 快捷键 Ctrl+d 与 tmux 的 detach 快捷键结合使用可能也很方便。

bind-key -n C-j detach

客户端同时与会话的各种窗口交互

Practical Tmux 中,Brandur Leach 写道:

Screen 和 tmux 在多个客户端连接到一个会话时的行为略有不同。在 Screen 中,每个客户端都可以连接到会话但查看其中的不同窗口,但在 tmux 中,连接到同一会话的所有客户端都必须查看相同的窗口。
这个问题可以在 tmux 中通过启动两个独立的会话并将第二个同步到第一个窗口,然后将第二个新会话指向第一个来解决。

下面的 tmx 脚本实现了这一点 - 此处的版本稍作修改,以在 1 是其第二个参数时执行 tmux new-window。调用方式为 tmx base_session_name [1],它会在必要时启动基本会话。否则,会启动一个链接到基本会话的新“客户端”会话,可选地添加一个新窗口并附加,设置它在变成“僵尸”后将其自身杀死。不要忘记使其 可执行

~/bin/tmx
#!/bin/bash
# Modified TMUX start script from:
#     http://forums.gentoo.org/viewtopic-t-836006-start-0.html

# Works because bash automatically trims by assigning to variables and by passing arguments
trim() { echo $1; }

if [[ -z "$1" ]]; then
    echo "Specify session name as the first argument"
    exit
fi

# Only because I often issue `ls` to this script by accident
if [[ "$1" == "ls" ]]; then
    tmux ls
    exit
fi

base_session="$1"
# This actually works without the trim() on all systems except OSX
tmux_nb=$(trim `tmux ls | grep "^$base_session" | wc -l`)
if [[ "$tmux_nb" == "0" ]]; then
    echo "Launching tmux base session $base_session ..."
    tmux new-session -s $base_session
else
    # Make sure we are not already in a tmux session
    if [[ -z "$TMUX" ]]; then
        echo "Launching copy of base session $base_session ..."
        # Session id is date and time to prevent conflict
        session_id=`date +%Y%m%d%H%M%S`
        # Create a new session (without attaching it) and link to base session 
        # to share windows
        tmux new-session -d -t $base_session -s $session_id
        if [[ "$2" == "1" ]]; then
		# Create a new window in that session
		tmux new-window
	fi
        # Attach to the new session & kill it once orphaned
	tmux attach-session -t $session_id \; set-option destroy-unattached
    fi
fi

对此的一个有用设置是

setw -g aggressive-resize on

添加到 ~/.tmux.conf。它会导致 tmux 根据实际查看它的最小客户端的大小来调整窗口大小,而不是根据整个会话中最小的客户端。

替代方法是在 ~/.bashrc 中放置以下内容:

~/.bashrc
function rsc() {
  CLIENTID=$1.`date +%S`
  tmux new-session -d -t $1 -s $CLIENTID \; set-option destroy-unattached \; attach-session -t $CLIENTID
}

function mksc() {
  tmux new-session -d -s $1
  rsc $1
}

引用作者:

"mksc foo" 创建一个始终分离的永久客户端,名为 "foo"。它还调用 "rsc foo" 来创建连接到新会话的客户端。"rsc foo" 创建一个由 "foo" 名称分组的客户端。它已开启 destroy-unattached 功能,因此当我离开它时,它会杀死客户端。
因此,当我的计算机失去网络连接时,所有 "foo.something" 客户端都会被杀死,而 "foo" 则保留。然后我可以调用 "rsc foo" 来继续中断的地方。

根据终端类型更正 TERM 变量

与在 tmux 中设置固定 TERM 变量不同,可以根据您的终端模拟器类型设置正确的 TERM(screenscreen-256color):

~/.tmux.conf
## set the default TERM
set -g default-terminal screen

## update the TERM variable of terminal emulator when creating a new session or attaching a existing session
set -g update-environment 'DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY TERM'
## determine if we should enable 256-colour support
if "[[ ${TERM} =~ 256color || ${TERM} == fbterm ]]" 'set -g default-terminal screen-256color'
~/.zshrc
## workaround for handling TERM variable in multiple tmux sessions properly (by Nicholas Marriott)
if [[ -n ${TMUX} && -n ${commands[tmux]} ]];then
        case $(tmux showenv TERM 2>/dev/null) in
                *256color) ;&
                TERM=fbterm)
                        TERM=screen-256color ;;
                *)
                        TERM=screen
        esac
fi

在不重启 tmux 的情况下重载更新的配置

默认情况下,tmux 仅在尚未运行时才读取 ~/.tmux.conf。要让 tmux 之后加载配置文件,请执行:

tmux source-file path

这可以添加到 ~/.tmux.conf,例如:

~/.tmux.conf
 bind r source-file path

您也可以按下 ^: 然后输入:

source .tmux.conf

在新的会话中运行程序或附加到现有会话的模板脚本

此脚本会检查一个程序,该程序被假定为由自身之前的某个运行启动的。如果找不到,它会创建一个新的 tmux 会话并附加到一个以程序命名的、正在运行该程序的窗口。但如果找到了该程序,它只会附加到会话并选择该窗口。

#!/bin/bash

PID=$(pidof $1)

if [ -z "$PID" ]; then
    tmux new-session -d -s main ;
    tmux new-window -t main -n $1 "$*" ;
fi
    tmux attach-session -d -t main ;
    tmux select-window -t $1 ;
exit 0

其 ArchWiki 页面上可以找到一个用于运行带有 nicklist 插件的 irssi 的派生版本。

终端模拟器窗口标题

如果您通过 SSH 连接到 tmux 窗口中的某个主机,您会注意到您的终端模拟器的窗口标题仍然是 user@localhost 而不是 user@server。要允许标题栏适应您连接到的任何主机,请在 ~/.tmux.conf 中设置以下内容:

set -g set-titles on
set -g set-titles-string "#T"

对于 set-titles-string#T 将显示 user@host:~ 并根据您连接到不同主机的情况进行相应更改。

自动布局

创建新的分割或销毁旧的分割时,当前选定的布局不会被应用。要解决此问题,请添加以下绑定,它们会将当前选定的布局应用于新创建或剩余的窗格:

bind-key -n M-c kill-pane \; select-layout
bind-key -n M-n split-window \; select-layout
提示 您可能会对 tmux-xpanesAUR 感兴趣,它使管理窗口布局和 SSH 连接变得容易。

Vim 颜色方案未加载

如果在 tmux 中未加载 Vim 颜色方案,请参阅以下内容:[2] [3]

对 Vim 友好的配置

有关对 vim 用户友好的配置,请参阅 [4]

友好的窗口分割

默认情况下,垂直分割窗格的快捷键是 Ctrl+b %,水平分割窗格的快捷键是 Ctrl+b "。根据您的键盘布局,这可能难以键入,并且也难以记住。

更友好的快捷键是使用 Ctrl+b h 进行水平分割,使用 Ctrl+b v 进行垂直分割窗格,这也非常方便记忆。

要进行此更改,请将以下行添加到 ~/.tmux.conf

# More friendly split pane
bind-key h split-window -h
bind-key v split-window -v

禁止系统挂起

如果 tmux 从另一台设备连接时由于主机进入睡眠状态而挂起,请使用抑制锁运行会话的 shell 命令。

tmux new-session -A "systemd-inhibit --what=idle $SHELL"

故障排除

滚动问题

如果在使用 Shift-Page Up/Down 在终端中滚动时遇到问题,以下命令将禁用任何报告自己为以 xterm 开头的终端的 smcuprmcup 功能:

set -ga terminal-overrides ',xterm*:smcup@:rmcup@'

这会欺骗终端模拟器,让它认为 tmux 是一个像 pico 或 mutt 这样的全屏应用程序[5],这将使滚动回显被正确记录。但要注意,在切换窗口/窗格时,它会稍微混乱。可以考虑使用 tmux 本身的滚动回显。

鼠标滚动

注意 这会干扰选择缓冲区的复制和粘贴。要复制/粘贴到/从选择缓冲区,请按住 Shift 键。

如果您想使用鼠标滚轮滚动,请确保在 .tmux.conf 中启用 mode-mouse。

set -g mouse on

您可以使用以下命令设置滚动历史记录:

set -g history-limit 30000

从 tmux 2.1 开始,要实现鼠标滚轮滚动,请尝试将以下一个或两个添加到 ~/.tmux.conf:

bind -T root WheelUpPane   if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; copy-mode -e; send-keys -M"
bind -T root WheelDownPane if-shell -F -t = "#{alternate_on}" "send-keys -M" "select-pane -t =; send-keys -M"

尽管上面的设置一次只滚动一行,但添加以下解决方案可以滚动一整页:

bind -t vi-copy    WheelUpPane   page-up
bind -t vi-copy    WheelDownPane page-down
bind -t emacs-copy WheelUpPane   page-up
bind -t emacs-copy WheelDownPane page-down

终端模拟器不支持 UTF-8 鼠标事件

当终端模拟器不支持 UTF-8 鼠标事件且 mouse on tmux 选项已设置时,在终端窗口内左键单击可能会将 [M#[Ma 等字符串粘贴到提示符中。

要解决此问题,请设置:

set -g mouse-utf8 off

Midnight Commander 中 Shift+F6 失效

请参阅 Midnight Commander#Broken shortcuts

参见

教程