tmux на практиці: iTerm2 та tmux

Переваги та недоліки використання iterm2 проти tmux локально. Як налаштувати профіль iTerm2 для перевизначення зіставлення ключів для запуску аналогових дій tmux

Це друга частина серії публікацій “tmux in practice”.

Отже, ви використовуєте емулятор терміналу iTerm2 на OSX. І ви чули про tmux і вирішили спробувати. Google тут, Google там, через деякий час ви розумієте такі поняття, як мультиплексування терміналів, вікна, розбиття панелей і розумієте використання tmux на віддалених машинах для збереження стану сеансу та виживання різких відключень.

У якийсь момент часу ви можете задатися питанням про використання tmux локально.

"Враховуючи, що iTerm вже може створювати кілька віртуальних вікон в одному" фізичному "вікні, може розділяти, міняти місцями та змінювати розмір панелей, чи справді мені потрібно використовувати tmux на моєму локальному комп'ютері замість iTerm?"

Коли я вивчав tmux, я знову і знову повертався до того самого питання. Це не було зрозуміло без певної практики. Тому я вирішив спробувати, і сьогодні я можу поділитися з вами перевагами та недоліками.

iTerm2 проти tmux на локальній машині: переваги та недоліки

Переваги:

  • Названі вікна. Подібно до вкладок у iTerm, але ви можете дати їм назву
  • Рядок стану із загальносистемною інформацією. Включає процесор, пам’ять, стан в режимі он-лайн / офлайн, акумулятор, користувача, хоста та час.
  • Маючи всередині нього рядок стану та набір вікон з іменами, я можу перевести iTerm у повноекранний режим. Це дозволяє мені працювати в середовищі без відволікання, а також отримувати додаткові 3 ряди. Раніше вони були зроблені рядком меню OSX, віконною рамою iTerm та рядком вкладок iTerm.
  • Вікно монітора для активності чи тиші. Коли я запускаю тривалу команду на одній панелі, я можу перейти на іншу панель і отримувати сповіщення, коли на попередній панелі протягом певного інтервалу більше результатів не з’являється

    iTerm має щось подібне, але мова йде лише про те, щоб повідомити вас, коли виконання повернеться до командного рядка, і вимагає встановлення додаткової інтеграції оболонки

  • Визначені макети вікон. Рівно-горизонтальні, парно-вертикальні, основні-горизонтальні, головно-вертикальні та кахельні
  • Можливість перемикання між кількома локальними сесіями tmux для кожного проекту, щоб легко перемикати контекст
  • Якщо ви використовуєте tmux як локально, так і на віддаленій машині, ви отримаєте те саме звичне середовище терміналу
  • Коли ви використовуєте tmux, ви набагато менше покладаєтесь на унікальні функції iTerm2

    Це полегшує перехід на інший емулятор терміналу , будь то в тій самій ОС чи іншій (Linux)

Недоліки:

  • tmux підтримує власний буфер прокрутки. Доступ до нього та копіювання тексту складніше, ніж у iTerm (просто прокрутіть та виберіть мишею)
  • Якщо ви копіюєте текст у tmux, він зберігається у власному буфері tmux і за замовчуванням не передається в буфер обміну ОС. Щоб бути коректним на 100%, спільний доступ із системним буфером обміну працює в iTerm2, але лише тому, що він підтримує екранні послідовності OSC 52 ANSI, які дозволяють додатку, такому як tmux, отримувати доступ та зберігати дані в буфері обміну. iTerm2 - це особливий випадок. Просто спробуйте скопіювати текст у tmux, який працює у терміналі OSX за замовчуванням, який не підтримує OSC52
  • Якщо ви вже звикли до сполучень клавіш iTerm, вам потрібно навчитися та перейти на клавіатури tmux , які є громіздкими. Замість одного натискання клавіші, як ⌘⌥->, вам потрібно два s: preвиправлення клавіш, за якими слідує інший ключ, зіставлений із певною дією tmux.

Особисто я вирішив продовжити роботу з tmux та його функціями і менше покладатися на специфічні функції iTerm2. Справді, зараз я використовую iTerm просто як тунель до tmux?

Проблеми з буфером прокрутки та інтеграцією з буфером обміну ОС надзвичайно важливі , тому ви навіть можете вирішити відмовитися від прийняття tmux. Ми розглянемо ці теми в моїх майбутніх публікаціях.

Перевизначте зіставлення ключів iTerm, щоб викликати дію tmux

Сьогодні давайте подивимося, як ми можемо використовувати знайомі поєднання клавіш iTerm під час роботи в середовищі tmux. Ідея полягає в тому, щоб зіставити натискання клавіш у iTerm для запуску дій tmux.

