tmux

来自 ArchWiki

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

tmux 是 GNU Screen 的一个 ISC 许可的替代品。虽然两者相似,但程序之间存在许多差异,如 tmux FAQ 页面 中所述。

安装

安装 tmux 软件包。 可选地,安装 tmux-bash-completion-gitAUR 以提供 tmux 的 bash 补全功能。

配置

默认情况下,tmux 在 $XDG_CONFIG_HOME/tmux/tmux.conf~/.config/tmux/tmux.conf 中查找用户特定的配置,版本为 3.2。 全局配置文件可以在 /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 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"'

设置正确的 term

256 色

如果您使用 256 色终端,您需要在 tmux 中设置正确的 term: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/usr/share/terminfo/ 中(如果以 root 身份运行,则系统范围内可用)。

主题设置

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 中对此方法的默认解释,用户服务将在注销时保持活动状态。

会话初始化

您可以通过在 ~/.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 中键点击

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

有一个非官方的 perl 扩展(在官方 FAQ提到)可以通过鼠标中键点击启用在 urxvt 和 tmux 之间复制/粘贴。

首先,您需要下载 perl 脚本并将其放入 urxvt 的 perl lib 中

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”,在每次 tmux 启动时执行两个命令。 第二个窗口布局有两个窗格,没有定义任何启动命令。

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

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

使用此命令启动 urxvt 并启动 tmux 会话。 我将此与我的 .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 的派生版本。

终端模拟器窗口标题

如果您通过 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 配色方案未加载

如果您的 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 开头的 term 的 smcuprmcup 功能

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

这会欺骗终端模拟器,使其认为 tmux 是像 pico 或 mutt 这样的全屏应用程序[5],这将使回滚记录正确。 但是请注意,在窗口/窗格之间切换时,它会变得有点混乱。 考虑改用 tmux 的原生回滚。

鼠标滚动

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

如果您想使用鼠标滚轮滚动,请确保 .tmux.conf 中 mode-mouse 设置为 on

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 选项设置为 on 时,在终端窗口内单击鼠标左键可能会将 [M#[Ma 等字符串粘贴到提示符中。

要解决此问题,请设置

set -g mouse-utf8 off

Shift+F6 在 Midnight Commander 中不起作用

参见 Midnight Commander#快捷键失效

参见

教程