tmux בפועל: iTerm2 ו- tmux

יתרונות וחסרונות בשימוש ב- iterm2 לעומת tmux באופן מקומי. כיצד להגדיר פרופיל iTerm2 כדי לעקוף מיפוי מקשים להפעלת פעולות tmux אנלוגיות

זהו החלק השני בסדרת הפוסטים "טמוקס בפועל".

אז אתה משתמש באמולטור מסוף iTerm2 ב- OSX. ושמעת על טמוקס והחלטת לנסות. חפש כאן גוגל, לאחר זמן מה אתה תופס מושגים כמו ריבוב מסופי, חלונות, חלוקת חלוניות, ומבין את השימוש ב- tmux במכונות מרוחקות כדי להתמיד במצב הפעלה ולשרוד ניתוקים פתאומיים.

בשלב מסוים של זמן, אתה עשוי לתהות לגבי השימוש ב- tmux באופן מקומי.

"בהתחשב בכך ש- iTerm כבר יכולה ליצור חלונות וירטואליים מרובים בתוך חלון 'פיזי' אחד, האם ניתן לפצל, להחליף ולשנות את גודל החלונות, האם אני באמת צריך להשתמש ב- tmux במחשב המקומי שלי במקום ב- iTerm?"

כשלמדתי טמוקס, חזרתי שוב ושוב לאותה שאלה. זה לא היה ברור בלי אימון כלשהו. אז החלטתי לנסות, והיום אני יכול לחלוק איתך יתרונות וחסרונות.

iTerm2 לעומת tmux במכונה מקומית: יתרונות וחסרונות

יתרונות:

  • חלונות בשם. דומה לכרטיסיות ב- iTerm, אך תוכל לתת להם שם
  • שורת סטטוס עם מידע כולל על המערכת. כולל מעבד, זיכרון, מצב מקוון / לא מקוון, סוללה, משתמש, מארח ושעת תאריך.
  • כשיש לי שורת סטטוס וערכת חלונות בשם, אני יכול להפוך את iTerm למצב מסך מלא. זה מאפשר לי לעבוד בסביבה נטולת הסחות דעת ולקבל 3 שורות נוספות. אלה נלקחו בעבר על ידי שורת התפריטים של OSX, מסגרת החלונות של iTerm ושורות הכרטיסיות של iTerm.
  • חלון צג לפעילות או שקט. כשאני מריץ פקודה ארוכת טווח בחלונית אחת, אני יכול לעבור לחלונית אחרת ולקבל התראה כאשר לא מופיע פלט נוסף בחלונית הקודמת למשך זמן כלשהו

    ל- iTerm יש משהו דומה, אבל זה רק נודיע לך כאשר הביצוע חוזר לשורת הפקודה, ודורש התקנת שילוב נוסף של מעטפת

  • פריסות חלונות מוגדרות מחדש. שווה-אופקי, שווה-אנכי, ראשי-אופקי, ראשי-אנכי ומרוצף
  • יכולת לעבור בין מספר מפגשי tmux מקומיים לכל פרוייקט כדי להחליף את ההקשר בקלות
  • אם אתה משתמש ב- tmux הן באופן מקומי והן במכונה מרוחקת, תקבל את אותה סביבת מסוף מוכרת
  • כאשר אתה משתמש ב- tmux, אתה מסתמך על תכונות ייחודיות של iTerm2 הרבה פחות

    זה מקל על המעבר לאמולטור מסוף אחר , בין אם זה אותו מערכת הפעלה או מערכת הפעלה אחרת (Linux)

חסרונות:

  • tmux שומרת על מאגר הגלילה לאחור. קשה יותר לגשת אליו ולהעתיק טקסט מאשר ב- iTerm (פשוט גלול ובחר בעזרת העכבר)
  • אם אתה מעתיק טקסט ב- tmux, הוא נשמר במאגר tmux עצמו, ואינו משותף ללוח מערכת ההפעלה שלך כברירת מחדל. כדי להיות צודקים ב 100%, שיתוף עם לוח המערכת עובד ב- iTerm2, אך רק משום שהוא תומך ברצפי בריחה של OSS 52 ANSI המאפשרים ליישום כגון tmux לגשת לאחסון נתונים בלוח. iTerm2 הוא מקרה מיוחד. פשוט נסה להעתיק טקסט ב- tmux הפועל במסוף ברירת המחדל של OSX, שאינו תומך ב- OSC52
  • אם אתה כבר רגיל לקשירת מקשים של iTerm, עליך ללמוד ולעבור לקשירות מקש tmux , שהן מסורבלות. במקום לחיצת הקשה בודדת כמו ⌘⌥->, אתה זקוק לשתי s: preתיקון מקשים ולאחריו מקש אחר, הממופה לפעולת tmux ספציפית.

באופן אישי החלטתי להמשיך עם tmux ותכונותיו, ולהסתמך פחות על תכונות ספציפיות של iTerm2. ואכן, כרגע אני משתמש ב- iTerm כמנהרה ל- tmux?

בעיות עם חיץ ואינטגרציה אלתציגפסגלילה עם לוח OS הן חיוניות מאוד , כי אתה אפילו יכול להחליט לוותר אימוץ 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 במחשב מרוחק של לינוקס ולהשתמש בו?. אם זה נשמע כמו תקורה ענקית, פשוט השתמש ב- 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 שלי.

כמו כן, מצאתי פריסות מוגדרות מראש שימושיות מאוד: אופקי אפילו, אפילו אנכי, ראשי-אופקי, ראשי-אנכי, מרוצף. בדרך כלל אני עובד במערך הראשי-אנכי וצריך להחליף חלונית משנית עם הראשי קדימה ואחורה. זה כל כך נפוץ, עד שאני מחליט להתקין מפתחות (prefix \)מקשים גם ב- tmux וגם ב- 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 "!"'

כצעד נוסף, אתה יכול להגדיר פרופיל iTerm חדש זה כברירת מחדל ולהגיד לו לקפוץ להפעלת tmux מיד בהתחלה.

ואל תשכח להפעיל את iTerm2 במצב מסך מלא. זה שווה את זה.

שילוב מקומי בין iTerm2 ל- tmux

יש אינטגרציה בין iTerm2 ל- tmux המופעלת על ידי iTerm שאולי אתה מעניין.

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