режим копіювання tmux - виберіть текстовий блок


39

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

Чи можливо це зробити?


Як активувати зв'язки Vi в tmux?
romainl

додайте "set-window-option -g mode-keys vi" у свій ~ / .tmux.conf
Srećko Toroman

1
Схоже, що відповіді не потрапляють на ваше питання щодо використання режиму візуального блоку - "кілька рядків, але не повної ширини" - це теж те, що я шукаю. Ви знайшли власне рішення?
dmonopoly

Ні, все ще немає рішення.
Srećko Toroman

Власне, рішення є.
Srećko Toroman

Відповіді:


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' прямокутник-тумблер.
Srećko Toroman

Оригінальне запитання задає питання про те, як домогтися прямокутного вибору для роботи з "клавішами режиму vi". Щоб відповісти на це запитання, не потрібно повторно прив’язувати клавіші. Дивіться інші відповіді; це просто "v" і "пробіл" у режимі вибору.
Lqueryvg

це працює за винятком того, що jkhl не працює, я маю використовувати клавіші зі стрілками для переміщення, чи є спосіб змінити це?
Макс

Яка різниця між sendі send-keys. Я бачу в superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key використовується. Також важливі лапки?
користувач2442366

15

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


2
Це саме те, що я використовую. Але в цьому є проблема, яку я описав вище. Прямокутник завжди на повну ширину. Мені потрібен VIM-подібний прямокутник (x1, y1) - (x2, y2) :)
Srećko Toroman

1
@ Srećko Toroman, що ти маєш на увазі саме з повною шириною?
gitaarik

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, можливо, у вашій версії він різний?
Srećko Toroman

Так, ось, v відображено для початку вибору. Прямокутник-тумблер не визначений. Тож я думаю, ви обидва праві, мені просто потрібно оновити свого клієнта?
Srećko Toroman

Якщо у вас є одне вікно розділеного vim, відкрите в одній панелі tmux, чи не можете ви скористатися здатністю vim's yank and paste? Якщо з іншого боку, у вас є дві області 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; див. Коментарі до коду вище).

Те саме, що і Вім.


Працювали для мене, майте прихильність до своєї незмінності 👏👏👏
mahemoff

2

EDIT: Після перевірки вихідного коду я повністю переписав свою відповідь.

Спочатку я вважав, що це неможливо, тому що я не міг змусити це працювати, але інші відповіді правильні щодо 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перейти в режим прямокутного вибору. In vim потрібно лише вводити текст Ctrl-V.

Також vim vпочинає символьний вибір, а не блокування.

На жаль, здається, що режим tmux ( Shift-vin vim) не існує лінійного вибору .
EDIT: Схоже, Tmux версії 2.0 забезпечує лінійний режим вибору з Shift-v(я ще не пробував це!)


Натисніть "v", і ви можете вибрати лінії. Не потрібно місця.
Амір Х. Садофі

1
@ AmirH.Sadoughi, це тому, що (відповідно до вашої відповіді) ви змінили параметри за замовчуванням і зв'язали "v", щоб розпочати вибір замість "пробілу". Якщо ви почнете із порожнього .tmux.conf, ви повинні знайти поведінку, яку я описую, правильно; вам потрібно натиснути «пробіл», щоб розпочати вибір.
Lqueryvg

1
Дякуємо, що виправили мене. Щоб вирішити ваше останнє речення (про вибір рядкового), я намагався сказати, що за допомогою мого конфігурації я можу зробити вибір блоку за допомогою cv-простору, і я можу зробити вибір рядка з v. Так, натискаючи "префікс v "дозволяє мені вибирати рядки.
Амір Х. Садофі

Я вважаю, що дуже важко повірити, оскільки рядковий вибір був доданий до Tmux лише нещодавно ( Shift-vу випуску 2.0 березня 2015 року), безумовно, після моєї відповіді та довго після вашої оригінальної відповіді. Можливо, ми з вами говоримо про дві різні речі, коли ми говоримо про лінійний вибір. Будь ласка , порівняйте з 3 режими вибору в VIM (з v, Shift-vа Ctrl-v).
Lqueryvg

Ви маєте рацію, я просто перевірив це. Мій vвибір є мудрим персонажем. Я на версії 1.9a і не маю видоподібної лінійки. Отже, у версії 2.0 точні три режими, які має vim, можливі і в tmux, правда?
Амір Х. Садофі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.