如何在远程和本地开发中使用 tmux

how i use tmux featured img 2

tmux 终端多路复用器通常用于远程开发,但它在本地开发工作中也有有趣的应用。在本文中,我将解释终端多路复用器的作用,向您展示如何安装 tmux,介绍基本命令(如启动 tmux 会话),并展示如何在窗口和窗格之间导航。最后,我将展示我为什么(以及如何)在本地开发中使用 tmux。

我承认本地开发并不是 tmux 最明显的用例,但我从 2016 年开始以这种方式使用它,并爱上了这个非常棒的小工具。对我来说,在本地开发中使用 tmux 的最佳部分是能够在我启动终端模拟器时几乎立即设置好我首选的命令行”工作区”。

什么是 tmux?

“tmux” 这个名字是 “terminal multiplexer”(终端多路复用器)的缩写。这意味着您可以在一个终端窗口中打开多个分屏视图(窗格),每个窗格都可以作为独立的终端运行。它们并排可视化运行,无需打开新窗口。

它通常被视为在远程服务器上工作时使用的工具,因为它可以在您同时需要做多件事情时,避免打开多个终端(SSH)会话到该机器。

也许您有一个需要运行很长时间的脚本,同时您想用 tail -f 之类的命令监控其输出到日志文件。也许在此期间您还在编辑其他准备下次运行的配置文件或脚本。

通常情况下,您会启动三个或更多独立的终端应用程序实例,并用每个实例 SSH 到服务器。使用 tmux,您只需要一个 SSH 连接即可。

tmux 的伟大之处在于它允许您同时打开多个窗格,每个窗格都有自己的 shell 运行,但使用同一个 SSH 连接。

tmux with three panes 1 1540x866 3

不仅如此,您还可以同时打开多个窗口,有点像带有更多窗格的标签页。

tmux with second window 1 1540x866 3

在远程服务器上使用 tmux 的一个巨大好处是,如果您的网络连接因任何原因中断,tmux 会话仍会继续运行。您刚刚启动的、忘记用 nohup 并用流重定向后台运行的长时间运行的任务也会继续运行。只要您的网络恢复后再次 SSH 到服务器,执行 tmux attach 即可,所有相同的窗格和窗口都在那里等着您。您甚至可以从当前会话分离,在另一台计算机上重新登录,发现它仍在运行。

如何安装 tmux

安装方式因操作系统而异,但 Linux 和 Mac 系统通常只需要一个命令。在 Windows 上安装稍微复杂一些,因为您必须使用 Windows 10 首次推出的 Windows 子系统 for Linux(WSL)功能。

在 Linux 上安装 tmux

在 Linux 上安装 tmux 使用 sudo,但以下命令因发行版而异:

Ubuntu/Debian

sudo apt-get update
sudo apt-get install tmux

Fedora

sudo dnf -y install tmux

CentOS

sudo yum -y install tmux

Nixpkgs 或 NixOS

如果您在 LinuxmacOSWindows WSL2 上安装了 Nixpkgs,可以使用以下命令:

nix-env -iA nixpkgs.tmux

对于 NixOS,您可以改为将 programs.tmux 添加到您的 configuration.nix 文件中,并可选择对默认设置进行一些更改:

# tmux
programs.tmux = {
    enable = true;
    shortcut = "a";
    baseIndex = 1;
    keyMode = "vi";
    secureSocket = false;
    clock24 = true;
  };

然后你只需要运行 sudo nixos-rebuild switch 来安装和配置 tmux。

在 macOS 上安装 tmux

在 Mac 上最简单的方法是使用 Homebrew。我强烈推荐如果你还没有安装这个包管理器的话赶紧安装一个。它能让生活变得更轻松。

brew install tmux

在 Windows 上安装 tmux

要在 Windows 上运行 tmux,需要先安装 WSL 和 Linux 发行版。

第一步是安装 WSL 或升级版 WSL2。要安装 WSL2,你需要使用 Windows 10 2004 版本或更高版本(Build 19041 及以上),或者 Windows 11。旧版 Windows 无法使用 WSL2,但可能可以手动安装 WSL

在 Windows PowerShell 或命令提示符中运行一个命令就能完成几乎所有操作:启用所需组件、下载最新的 Linux 内核,并为你安装 Ubuntu:

wsl --install

可以通过 -d 标志和发行版名称来更改要安装的 Linux 发行版。使用以下命令可以查看当前可用的发行版列表:

wsl --list --online

如果想要使用不在列表中的发行版,需要手动导入该发行版

下一步是创建将在 Linux 中使用的用户名和密码。点击 开始 菜单并打开你的 Linux 发行版。你可能需要搜索它。

tmux opening ubuntu in Windows 1 2

