tmux 复制模式 - 选择文本块

Sre*_*man 52 vim tmux

我正在使用带有 vi 键的 tmux,只要您选择一行文本,或者如果您只有一个窗口,复制/粘贴就可以正常工作。当我想选择一个文本块(多行,但不是全宽)时,我遇到了麻烦。如果我打开了多个 vim 窗口,那么它将从所有窗口中选择文本,而我需要的是仅从一个窗口中选择文本。也就是说,就像 vim 中的视觉选择一样。

这是可能的吗?

小智 58

确保检查这篇文章的底部是否需要进入 .tmux.conf 文件的必要绑定。

我假设您的前缀键是 Ca:

  • Ca 表示:按Ctrl+A
  • Ca [ 表示:按Ctrl+A然后按[

要在 tmux 中对从 (1,1) 到 (2,2) 的文本进行矩形选择

  • 进入复制模式:Ca [
  • 移动线的中间
  • 按简历
  • 新闻空间
  • 使用 jkhl 移动选择
  • 一旦您对选择感到满意,请按 Enter(如果您的 conf 文件中有绑定,则按 y)。
  • 您可以通过以下方式粘贴最新的复制缓冲区: Ca ]

请注意,space矩形选择需要按下。

要像通常那样选择行,请进入复制模式,然后按 v,使用 jkhl 键进行选择,然后按 y。

我的 .tmux.conf 中有这些绑定:

2.4 版之前(2017 年 4 月 20 日)

setw -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection     # Begin selection in copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle  # Begin selection in copy mode.
bind-key -t vi-copy 'y' copy-selection      # Yank selection in copy mode.
Run Code Online (Sandbox Code Playgroud)

2.4 版之后:

setw -g mode-keys vi
bind-key -T copy-mode-vi 'v' send -X begin-selection     # Begin selection in copy mode.
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle  # Begin selection in copy mode.
bind-key -T copy-mode-vi 'y' send -X copy-selection      # Yank selection in copy mode.
Run Code Online (Sandbox Code Playgroud)

解除默认矩形切换绑定很重要:

unbind-key -t vi-copy v  # Prior to version 2.4
unbind-key -T copy-mode-vi v
Run Code Online (Sandbox Code Playgroud)

否则新的“Cv”绑定不起作用。

注意:要拥有一个.tmux.conf跨版本工作的单曲,请参阅此问题


Lar*_*off 17

您可以像在 vi 中一样选择一个可视块——v在开始选择之前输入。在联机帮助页中,这称为“矩形切换”。

  • 这正是我正在使用的。但这有一个我上面描述的问题。矩形总是全宽。我需要一个类似 VIM 的矩形 (x1, y1) - (x2, y2) :) (2认同)

her*_*ere 12

正如 Lars 指出的那样,v实际上通过在矩形模式和全线选择模式之间切换来满足您的要求。 spaceenter分别用于开始一个新的选择并复制它。使用您的前缀进入复制模式,然后使用以下命令将[您复制的选择粘贴到任何 tmux 窗口中]

这也让我感到困惑,因为v在 vim 中的功能space与在 tmux 中的功能一样,以开始选择。

:list-keys -t vi-copy在 tmux 中发出将在复制模式下显示完整的命令表。

bind-key -t vi-copy    C-b page-up                                                      
bind-key -t vi-copy    C-c cancel
bind-key -t vi-copy    C-e scroll-down
bind-key -t vi-copy    C-f page-down
bind-key -t vi-copy    C-h cursor-left
bind-key -t vi-copy  Enter copy-selection
bind-key -t vi-copy    C-y scroll-up
bind-key -t vi-copy Escape clear-selection
bind-key -t vi-copy  Space begin-selection
bind-key -t vi-copy      $ end-of-line
bind-key -t vi-copy      , jump-reverse
bind-key -t vi-copy      / search-forward
bind-key -t vi-copy      0 start-of-line
bind-key -t vi-copy      1 start-number-prefix
bind-key -t vi-copy      2 start-number-prefix
bind-key -t vi-copy      3 start-number-prefix
bind-key -t vi-copy      4 start-number-prefix
bind-key -t vi-copy      5 start-number-prefix
bind-key -t vi-copy      6 start-number-prefix
bind-key -t vi-copy      7 start-number-prefix
bind-key -t vi-copy      8 start-number-prefix
bind-key -t vi-copy      9 start-number-prefix
bind-key -t vi-copy      : goto-line
bind-key -t vi-copy      ; jump-again
bind-key -t vi-copy      ? search-backward
bind-key -t vi-copy      B previous-space
bind-key -t vi-copy      D copy-end-of-line
bind-key -t vi-copy      E next-space-end
bind-key -t vi-copy      F jump-backward
bind-key -t vi-copy      G history-bottom
bind-key -t vi-copy      H top-line
bind-key -t vi-copy      J scroll-down
bind-key -t vi-copy      K scroll-up
bind-key -t vi-copy      L bottom-line
bind-key -t vi-copy      M middle-line
bind-key -t vi-copy      N search-reverse
bind-key -t vi-copy      T jump-to-backward
bind-key -t vi-copy      W next-space
bind-key -t vi-copy      ^ back-to-indentation
bind-key -t vi-copy      b previous-word
bind-key -t vi-copy      e next-word-end
bind-key -t vi-copy      f jump-forward
bind-key -t vi-copy      g history-top
bind-key -t vi-copy      h cursor-left
bind-key -t vi-copy      j cursor-down
bind-key -t vi-copy      k cursor-up
bind-key -t vi-copy      l cursor-right
bind-key -t vi-copy      n search-again
bind-key -t vi-copy      q cancel
bind-key -t vi-copy      t jump-to-forward
bind-key -t vi-copy      v rectangle-toggle
bind-key -t vi-copy      w next-word
bind-key -t vi-copy BSpace cursor-left
bind-key -t vi-copy  NPage page-down
bind-key -t vi-copy  PPage page-up
bind-key -t vi-copy     Up cursor-up
bind-key -t vi-copy   Down cursor-down
bind-key -t vi-copy   Left cursor-left
bind-key -t vi-copy  Right cursor-right
bind-key -t vi-copy   C-Up scroll-up
bind-key -t vi-copy C-Down scroll-down
Run Code Online (Sandbox Code Playgroud)


and*_*ejr 7

由于其他答案都没有给出问题的最佳解决方案,因此我并没有超越死灵法术。

有一种方法可以让块选择以与 Vim 中相同的方式工作,而无需按空格。只是一个简单的 Ctrl-V,在您的肌肉记忆中根深蒂固。
它需要编辑您的 .tmux.conf (但使用 vi-mode 已经这样做了),我不确定它是否适用于 tmux < 2.4。

将此添加到您的 .tmux.conf 以复制 Vim 选择和 yank 绑定:

# set vi-mode
set-window-option -g mode-keys vi
# keybindings
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle \; send -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# comment the preceding line and uncomment the following to yank to X clipboard
# bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"
Run Code Online (Sandbox Code Playgroud)

进入选择模式并导航到要开始选择的位置。现在v开始常规(逐字符,逐行)选择,<C-v>开始块选择和V(shift-v)开始行选择。无论选择的类型如何,都会y猛拉到 tmux 粘贴缓冲区(或 X 剪贴板;请参阅上面的代码注释)。

和 Vim 一样。