在 Tmux 中轻松复制文本的方法总结

2025-06-07

在 Tmux 中轻松复制文本

结论

如何在 Tmux 中轻松复制文本

如果你使用过 tmux 一段时间,你会发现在 tmux 中用鼠标高亮文本并复制文本是一件非常痛苦的事情。这是因为 tmux 的设计就是这样的。如果你用过 Microsoft Word / Google Docs 等文本编辑软件,以及某种程度上用过 Atom / VSCode / IntelliJ,那么拿起鼠标,高亮文本正文,然后按下 Ctrl + C 键,可能感觉很自然。

tmux 则不然。使用 tmux 复制更像在 Vim 中复制,在 Vim 中,最好使用键盘而不是鼠标。这是在 tmux复制模式下完成的。在本文中,我将向您展示如何利用 tmux 复制模式轻松复制文本。

Vi 复制模式

Tmux 在很多方面与 Vim 相似。其中之一就是它们都是模态程序。这意味着,要完成特定任务,你需要切换到针对该任务优化的模式。Vim 有一个普通模式,你可以在其中使用键盘移动。Vim 的普通模式专为在文件内移动(以及在一定程度上修改)而设计。如果你需要插入文本,则需要切换到 Vim 的插入模式。

要浏览终端历史记录并复制文本,您需要切换到 tmux 复制模式(技术上它是 vi-copy-mode,但为了简单起见,我们称之为复制模式)。

那么复制模式到底是什么?

如果您尝试使用鼠标从 tmux 窗口复制文本,您可能会看到一条警告,提示您无法直接复制文本。从 tmux 复制文本的正确方法是先切换到复制模式,然后复制文本,最后粘贴。

要启用此复制模式,请在 tmux 配置文件中添加:

setw -g mode-keys vi
Enter fullscreen mode Exit fullscreen mode

然后保存并执行 tmux 配置。这将启用 vi mode-keys。如果您不确定 tmux 配置,请查看我之前关于 tmux 配置的文章。

要进入复制模式,请使用Ctrl + [。您应该能够在 tmux 窗口的右上角看到一个黄色的视觉指示器。这样,您现在就可以使用 vim 导航键进行移动了。

虽然 tmux 复制模式无法完全转换为 vim 导航键,但总体来说,它们已经足够好用,使用起来感觉很自然。以下是一些你可以使用的导航键:

  • h / j / k / l向左/向下/向上/向右移动
  • w / W / e / E / b / B向前移动到开头/到结尾/向后移动一个单词或WORD
  • { / }向后/向前移动一个段落
  • Ctrl + e / d / f向下滚动一行/半屏/全屏
  • Ctrl + y / u / b向上滚动一行/半屏/整屏
  • / / ?向前/向后搜索
  • n / N向前/向后重复上一次搜索
  • ETC

还有更多导航键。请查看内部内容man tmux并搜索mode-keys关键字。

在此模式下,您可以像在 Vim 中一样在终端中移动。要退出此模式,请按qEnter

要开始突出显示,请按Space。注意,光标将突出显示其下方的字母。随着光标的移动,突出显示范围会扩大。

选中所有要复制的文本后,按下Enter。复制模式会自动退出。复制的文本存储在 tmux 缓冲区中。缓冲区是内存中分配的一块空间,用于 tmux 临时存储数据。

要从 tmux 缓冲区粘贴,请按Ctrl + ]。哇!恭喜,您已经用 tmux 轻松复制了一段文本!

回顾一下:

  • 添加setw -g mode-keys vi你的 tmux 配置
  • Ctrl + [进入 tmux vi 复制模式
  • 使用 vim 导航键移动
  • 开始突出显示Space
  • 复制Enter
  • 粘贴Ctrl + ]

让复制粘贴更直观

我发现很多复制粘贴的键不太直观。让我们修改一下,让它模仿 Vim 的键绑定。

回想一下,vim 有一个可视化模式 ( v),可以让你高亮显示文本正文。你还可以使用 来“复制”文本。最后,你可以使用y粘贴复制的文本pP

让我们使用类似的键盘映射。在 tmux 配置中添加以下几行:

bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy"
bind P paste-buffer
bind -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel "pbcopy"
Enter fullscreen mode Exit fullscreen mode

第一行, ,让你在复制模式下bind -T copy-mode-vi v send -X begin-selection按下 来开始选择(高亮)。第二行允许你使用 来提取文本。第三行允许我们使用 来从 tmux 缓冲区(文本保存的地方)粘贴。最后一行是个额外的功能。它允许你复制用鼠标高亮的文本(注意,它与第二行的效果相同)。vcopy-mode-viyCtrl + P

请注意,在第二行和第四行,我使用了pbcopy。我需要用它将复制的文本通过管道传输到我的 Mac 剪贴板中。如果你使用的是 Linux,请省略pbcopy:

