35

Я использую tmux с ключами vi, и копирование / вставка работает нормально, если вы выбираете одну строку текста или если у вас только одно окно. Когда я хочу выделить блок текста (несколько строк, но не на всю ширину), тогда у меня возникают проблемы. Если бы у меня было открыто несколько окон vim, то он бы выделил текст из всех, а мне нужно было выбрать текст только из одного окна. То есть, как визуальный выбор в vim.

Возможно ли это сделать?

5 ответов5

38

Обязательно проверьте нижнюю часть этого поста на наличие необходимых привязок, которые необходимо указать в файле .tmux.conf.

Я предполагаю, что ваш префикс ключ Ca:

  • Ca означает: нажмите Ctrl + A
  • Ca [означает: нажмите Ctrl + A, затем нажмите [

Чтобы сделать выделение текста прямоугольником от (1,1) до (2,2) в tmux:

  • Перейти в режим копирования: Ca [
  • Переместить середину линии
  • Нажмите Cv
  • Пресс Космос
  • Переместить выделение с помощью jkhl
  • Когда вы будете довольны своим выбором, нажмите Enter (или y, если у вас есть привязка в вашем файле настроек).
  • Вы можете вставить последнюю копию буфера: Ca]

Обратите внимание, что нажатие пробела необходимо для выбора прямоугольника.

Чтобы выбрать строки, как обычно, перейдите в режим копирования и нажмите v, выберите с помощью клавиш jkhl и нажмите y.

У меня есть эти привязки в моем .tmux.conf:

До версии 2.4 (20 апреля 2017 г.):

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 который работает в разных версиях, смотрите этот вопрос.

14

Вы можете выбрать визуальный блок, как в vi - наберите v перед началом выделения. На странице руководства это называется "Переключение прямоугольника".

9

Как указывает Ларс, v фактически делает то, что вы просите, переключаясь между режимом прямоугольника и режимом выделения всей строки. space и enter используются соответственно, чтобы начать новый выбор и скопировать его. Войдите в режим копирования, используя свой префикс, затем [ и вставьте скопированный выбор в любое окно 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
5

Поскольку ни один из других ответов не дает оптимального решения проблемы, я не выше некромантии.

Существует способ заставить выделение блоков работать так же, как в 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; см. Комментарии к коду выше).

Так же, как Вим.

2

РЕДАКТИРОВАТЬ: После проверки исходного кода, я полностью переписал свой ответ.

Первоначально я думал, что это невозможно, потому что я не мог заставить это работать, но другие ответы верны о том, что v является правильным ключом для этого, но не совсем понятно, как это использовать, особенно если вы привыкли к vim.

Кроме того , он не будет работать для меня , потому что я v обязан begin-selection - Я думаю , что я должен слепо скопировали эту идею где - то еще , чтобы имитировать ВИМ способ начать мудрый выбор символов, не зная , что это вызовет проблемы в дальнейшем вниз по дороге с выбором блоков.

$ 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 setw -g mode-keys vi в вашем .tmux.conf .
  2. введите C-a [ чтобы запустить режим копирования
  3. переместите курсор туда, где вы хотите начать выделение
  4. тип v
  5. введите Space чтобы начать выбор
  6. переместите курсор, и вы увидите прямоугольное выделение
  7. Вы можете нажать v раз, чтобы переключить выбор назад на посимвольный выбор или наоборот.

Вам не нужно вводить v прежде чем нажать Space . Вы можете начать посимвольное выделение сначала с Space а затем нажать v чтобы переключиться в режим прямоугольного выделения.

Он сильно отличается от vim тем, что в tmux вам нужно ввести два символа: Space и v чтобы войти в режим прямоугольного выделения. В vim вам нужно только набрать Ctrl-V .

Также в vim v начинается выделение символов, а не блок.

К сожалению, в tmux нет режима линейного выделения (Shift-v в vim).
РЕДАКТИРОВАТЬ: похоже, Tmux версии 2.0 обеспечивает режим линейного выбора с Shift-v (хотя я еще не пробовал!)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .