关于Tmux的介绍

Tmux 是一个终端多路复用器:它相当于为终端编程增加了功能。您可以在一个会话中管理多个终端,分割终端屏幕,断开和重新连接会话等等。如果您大部分的编程都是在命令行进行的,您会发现使用终端多路复用器非常有价值。

设置

首先,您需要通过包管理器安装 Tmux 或 下载 它。Tmux 具有高度的可配置性,但我首先建议更改的是 ssh,而不是 Tmux。通过向 ~/.ssh/config 添加以下内容来使 ssh 对所有连接“保持活跃”:

host *
   ServerAliveInterval 300
   ServerAliveCountMax 3

如果该文件不存在,则创建它。此配置指示您的本地机器为所有用户 ssh 会话每 300 秒向服务器发送一个活跃消息,以保持 ssh 会话活跃。如果本地机器发送 3 个未回答的消息,它将断开会话。您应根据需要调整这些设置:例如,通过将 host 限制为特定域名,您可以为每个域名设置不同的设置。如果您有缓慢或不稳定的互联网连接,请考虑将 ServerAliveInterval 更改为更低的数字,以便发送更频繁的消息。

如果您对使用的服务器有权限,您可以使用类似的配置更新它们,在 /etc/ssh/sshd_config 中。

ClientAliveInterval 300
ClientAliveCountMax 3

前缀和“唯一命令™”

安装 Tmux 后,从命令行启动新的 Tmux 会话

$ tmux

Ctrl-b前缀 组合。同时按下 Ctrl 键和字母 b。在 Tmux 会话内部,前缀几乎总是先于快捷键按下来触发命令。

前缀组合非常重要。一旦您掌握了前缀组合,您就可以仅通过一个命令基本上自学 Tmux。要显示 Tmux 命令列表,请输入:Ctrl-b ?

这意味着同时按下 Controlb,然后释放,再按 ?。Tmux 应该显示

bind-key        C-b send-prefix
bind-key        C-o rotate-window
bind-key        C-z suspend-client
bind-key      Space next-layout
bind-key          ! break-pane
bind-key          " split-window
bind-key          # list-buffers
bind-key          $ command-prompt -I #S "rename-session '%%'"
bind-key          % split-window -h
bind-key          & confirm-before -p "kill-window #W? (y/n)" kill-window
bind-key          ' command-prompt -p index "select-window -t ':%%'"
bind-key          ( switch-client -p
bind-key          ) switch-client -n
bind-key          , command-prompt -I #W "rename-window '%%'"
bind-key          - delete-buffer
bind-key          . command-prompt "move-window -t '%%'"
bind-key          0 select-window -t :0
bind-key          1 select-window -t :1
bind-key          2 select-window -t :2
bind-key          3 select-window -t :3
bind-key          4 select-window -t :4
bind-key          5 select-window -t :5
bind-key          6 select-window -t :6
bind-key          7 select-window -t :7
bind-key          8 select-window -t :8
bind-key          9 select-window -t :9
bind-key          : command-prompt
bind-key          ; last-pane
bind-key          = choose-buffer
bind-key          ? list-keys
bind-key          D choose-client
bind-key          L switch-client -l
bind-key          [ copy-mode
bind-key          ] paste-buffer
bind-key          c new-window
bind-key          d detach-client
bind-key          f command-prompt "find-window '%%'"
bind-key          i display-message
bind-key          l last-window
bind-key          n next-window
bind-key          o select-pane -t :.+

您还可以更改前缀组合(请参阅“配置选项”部分)。如果您这样做,请记住在下面的示例中使用您的前缀组合而不是 Ctrl-b

窗口控制

让我们看看 Tmux 的一个关键特性:窗口。它们与浏览器的标签类似。每一个都是一个不同的终端,您可以在其中同时运行不同的命令。要创建一个新窗口,请按 Ctrl-b c。您可以在窗口之间切换:按 Ctrl-b n 转到下一个窗口,按 Ctrl-b p 则转到上一个窗口。按 Ctrl-b w 列出会话中的所有窗口,并允许您选择要激活的窗口(使用箭头键和 Enter)。

如果您知道窗口号,您也可以直接跳转到它,使用 Ctrl-b #,将“#”替换为窗口号。默认情况下,它们从 0 开始,而不是 1!

您可能想知道使用 Tmux 窗口而不是标签式终端的好处是什么。首先,如果常规终端的窗口管理器崩溃,您将丢失终端。这不会在 Tmux 中发生:它将在后台保持终端运行,您可以在任何时间将新的终端重新连接到它们。窗口还可以细分为窗格,所有窗格都运行伪终端。让我们现在看看它们。

窗格控制

窗格很棒。您可以根据喜好水平分割、垂直分割窗口,以及以任何尺寸分割。您在编码时是否曾想快速查找手册页?而不是回到终端,查找手册页,然后再将编辑器放到前台,只需打开一个新的垂直窗格,如下所示

Tmux Panes

现在您可以在同一时间阅读手册页面和代码;您甚至可以在两个窗格之间复制和粘贴。方便多了!

最近我正在处理大量数据;我用3个窗格运行数据处理,用1个窗格监控服务器资源,并使用htop来安排我的Tmux窗口。这个服务器几乎超载了。

Tmux Panes

这些都是关键窗格控制

Ctrl-b "      split pane horizontally
Ctrl-b %      split pane vertically
Ctrl-b o      next pane
Ctrl-b ;      prior pane
Ctrl-b ←↑→↓   jump to pane
Ctrl-b Ctrl-o swap panes
Ctrl-b space  arrange panes
Ctrl-b-←↑→↓   change pane size
Ctrl-b !      pop a pane into a new window

箭头 ←↑→↓ 代表箭头键,只需使用其中一个。例如,要跳转到右侧的窗格,您需要按 Ctrl-b →。更改窗格大小的控制键略有不同。要使其工作,您首先必须拥有多个窗格。接下来按 Ctrl-b 并按住控制键。现在您可以通过重复按箭头键来更改窗格大小。

Ctrl-b ! 是我最喜欢的功能之一。它将当前窗格从窗口中弹出,并将其移动到自己的窗口中。如果您在一个窗格中做一些不相关的活动,并想重新组织您的设置,这真是太好了。

滚动和复制/粘贴

如果您能掌握Tmux中的滚动和复制/粘贴,您就能掌握任何东西。我不会撒谎,这是最不灵活的功能。但它的确很有用。界面是模态的,所以首先通过输入 Ctrl-b [ 进入滚动模式。

esc 将退出滚动模式。你应该知道你处于滚动模式,因为一个橙色行数出现在窗格的右上角。

一旦进入滚动模式,您可以使用箭头键和页面上下键来移动光标。默认情况下,Tmux保留的历史记录不多,但您可以更改这一点(参见配置选项部分)。

您可以在滚动模式中复制和粘贴。当您有分割屏幕作为常规高亮显示,并且使用鼠标无法在垂直分割的窗格中复制时,这非常有用。

copy fail

要复制,将光标定位到您想要开始复制的位置。按 Ctrl-space 开始高亮显示要复制的文本。按 Alt-w 复制高亮显示的文本。按 Ctrl-b ] 将粘贴复制的文本。有方法可以使复制和粘贴更容易:Tmux有一个“vim类似”的复制模式(参见配置选项部分和手册页面以获取详细信息)。

copy win

快捷键 您可以使用 Ctrl-b PgUp 一举进入滚动模式和向上翻页(感谢Ludovic Tolhurst提供的提示)。

如果您花了时间学习滚动模式,您应得到一些额外的东西,一些特别的东西。这是您的奖品:您可以在Tmux缓冲区中搜索!只需使用 Ctrl-b [ 进入滚动模式,然后按 Ctrl-r。输入您的搜索文本并按回车。Tmux将跳转到它找到的最后一个匹配项。您可以按 n 跳到下一个匹配项或按 Shift-n 跳回一个匹配项。

还有 Ctrl-s 可以在缓冲区中向下搜索,但我几乎从不使用它。

会话控制

会话是Tmux最有用的功能之一。它们允许您将多个终端进程组合成一个Tmux会话,可以对它进行操作(附加),将其放入后台(分离)并按照您的意愿丢弃。程序员通常会为不同的项目使用不同的会话。因为Tmux在客户端-服务器架构下运行,即使启动Tmux的原始终端死亡或您的桌面GUI崩溃,Tmux会话也会保留,包括其中的所有终端会话。

使用 Ctrl-b d 分离您的Tmux会话。这将返回您到常规终端提示符。

要列出现有的Tmux会话,只需使用 ls 命令。

$ tmux ls
0: 1 windows (created Thu Jan 28 08:15:20 2016) [190x50] (attached)
2: 2 windows (created Thu Jan 28 09:11:59 2016) [190x50]

这显示了有两个Tmux会话正在运行,其中一个已经连接到终端窗口。要连接到会话,只需在终端提示符中使用attach命令即可。

$ tmux attach

默认情况下,Tmux会连接到下一个未连接的会话(在本例中是“2”)。如果我有许多不同的会话并想连接到特定的一个,我可以用-t指定目标。

$ tmux attach -t 2

配置选项

文件~/.tmux.conf是Tmux用于本地配置的纯文本文件。这是我配置的样子。

# set scroll history to 10,000 lines
set -g history-limit 10000

# modern encoding and colors
set -g utf8 on set-window-option -g utf8 on
set -g default-terminal screen-256color

# don't use a login shell
set -g default-command /bin/bash

# unbind the prefix and bind it to Ctrl-a like screen
unbind C-b set -g prefix C-a bind C-a send-prefix

Tmux以一个小型的滚动历史开始,所以我喜欢将其增加。现代编码和颜色是为了与我的终端设置相匹配——它们现在甚至可能是Tmux的默认设置。默认情况下,Tmux使用登录shell,因此每个新窗口都会执行.bash_profile。我更喜欢禁用这种行为,只启动常规的非登录shell。

Tmux还有数百个其他选项:许多用户会切换到像zsh这样的不同shell,启用使用触摸板的窗口切换,在Tmux底部显示自定义数据(如天气信息)等等。复制其他程序员的配置文件是学习和实验的好方法。

要在Tmux会话中重新加载.tmux.conf,请输入:Ctrl-b :然后输入source-file ~/.tmux.conf

Tmux资源

官方Tmux网站是一个很好的起点,其中包含摘要信息、变更日志、下载以及到广泛手册页的链接。Arch Linux的tmux文档涵盖了高级功能和故障排除技巧。Pragmatic Bookshelf的书籍tmux - Productive Mouse-Free Development是Tmux的全面介绍。

GNU Screen是另一个终端多路复用程序。它比Tmux老一些,有些过时,但它有Tmux的大部分功能。Screen和Tmux的控件足够相似,如果你熟悉其中一个,就可以使用另一个。Tmux的常见问题解答列出了它们之间的区别。


本文最初发布在PerlTricks.com上。

标签

David Farrell

David是一位职业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?请通过在GitHub上打开一个问题或拉取请求来帮助我们。