bind-key -T copy-mode-vi y send -X copy-selection-and-cancel
bind-key -T copy-mode-vi MouseDragEnd1Pane send-keys -X copy-pipe-and-cancel
Enter fullscreen mode Exit fullscreen mode

与往常一样,不要忘记保存并获取配置文件。使用此新设置,工作流程如下:

  1. 使用以下方式进入复制模式Ctrl + [
  2. 使用 vim 导航将自己定位到要复制的文本的开头
  3. 开始突出显示v(类似于 vim 可视模式)
  4. 使用y
  5. 粘贴Prefix + P

我使用大写字母 P 而不是小写字母 p,因为Prefix + p这是 tmux 转到上一个窗口的方式(回想一下:Prefix + p转到上一个窗口和Prefix + n转到下一个窗口。如果您不熟悉这一点,我强烈建议您阅读我的第一篇 tmux 文章)。

利用 Vi 模式

vi-copy-mode 不仅可以用来复制文本,你还可以使用它来快速搜索你的终端。

例如,在终端中,如果您要查找文本,可以按下Cmd + f(或Ctrl + f)并输入要搜索的字符串。此方法有局限性。首先,您只能搜索精确的字符串(如果您不是搜索字符串“mux”,而是想同时搜索“mux”、“mix”和“max”,该怎么办?)。其次,如果窗口中有多个窗格,此方法将在所有窗格中搜索文本(如果您需要将搜索范围限制在当前窗格中,该怎么办?)。第三,它仅限于当前 tmux 上显示的内容。由于 tmux 滚动的特性,它无法搜索显示窗口上方的文本。

更好的搜索方式是利用 vi 复制模式。回想一下,在 Vim 中,你可以使用 向前搜索/,使用 向后搜索?。在 vi 模式下,你也可以这样做。

假设我需要在终端中搜索“redis_1”。我的操作如下。

从 tmux 会话内部进入 vi 模式:

Prefix + [
Enter fullscreen mode Exit fullscreen mode

然后使用以下方式向后搜索:

? + KEYWORD
Enter fullscreen mode Exit fullscreen mode

在这种情况下,KEYWORD 是“redis_1”。我发现自己用的?比 还多/,因为 80% 的时间我都会向后搜索。Tmux 应该会高亮显示所有“redis_1”文本。要跳转到后续或之前的匹配项,请使用nN。太棒了!

等等,还有更多!就像你可以在 Vim 中使用正则表达式搜索一样,你也可以在 tmux 中使用正则表达式!

假设我想搜索“redis_1”或“node_1”或“rails_1”之类的单词,我可以使用以下命令搜索所有这些单词[a-z]+_1

? + [a-z]+_1
Enter fullscreen mode Exit fullscreen mode

正则表达式细分:

  • [a-z]是小写 az
  • +表示一个或多个后续字符(即 az)。[a-z]+表示一个或多个任意小写字母字符
  • _1是一个文字下划线,后跟一个文字下划线。

这将匹配“redis_1”、“node_1”和“rails_1”(它还将匹配“java_1”、“sidekiq_1”等字符串。

如果您只想匹配“redis_1”,“node_1”或“rails_1”,则可以使用组匹配:

? + (redis|node|rails)_1
Enter fullscreen mode Exit fullscreen mode

太酷了!我不会在这里讨论正则表达式,因为它超出了本文的讨论范围。重点是,在 tmux 中使用 vi 模式搜索是一个强大的工具,尤其是如果你精通正则表达式的话(即使你不精通,只要掌握一点正则表达式知识,就能取得很大进展)。

Emacs 复制模式

如果你查看man tmux页面,就会发现除了 vi-copy-mode 之外,tmux 还有一个 emacs-copy 模式。它与 vi-copy-mode 类似,但它使用的是 emacs 的快捷键绑定,而不是 vi 的快捷键绑定。

如果你更喜欢 emacs(别担心,我们仍然可以做朋友),并且想要将其设置为使用 emacs 的按键绑定,请查看页面man tmux下方的mode-keys章节。在那里,你会找到如何设置的说明,以及一个按键映射列表。

结论

在本文中,我们学习了如何利用复制模式更轻松地从 tmux 终端进行复制粘贴。我们还学习了如何配置它以模拟 vim 的复制粘贴行为。此复制模式可以用作有效的搜索工具。

Tmux 是一款功能强大的工具。它与 Vim 配合得很好。为了进一步增强其功能,你可以将其配置为与 Vim 的行为方式相同。

祝您黑客愉快!

文章来源:https://dev.to/igredible/the-easy-way-to-copy-text-in-tmux-319g
PREV
个人项目的项目管理生命周期 项目概述 项目
NEXT
2020 年如何学习 Vim 为什么要学习 Vim 学习 Vim 的技巧/窍门 Vim 资源 如何使用 :help 结论