Режим копирования tmux - выберите текстовый блок

39

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

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

Сречко Тороман
источник
Как активировать привязки клавиш Vi в tmux?
Ромен
добавьте "set-window-option -g mode-keys vi" в ваш ~ / .tmux.conf
Сречко Тороман
1
Похоже, что ответы не доходят до вашего вопроса об использовании режима визуального блока - «несколько строк, но не полная ширина» - это то, что я ищу. Вы нашли свое собственное решение?
dmonopoly
Нет, до сих пор нет решения.
Сречко Тороман
На самом деле, есть решение.
Сречко Тороман,

Ответы:

46

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

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

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

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

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

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

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

Амир Х. Садуги
источник
1
Огромное спасибо. Акцент делается на вашем tmux.conf - вы можете отредактировать ответ, включив вначале bind-key -t vi-copy 'Cv' rectangle-toggle.
Сречко Тороман
Оригинальный вопрос спрашивает, как получить прямоугольное выделение, работая с «ключами режима vi». Нет необходимости повторно связывать ключи, чтобы ответить на этот вопрос. Смотрите другие ответы; это просто "v" и "пробел" из режима выбора.
Lqueryvg
это работает кроме того факта, что jkhl не работает, я должен использовать клавиши со стрелками для перемещения, есть ли способ изменить это?
Макс
В чем разница между sendи send-keys. Я вижу в superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key используется. Также важны ли кавычки?
user2442366
15

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

Ларс Котхофф
источник
2
Это именно то, что я использую. Но это проблема, которую я описал выше. Прямоугольник всегда на всю ширину. Мне нужен VIM-подобный прямоугольник (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman, что вы имеете в виду именно с полной шириной?
Гитаарик
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
Вот
источник
Я не понимаю это снова. Учитывая окно Vim с вертикальным разделением, как вы выбираете прямоугольник только в первом разделении? Здесь многострочный прямоугольник всегда будет охватывать всю панель Tmux. Это не похоже на выбор блока Vim. Я использую tmux 1.5, может в вашей версии все по другому?
Сречко Тороман,
Да, здесь, v отображается на начало-выбор. Переключатель прямоугольника не определен. Думаю, вы оба правы, мне просто нужно обновить моего клиента?
Сречко Тороман,
Если у вас открыто разделенное окно vim на одной панели tmux, разве вы не можете использовать способность 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; см. Комментарии к коду выше).

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

andrejr
источник
Работай на меня, возненавидь свою некомантию cy
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 вам нужно ввести два символа: Spaceи vперейти в режим прямоугольного выделения. В vim нужно только набрать Ctrl-V.

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

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

Lqueryvg
источник
Нажмите «V», и вы можете выбрать строки. Не нужно места.
Амир Х. Садуфи
1
@ AmirH.Sadoughi, это потому, что (согласно вашему ответу) вы изменили значения по умолчанию и связали «v», чтобы начать выбор вместо «пробел». Если вы начнете с пустого .tmux.conf, вы обнаружите, что описанное мной поведение является правильным; Вы должны нажать «пробел», чтобы начать выбор.
Lqueryvg
1
Спасибо, что поправили меня. Чтобы обратиться к вашему последнему предложению (о строчном выделении), я пытался сказать, что с помощью моего конфига я могу сделать выбор блока с помощью cv-space, и я могу сделать выбор строки с помощью v. Итак, нажимая префикс v "позволяет мне выбирать строки.
Амир Х. Садуфи
Мне очень трудно в это поверить, потому что линейный выбор был добавлен в Tmux только недавно ( Shift-vв выпуске 2.0, март 2015 г.), конечно после моего ответа и намного позже вашего первоначального ответа. Возможно, мы с тобой говорим о двух разных вещах, когда говорим о линейном выборе. Пожалуйста, сравните с 3 режимами выбора в VIM (с v, Shift-vи Ctrl-v).
Lqueryvg
Вы правы, я только что проверил это. Мой vвыбор мудрый характер. Я на версии 1.9a и у меня нет vim-подобного линейного выбора. Итак, с версией 2.0, три режима, которые есть у vim, возможны и в tmux, верно?
Амир Х. Садуфи