Найпростішим способом було б просто перейти .tmux.confі зіставити дії tmux з цими прив'язками клавіш. Наприклад, щоб змінити розмір панелі в iTerm, ми використовуємо “ ^⌘↑”, давайте відобразимо те ж натискання клавіші в tmux дещо наївно:

bind ^⌘↑ resize-pane -U

Однак наведений вище код не буде працювати, оскільки ви не можете використовувати ⌘ у прив'язках клавіш tmux, а використання SHIFT також дуже обмежене. І навіть це було можливо, iTerm перехопить це натискання клавіші раніше.

Натомість ми встановлюємо новий профіль iTerm і замінюємо зіставлення ключів для надсилання заздалегідь налаштованих послідовностей байтів, які ініціюватимуть відповідні дії в tmux.

Наприклад, при ^⌘↑натисканні “ ” послідовність байтів 0x01 0x1b 0x5b 0x31 0x3b 0x35 0x41надсилається через термінал до запущеного екземпляра tmux. Він інтерпретує їх як C-a C-↑прив'язку клавіш та активатори resize-pane -Uвідповідно до нашої .tmux.confконфігурації.

То як ви можете отримати ці шістнадцяткові коди? Використовуйте showkey, odабо hexdumpкоманди для перегляду довічних натискань клавіша з клавіатури:

$ showkey -aPress any keys - Ctrl-D will terminate this program
^A 1 0001 0x01^[[1;5A 27 0033 0x1b 91 0133 0x5b 49 0061 0x31 59 0073 0x3b 53 0065 0x35 65 0101 0x41

Примітка : showkeyнедоступний на OSX, але ви завжди можете SSH на віддаленій машині Linux і використовувати його?. Якщо це звучить як величезні накладні витрати, просто використовуйте o d або hexdump.

$ od -t x1
^A^[[1;5A // press C-a C-↑ on your keyboar0000000 01 1b 5b 31 3b 35 410000007

Ви можете переназначити будь-який ключ таким чином, але я роблю це лише для найбільш поширених, які мають аналогову дію в tmux.

До кінця дня я можу створити нові панелі tmux за допомогою ⌘Dта ⌘⇧D, вибрати панелі за допомогою ⌘⌥→ , ^Tab, щоб перейти до останнього використовуваного вікна, ⌘⇧Enter, щоб збільшити область, ^⌘←змінити розмір панелі ліворуч, ⌘[ вибрати попередню панель, ⌘Wщоб убити поточну панель, і так далі. Отже, мені не потрібно боротися зі своєю м’язовою пам’яттю за найпоширеніші дії.

Для всіх інших дій без кореспонденції я все ще використовую tmux way: C-aпрефікс, а потім ключ дії. Якщо вам цікаво повний список таких прив'язок клавіш і як все це працює в дії, перегляньте мій репозиторій tmux-config.

Also, I’ve found predefined layouts to be very useful: even-horizontal, even-vertical, main-horizontal, main-vertical, tiled. I usually work in main-vertical layout, and need to swap secondary pane with main forth and back. This is so common, that I decide to setup a keybinding both in tmux (prefix \) and iTerm (⌘\).

# Swap panes back and forth with 1st pane# When in main-(horizontal|vertical) layouts, the biggest/widest panel is always @1bind \ if '[ #{pane_index} -eq 1 ]' \ 'swap-pane -s "!"' \ 'select-pane -t:.1 ; swap-pane -d -t 1 -s "!"'

As an extra step, you can setup this new iTerm profile as default, and tell it to jump into tmux session right at the start.

And don’t forget to run you iTerm2 in full screen mode. It’s worth it.

Native integration between iTerm2 and tmux

There is an integration between iTerm2 and tmux powered by iTerm that you might be interesting in.

The idea is that iTerm still handles window and pane management, maintain scrollback buffers, copy/paste as usual, but all windows are backed by tmux session under the hood. It’s tmux session indeed, but abstracted and encapsulated by familiar iTerm environment for you. You can close iTerm, open it back and reattach to previous session, without state lost.

However, it makes little sense for local environment (only useful in case of an iTerm crash which is an extremely rare event). Personally, I don’t like this approach, because it hides me from the fact I’m using tmux, and exposes only those most common tmux features, which have analogues in iTerm (create window, split pane, resize window/pane, close session).

Resources and links

Tmuxintegration · Wiki · George Nachman / iterm2 · GitLab — //gitlab.com/gnachman/iterm2/wikis/TmuxIntegration

iTerm2 keymaps for tmux — Dan Lowe — //tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Auto-Starting Tmux in iTerm2 — Sašo Matejina — Medium — //medium.com/@sasom/auto-starting-tmux-in-iterm2-4276182d452a

samoshkin/tmux-config: Tmux configuration, that supercharges your tmux to build cozy and cool terminal environment — //github.com/samoshkin/tmux-config