文件解压完成后,Linux 会提示你输入用户名和密码。现在你已经运行了 Linux 发行版,下一步是更新软件包:

sudo apt update
sudo apt upgrade

运行以下 Linux 命令将安装 tmux:

sudo apt install tmux

恭喜!你已成功在 Windows 上安装了 tmux。😅

如何使用 tmux

要启动 tmux,打开终端并输入:

tmux

现在你将看到一个包含单个窗格的 tmux 窗口,底部有一个状态栏。状态栏显示当前 tmux 会话的信息,包括当前会话名称、窗口编号和活动窗格中正在运行的进程、当前活动窗口 (*)、主机名以及时间和日期。

tmux with status bar 1540x866 3

正如你将在后面看到的,许多默认的 tmux 配置都可以更改。

命令结构

在深入了解如何使用 tmux 之前,让我们花点时间看看它如何构建命令。所有 tmux 命令都包含一个前缀后跟一个命令。你在 tmux 中最常用的前缀是 Ctrl+b。在任何情况下,你都可以在 tmux 窗格中按 Ctrl+b 而不是输入 tmux

默认的前缀是一个笨拙的组合键。许多人(包括我)将 tmux 配置为使用 Ctrl+a。你可以通过在 ~/.tmux.conf 文件中添加以下行来实现:

unbind C-b
set -g prefix C-a

从现在开始,当我们提到前缀时,将使用 Ctrl+a。如果你决定不重新映射前缀,请务必改用 Ctrl+b

会话

会话是 tmux 的基础。会话可以包含多个窗口,任何窗口都可以有多个窗格。活动窗口称为概念。

通过 tmux 命令启动 tmux,您将创建一个新会话。默认情况下,会话从 0 开始编号。如以下速查表所示,您可以使用 -s 标志后跟会话名称来创建命名会话。

tmux new -s [name]

您不必为会话指定名称,但默认编号方式会让您难以跟踪越来越多的 tmux 会话。您可以使用 rename-session 命令和 -t 标志来重命名现有的 tmux 会话。该标志用于指定目标会话。

tmux rename-session -t [旧名称或编号] [新名称]

例如,我们可以将第一个会话从 0 重命名为更具描述性的名称。

tmux renaming session 1540x866 3

正如您在左下角看到的,会话已被重命名为 learning

与大多数 tmux 命令一样,您可以使用快捷方式,而无需输入完整命令。在这种情况下,Ctrl+a$ 会弹出一个提示来重命名会话。

您可以在同一个终端中同时运行多个会话。创建新会话的最简单方法是使用命令 tmux new-session。但是,这会创建一个带有默认编号的会话。最好使用 -s 标志并为我们的新会话指定一个描述性名称:

tmux new -s practice

这些会话将继续运行,直到您使用 kill-session 命令关闭它们。您可以使用 tmux ls 查看所有正在运行的会话。

tmux list sessions 1540x866 3

要在不先分离的情况下切换会话,请使用 Ctrl+as,然后使用方向键和 Enter 选择另一个会话。您也可以通过输入其显示的编号直接选择所需的会话。

tmux list sessions with windows 1540x866 3

附加和分离

启动新会话时,您会自动附加到该会话。要重新附加到现有会话,请使用 attach-session 命令,后跟 -t 标志以指定命名或编号的会话:

tmux attach-session -t [会话名称或编号]

作为快捷方式,您可以通过不提供 -t … 标志来快速附加到上一个会话。事实上,tmux 非常擅长猜测您想执行的命令,通常只需要命令的第一个或前两个字母就足够了。

tmux a

要分离所有会话,请使用 tmux detach 或按 Ctrl+a 后跟 d。要仅从当前会话分离,您需要使用 -s 标志专门指定该会话:

tmux detach -s [会话名称或编号]

请记住,分离会话不会停止任何正在运行的进程。一切将继续运行,直到您停止进程或终止会话。您可以通过按 Ctrl+a 后跟 x,然后按 y 来结束任何活动会话。

要终止所有会话,请使用 kill-server 命令。

tmux kill-server

窗口和窗格

窗口和窗格是您充分发挥 tmux 潜力的方式。窗格是我们在其中运行进程、命令和脚本的窗口部分。到目前为止,在本教程中,我们只使用了一个带有单个窗格的窗口。tmux 的优点之一是您可以同时运行多个进程,并通过它们在同一窗口的不同窗格中来同时查看两者。

您可以水平或垂直分割窗口来创建窗格。要创建两个垂直窗格,请按 Ctrl+a 后跟 %

tmux first split panes 1540x866 3

您现在将在第一个窗格的右侧有一个新窗格。您可以继续分割窗格,可以使用上面的命令进行垂直分割,或者按 Ctrl+a 然后按 创建水平窗格。

tmux with more split panes 1540x866 3

我创建了一个垂直分割然后水平分割,但您可以按自己喜欢的方式设置。默认情况下,tmux 会在最近创建的窗格中激活光标。使用 Ctrl+a 和方向键组合在它们之间导航。例如,如果您想移动到右侧的窗格,请按 Ctrl+a 然后按 。要转到下一个窗格,可以使用 Ctrl+a 然后按 o。而使用 Ctrl+a; 则可以在当前窗格和上一个窗格之间切换。

您也可以使用窗格编号进行导航。按 Ctrl+a 然后按 q 会短暂显示窗格编号。在显示编号时输入编号,您将自动切换到该窗格。这是对您反应速度的一个很好的测试,但实际上这比直接使用方向键多按一个键。

tmux split panes with numbers 1540x866 2

就我个人而言,我想要更快的窗格导航,所以我配置了 tmux 以启用 Alt+方向键 来切换窗格,方法是在我的 ~/.tmux.conf 文件中添加以下内容。

# Use Alt-arrow keys without prefix key to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

要关闭一个窗格,请使用 exit 命令或按 Ctrl+d。如果在最后一个打开的窗格中执行此操作,将完全退出 tmux。

调整窗格大小

您可以更改每个窗格的相对大小。当然,增加一个窗格的大小可能导致其他窗格按比例缩小。

要更改窗格大小,请导航到正确的窗格,然后按 Ctrl+a 然后按 :。您的状态栏将从绿色变为黄色。然后您可以使用以下命令更改该窗格的边界线。请注意,您受终端边界限制。例如,通过将边界线向右移动来调整右侧窗格的大小是行不通的,因为没有空间让窗格向右扩展。

  • resize-pane -R: 向右扩展窗格。
  • resize-pane -L: 向左扩展窗格。
  • resize-pane -U: 向上扩展窗格。
  • resize-pane -D: 向下扩展窗格。

但是,由于这相当缓慢且费劲,tmux 默认配置了一些快捷键来快速调整大小。

  • Ctrl+a Ctrl+方向键: 将窗格增大或缩小 1 列或 1 行。
  • Ctrl+a Alt+方向键: 将窗格增大或缩小 5 列或 5 行。

如果您按住 Alt 键并多次按方向键,它将持续调整窗格大小,而无需再次按 Ctrl+a 前缀键。

在窗口之间导航

使用 Ctrl+ac 在当前会话中创建一个新窗口(类似于标签页)。创建时您将自动切换到新窗口。

您可以通过按 Ctrl+a 然后按状态栏中显示的窗口编号来导航到另一个窗口,或使用 Ctrl+an 切换到下一个窗口。输入 Ctrl+ap 将返回上一个窗口。

要快速在两个窗口之间来回切换,请使用 Ctrl+al(这是小写 L,代表”last”)。您可以通过状态栏中其名称后面的 “-” 来判断哪个窗口是上一个窗口,就像当前窗口名称后面有 “*” 一样。

tmux active window selected 1540x866 3

你可能会发现,在使用 tmux 时需要跨会话切换窗口。你可以按 Ctrl+a 然后按 w 来显示当前窗口列表。它不会显示已分离会话的窗口。你可以通过方向键滚动列表来选择想要的窗口。

tmux show windows 1540x866 3

看到状态栏里只有数字和 : bash 的窗口可能会有点混乱。所以你可以按 Ctrl+a 然后按 , 来重命名当前窗口。

tmux renaming active window 1540x866 2

在下面的截图中,你可以看到将两个窗口重命名为它们所用项目后的效果。

tmux after renaming windows 1540x866 3

基础命令速查表

下面是一个速查表,列出了你最常使用的 tmux 基础命令。要查看 tmux 所有键盘快捷键的完整列表,请按 Ctrl+a 然后按 ?

命令说明
tmux从 Mac 终端或 Linux 启动 tmux。
tmux new -s [name]启动一个新的命名 tmux 会话。将 [name] 替换为你的会话名称。
tmux a #连接到指定编号的会话。将 # 替换为你的会话编号。
tmux a -t [name]同上,但用于命名会话。
tmux ls显示所有 tmux 会话的完整列表。
tmux kill-session -t [name]关闭命名会话。请注意,这与会话分离不同。分离会话会保持进程运行。
exit退出 tmux 而不分离任何会话。

为什么在本地使用 tmux?

在远程服务器上使用 tmux 意味着网络连接问题可能会中断你的工作,但不会中断你正在运行的进程。考虑到连接问题无法阻止我使用面前这台机器上的命令行,为什么我要在本地使用 tmux?最大的优势在于,一旦我启动终端模拟器,我首选的命令行工作区就已经准备就绪。

