tmux复制模式-选择文本块


39

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

这可能吗?


如何在tmux中激活Vi键绑定?
romainl 2012年

增加“设置窗口-g选项模式键六”到〜/ .tmux.conf
Srećko了toRoman

1
看起来您的答案不是使用可视块模式的问题-我也在寻找“多行而不是全宽”。您找到自己的解决方案了吗?
dmonopoly

不,仍然没有解决方案。
Srećko了toRoman

实际上,有一个解决方案。
Srećko了toRoman

Answers:


46

确保检查此帖子的底部是否有需要放入.tmux.conf文件的必要绑定。

我假设您的前缀密钥是Ca:

  • Ca表示:按Ctrl+A
  • Ca [表示:先按Ctrl+ A再按[

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

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

注意,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.

版本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.

取消绑定默认的矩形切换绑定很重要:

unbind-key -t vi-copy v  # Prior to version 2.4
unbind-key -T copy-mode-vi v

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

注意:要使单个.tmux.conf版本适用于所有版本,请参阅此问题


1
非常感谢。重点放在您的tmux.conf上-您可以编辑答案以在开头包含bind-key -t vi-copy'Cv'矩形-toggle。
Srećko了toRoman

原始问题询问如何使用“模式键vi”获得矩形选择。无需重新绑定密钥即可回答此问题。查看其他答案;它只是选择模式中的“ v”和“空格”。
Lqueryvg

除了jkhl不起作用的事实之外,这还行得通,我必须使用箭头键来回移动,有什么办法可以改变这一点?
最高

send和之间有什么区别send-keys。我在superuser.com/questions/196060/selecting-text-in-tmux-copy-mode中 看到了send-key。引号也重要吗?
user2442366

15

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


2
那正是我正在使用的。但这有我上面描述的问题。矩形始终是完整宽度。我需要一个VIM般的矩形(X1,Y1) - (x2,y2):)
Srećko了toRoman

1
@SrećkoToroman您完全指的是什么宽度?
gitaarik 2014年

9

正如Lars指出的那样,v实际上是通过在矩形模式和全行选择模式之间切换来实现您所要的。 spaceenter分别用于开始新选择并复制它。使用前缀输入复制模式,然后使用[粘贴复制的选择到任何tmux窗口]

这也使我感到困惑,因为vvim中的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

我不明白了 给定具有垂直分割的Vim窗口,如何仅在第一个分割中选择矩形?在这里,多行矩形将始终包裹整个Tmux窗格。这不像Vim块选择。我正在使用tmux 1.5,也许您的版本有所不同?
Srećko了toRoman

是的,这里v被映射到开始选择。矩形切换未定义。所以我想你们俩都是对的,我只需要更新我的客户?
Srećko了toRoman

如果在单个tmux窗格中打开了分割的vim窗口,您是否不能使用vim的拉动和粘贴功能?另一方面,如果您有两个tmux窗格,每个窗格都有自己的vim窗口,则tmux select / copy应该能够包装在窗格边缘。我正在使用tmux 1.7
在这里,

6

由于没有其他答案可以为该问题提供最佳的解决方案,因此我无法超越法律界。

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

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

# 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"

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

与Vim相同。


为我工作,请为您的咨询an赞
mahemoff

2

编辑:检查源代码后,我已经完全重写了我的答案。

我最初以为这是不可能的,因为我无法v使它正常工作,但是其他答案是正确的,因为它是正确的密钥,但如何使用它并不明显,特别是如果您习惯使用vim。

同样,这对我也不起作用,因为我必须v遵守begin-selection-我想我一定是从其他地方盲目复制了这个想法,以模仿vim方式开始进行角色明智的选择,不知道这会在以后给以后带来问题块选择。

$ tmux -V
tmux 1.9a
$ tmux list-keys -t vi-copy  | grep " v "
bind-key -t vi-copy      v begin-selection     # suppressed my block selection mode

一旦取消绑定(通过在我的行中注释掉.tmux.conf并重新启动tmux),它便开始起作用,但是仍然相当混乱,因为它与vim根本不一样。

使用默认绑定,它应如下工作:

  1. 请确保您已与TMUX unning setw -g mode-keys vi.tmux.conf
  2. 输入C-a [开始复印模式
  3. 将光标移到您要开始选择的位置
  4. 类型 v
  5. 输入Space开始选择
  6. 移动光标,您将看到一个矩形选择
  7. 您可以v再次按将选择切换回按字符选择,反之亦然。

v按下之前不必键入Space。您可以先从按字符选择Space开始,然后按v切换到矩形选择模式。

它与vim完全不同,在tmux中,您必须键入两个字符:Spacev进入矩形选择模式。在vim中,您只需键入Ctrl-V

同样在vim中v开始按字符选择,而不是阻塞。

可悲的是,tmux中似乎没有按行选择模式(Shift-v在vim中)。
编辑:看起来Tmux版本2.0提供了一个逐行选择模式,但Shift-v我还没有尝试过!


按“ v”,您可以选择行。无需空间。
Amir H. Sadoughi 2015年

1
@ AmirH.Sadoughi,这是因为(根据您的回答)您已经更改了默认设置并绑定了“ v”以开始选择,而不是“ space”。如果您以空的.tmux.conf开头,您应该发现我描述的行为是正确的;您必须按“空格”开始选择。
Lqueryvg

1
感谢您纠正我。为了解决您的最后一句话(关于逐行选择),我想说的是,使用我的配置,我可以使用cv-space进行块选择,而我可以使用v进行行选择。因此,请按“前缀v ”允许我选择行。
Amir H. Sadoughi

我发现很难相信,因为逐行选择仅在最近(Shift-v在我的答案之后)和您的原始答案很久之后才被添加到Tmux(在2015年3月的版本2.0中)。当我们谈论逐行选择时,也许您和我在谈论两件事。请在3种选择模式在VIM比较(与vShift-vCtrl-v)。
Lqueryvg

没错,我刚刚测试过。我的v选择是明智的。我使用的是1.9a版本,没有类似vim的逐行选择。因此,在2.0版中,vim在tmux中也可能具有确切的三种模式,对吗?
Amir H. Sadoughi 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.