在 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
然后保存并执行 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 中一样在终端中移动。要退出此模式,请按q
或Enter
。
要开始突出显示,请按Space
。注意,光标将突出显示其下方的字母。随着光标的移动,突出显示范围会扩大。
选中所有要复制的文本后,按下Enter
。复制模式会自动退出。复制的文本存储在 tmux 缓冲区中。缓冲区是内存中分配的一块空间,用于 tmux 临时存储数据。
要从 tmux 缓冲区粘贴,请按Ctrl + ]
。哇!恭喜,您已经用 tmux 轻松复制了一段文本!
回顾一下:
- 添加
setw -g mode-keys vi
你的 tmux 配置 Ctrl + [
进入 tmux vi 复制模式- 使用 vim 导航键移动
- 开始突出显示
Space
- 复制
Enter
- 粘贴
Ctrl + ]
让复制粘贴更直观
我发现很多复制粘贴的键不太直观。让我们修改一下,让它模仿 Vim 的键绑定。
回想一下,vim 有一个可视化模式 ( v
),可以让你高亮显示文本正文。你还可以使用 来“复制”文本。最后,你可以使用或y
粘贴复制的文本。p
P
让我们使用类似的键盘映射。在 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"
第一行, ,让你在复制模式下bind -T copy-mode-vi v send -X begin-selection
按下 来开始选择(高亮)。第二行允许你使用 来提取文本。第三行允许我们使用 来从 tmux 缓冲区(文本保存的地方)粘贴。最后一行是个额外的功能。它允许你复制用鼠标高亮的文本(注意,它与第二行的效果相同)。v
copy-mode-vi
y
Ctrl + 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
与往常一样,不要忘记保存并获取配置文件。使用此新设置,工作流程如下:
- 使用以下方式进入复制模式
Ctrl + [
- 使用 vim 导航将自己定位到要复制的文本的开头
- 开始突出显示
v
(类似于 vim 可视模式) - 使用
y
- 粘贴
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 + [
然后使用以下方式向后搜索:
? + KEYWORD
在这种情况下,KEYWORD 是“redis_1”。我发现自己用的?
比 还多/
,因为 80% 的时间我都会向后搜索。Tmux 应该会高亮显示所有“redis_1”文本。要跳转到后续或之前的匹配项,请使用n
或N
。太棒了!
等等,还有更多!就像你可以在 Vim 中使用正则表达式搜索一样,你也可以在 tmux 中使用正则表达式!
假设我想搜索“redis_1”或“node_1”或“rails_1”之类的单词,我可以使用以下命令搜索所有这些单词[a-z]+_1
:
? + [a-z]+_1
正则表达式细分:
[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
太酷了!我不会在这里讨论正则表达式,因为它超出了本文的讨论范围。重点是,在 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