在上面的视频中,你可以看到我启动了 Alacritty(我的终端模拟器),并在此之前证明没有其他终端模拟器打开。我能够连接到我正在运行的 “dev” tmux 会话,切换到另一个窗口,切换到我的 “dbi” 会话,然后查看我之前启动的仍在运行的 WP Offload Media 接受测试。如果你仔细观察,你会发现 WP Offload SES 开发、WP Migrate 测试以及与各种存储提供商协作的窗口仍然存在。尽管之前没有打开终端模拟器窗口,但一切就像我离开时一样。

我为目前正在进行的每个项目都设置了一个 tmux 窗口。这些窗口通常至少包含几个窗格,当前工作目录位于项目的源代码树或相关文件夹中。我可以通过快速按 Ctrl+a N 在各项目之间切换,其中 “N” 是窗口编号。因此,要访问我的 WP Offload Media 相关内容,只需按 Ctrl+a 2

在我的”admin”窗口中,我通常在一个窗格里打开htop,因为它可以方便地快速查看是什么在占用我的机器资源(如果系统开始变慢的话)。否则,其他两个窗格通常用于更新我的.dotfiles、阅读man pages,或者做一般的支持工作,比如curl -I https://cdn.example.com/some/customers/bucket/object.png

在使用tmux之前,当我还在使用Mac时,在MercuryMover停止维护后,我使用Magnet来重新排列终端窗口。这对于很好地设置一切并不理想。试图快速到达特定窗口而不求助于我的触控板几乎是不可能的,我一直很难让平铺终端模拟器按我喜欢的方式工作。

最棒的是,tmux更像一个平铺窗口管理器,为你提供了多种方式来访问窗口中的窗格,并根据你的工作流程重新排列它们。如果你正在尝试减少使用鼠标或触控板,你会非常高兴。

事实上,在使用tmux一小段时间后,我开始在我自己的Linux机器上研究平铺窗口管理器。我使用过非常优秀的Qtile窗口管理器很长一段时间,但这些天我倾向于使用i3-gaps。这导致我也在macOS上使用平铺窗口管理器!最终,我忍不住切换到Linux,现在我在桌面上使用NixOS以及前面提到的i3wm分支。所以要警告你,日复一日地使用tmux可能会导致你大幅改善整个桌面体验!😂

当你重启电脑时会发生什么?

“好吧,自作聪明的人,当你重启机器而tmux会话消失时会发生什么?你现在那舒适的多窗口工作区在哪里?”

让我向你介绍我最喜欢的tmux插件,tmux-resurrecttmux-continuum

在这个视频中,我故意杀死我亲爱的”dev”和其他tmux会话,用tmux new -s dev创建一个新会话,然后通过按Ctrl+aCtrl+r,我将之前的会话恢复到被我杀死tmux服务器之前的状态。

能够让我所有的shell会话恢复到离开时的当前工作目录,这非常有用。而且如视频所示,如果有一个程序正在运行,tmux-resurrect认为可以安全重启,比如htopvim,它们也会起死回生!

调整窗格大小和缩放

我喜欢使用tmux作为访问命令行的主要原因之一是它出色的调整大小支持。我之前在概述命令时简要讨论过这一点,但值得再次提及。

tmux resized alongside other windows 1540x866 3

在上面的截图中,我的主要本地终端窗口现在只占用屏幕一半的空间,另一半打开另外两个终端,一个登录到用SpinupWP创建的服务器,另一个是我那古老的iMac。

即使我为了便于你观看而调大了字体大小,tmux仍然能平滑地调整其窗格大小并保持所有比例不变,而且通过用Ctrl+aAlt+2切换到”水平”布局,我那超长的命令提示符没有受到影响。😄

如果我想在保持窗口比正常情况下更紧凑的同时查看更多窗格内容,我可以用Ctrl+az缩放当前窗格。

tmux resized alongside other windows with zoomed pane 1540x866 2

我很喜欢这个功能。它非常适合快速查看日志文件等带有长行的内容,这些内容在较小的终端窗格中通常会换行。

Vim 键位导航

我已经使用 ViVim 超过 25 年了,这就是我的双手进行文本编辑的方式。除了将 Vim 用于一般文本编辑外,我通常会在所有能使用的地方使用”vim 模式”,包括在我的 IDEbash 命令行 中。

因此,值得一提的是,如果我想向上滚动或在当前 tmux 窗格的输出中移动,我只需按下 Ctrl+a,然后使用通常的 Vim 键进行导航,无需离开键盘。

总结

希望这足以概述为什么我认为 tmux 不仅适用于远程命令行工作,也适用于本地开发机器。

如果你还没有尝试过 tmux,你在等什么?!如果你第一次使用 tmux,请在评论中告诉我们你的使用感受,如果你已经是每天使用 tmux 的用户,为什么不在评论中分享你的技巧呢?

分享你的喜爱

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注