跳转至内容

tmux

来自 ArchWiki

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

tmux 是 GNU Screen 的一个 ISC 许可的替代品。虽然相似,但这两个程序之间存在许多差异,详情请参考 tmux FAQ 页面

安装

安装 tmux 软件包。

配置

默认情况下,从 3.2 版本开始,tmux 会依次在 $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 中使用 bind 和 unbind 命令更改键绑定。例如,要将默认前缀绑定从 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 go to 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"'

设置正确的 term

256 色

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

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

此外,如果 tmux 显示异常,可以通过将以下别名添加到您的 shell 配置文件,强制 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 键位

要启用 xterm 键位,请在配置文件中添加以下行:

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

如果您在 tmux.conf 中启用了 xterm 键位,则需要构建自定义 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。这样,除非您还启用了 systemd/User#自动启动 systemd 用户实例,否则 tmux 服务将在您登录时启动。此用户服务在注销时将保持活动状态,原因见 systemd/User#注销时杀死用户进程

使用 systemd 用户实例和 socket 激活启动

通过 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 进程,每个进程都有一个单独的 socket。tmux -D 启动一个非 fork 的 tmux 服务器,该服务器会被正确传递激活 FD;但此进程不会执行配置文件指令。tmux start 运行一个瞬态客户端,强制服务器执行会话(如果有的话)。

要仅启用激活,请运行 systemctl --user enable tmux@NAME.socket;正常启动客户端,使用 tmux -L NAME(当 NAMEdefault 时,只需输入 tmux)。仅 socket 激活即可确保 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#环境变量 以了解如何填充它。

要为单个实例更改配置文件,请使用 插入式文件

/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

要以分割窗口(多个面板)启动会话,请在您想要分割的 neww 下方包含 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 中键点击

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

官方 FAQ提到有一个非官方的 perl 扩展,可以通过鼠标中键在 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
...

就是这样。在尝试新的中键点击功能之前,请务必终止所有 tmux 实例。

在 tmux 中,Shift+鼠标中键点击将粘贴剪贴板选择,而鼠标中键点击将粘贴您的 tmux 缓冲区。在 tmux 外部,只需使用鼠标中键点击即可粘贴您的 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”,在面板三执行两个命令“clear && emacs -nw”。第二个窗口布局有两个面板,没有定义任何启动命令。

测试新的默认布局:

$ tmuxinator default

以默认 tmux 布局自动启动 tmux

如果您想以默认的 tmux 会话布局启动终端会话,请编辑您的 shell 配置文件

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 的用户可能会注意到在创建新面板时打印了引言。
  • 每次创建新面板时,登录 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 的分离快捷键也很方便:

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 的衍生版本。

终端模拟器窗口标题

如果您在 tmux 窗口中通过 SSH 连接到主机,您会注意到终端模拟器的窗口标题仍然是 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 配色方案无法加载

如果您的 vim 配色方案在 tmux 中无法加载,请参阅:[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

Shift+F6 在 Midnight Commander 中无法使用

请参阅 Midnight Commander#损坏的快捷键

参见

教程

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.