موثرتر کار کنیم - این قسمت tmux !

مقدمه

حتما واسه شما هم پیش اومده که بخواید همزمان چند کار رو توی یک ترمینال انجام بدید یا با چند سرور مختلف کار کنید، قطعا اولین راه حلی که به ذهنتون میرسه اینه که چند تا تب (Tab) باز کنید یا چند ترمینال رو خیلی قشنگ کنار هم بچینید.

چند تا Tab مختلف
چند تا Tab مختلف
چند تا Terminal مختلف
چند تا Terminal مختلف

نقطه ضعف این راه حل ها اینه که همه اش باید یا Alt+Tab بزنید یا Ctrl+Page [up|down] که به اصطلاح فنی تری میشه گفت خیلی Command-Line friendly نیستند.

یکی دیگه از راه حل ها میتونه استفاده از Terminator باشه که شعارش Multi terminal in one window ه. اما نقطه ضعف اش بنظر من حاشیه ی خیلی زیادیه که از خود ترمینال یا همون One window میگیره. پس چی استفاده کنیم ؟

معرفی tmux

برنامه tmux اجازه میده که یک ترمینال رو به چند بخش تقسیم کنید و تو هر بخش یک شل داشته باشید و هر کاری که دوست داشته باشید انجام بدید. در حقیقت tmux یک multiplexerه که باعث میشه خیلی به صورت موثرتری بتونیم از ترمینال استفاده کنیم.

تی ماکس سه تا مفهوم خیلی ساده داره:

1. صفحه ای که توی ترمینال باز میشه بهش Window گفته میشه.

2. هر صفحه رو می تونیم به بخش های مختلقی چه عمودی یا افقی تقسیم کنیم که به هر کدوم از این بخش ها pane گفته میشه.

و اما سومیش Session: تمام این Window ها و pane ها توی یه مفهومی به اسم session نگهداری میشن. توی هر session می تونید تعداد زیادی Window و توی هر Window چندین Pane داشته باشید. اگه یکم راجعبه این سه تا مفهوم گیج شدید شکل پایین همه چیز رو واستون روشن می کنه:

نکته : Session ها یه امکان خیلی جالبی دارن اینه که می تونین یه از یک Session جدا (detach) بشید و session از بین نمیره و توی پس زمینه کارشو ادامه میده و هر وقت هم خواستید می تونید دوباره بهش وصل (Attach) بشید.
معمولا برای کارهای که contextشون متفاوته session های جدایی می سازن. مثلا یک Session برای کارهای شخصیتون باز می کنید ('Personal') و یک session برای کار ('Work').

خب بنظرم دیگه صحبت کردن راجعبه tmux کافیه بریم سراغ نصب و کار باهاش...

نصب برادر tmux

خب روی هر توزیع گنو/لینوکسی که هستین با Package Manger تون tmux رو نصب کنید:

مثلا :

 apt install tmux # Debian and its derivation
 dnf install tmux # Fedora
 yum install tmux # RHEL dudes

خب تنها کاری که باید بکنید اینه که دستور tmux رو بزنید تا یک session برای شما باز بشه و باید چیزی شبیه عکس پایین ببینید:

به اون خطه سبز پایین Status bar میگیم و اطلاعات خوبی اونجا وجود داره اول از همه سمت چپ ترین قسمت توی [ ] اسم هر session نشون داده میشه (اسم Session فعلی ما 0 هست) و بعد از اون شماره هر window (به صورت پیش فرض این شماره ها از صفر شروع میشه) و بعد از ":" مسیری که الان توی اون قرار دارید. سمت راست هم اطلاعات عمومی مثل Hostname، زمان و ساعت نشون داده میشه. تموم این بخش ها قابل سفارشی سازی که بعداً راجعبه شون صحبت می کنیم.

تقسیم بندی Pane

خب تا اینجا با دستور بالا یک session و یک window و یک pane داریم. بریم سراغ اینکه با قسمت های باحال tmux آشنا شیم.

همه دستوراتی که توی tmux می زنیم ترکیبی از دو بخش روبرو هستند: Prefix key + Command-key

خب اول از همه prefix key یا کلید پیشوند میشه گفت دقیقا مثل ایمکسه که قبل از هر دستوری میاد پس شما اول کلید پیشوندی رو میزنید و tmux شروع میکنه به گوش دادن و بعد از اون با command-key بهش می گید چیکار بکنه واستون.


کلید پیشوند بیشتر جاها C-b نوشته شده که Ctrl + b هست.

برای تقسیم کردن به صورت عمودی

C-b %

برای تقسیم کردن window به صورت افقی

C-b "

اما چطور بین این pane ها جابجا بشیم؟ خیلی کار راحتیه کافیه کلید پیشوند رو بزنید و بعدش یکی از کلید های جهت نما رو بزنید، مثلا اگه بخوام برگردم pane سمت چپ می زنم :

← C-b

چیزی که باید تا اینجای کار ببینید
چیزی که باید تا اینجای کار ببینید

اما چطور یک pane رو تو حالت عادی ببندم ؟ مثل هر چیز دیگه ای که توی گنو/لینوکس با Ctrl+d در حقیقت break میشه اینم اینجوری بسته میشه.

منظورم از عادی چی بود؟ بعضی اوقات مثلا فکر کنید ssh زدید به یک سیستم و سرور خاموش شده دیگه شما روی Pane کنترلی ندارید، پس باید یجوری اون رو kill کرد که این کار با C-b x انجام میشه.

اگر هم بخواید روی یک Pane زوم کنید کافیه بزنید C-b z که برای خروج هم دوباره همین کلید رو می زنید. اما بنظرم Pane کافیه بریم سراغ Window و Session یکمم راجعبه اونا بگیم.

مدیریت Window

ایجاد یک Window

خب تا الان ما یک Session با یک Window و چندین Pane داخل همون یک دونه window ساختیم. اما خیلی از مواقع نیازتون بیشتر میشه و می خواید یک window جدید بسازید که کافیه بزنید C-b c که window جدید رو میسازه و سوئیچ میکنه داخل اون. برای اینکه بفهمید الان داخل کدوم Window هستید توی Status bar به * نگاه کنید.

جابجا شدن بین Window ها

برای جابجا شدن بین میتونید از کلید های C-b n که به Next window میره استفاده کنید و واسه اینکه برگردید به Window قبلی از C-b p. یه راه حل دیگه که خیلی راحتره واسه موقعی خوبه که تعداد Window ها زیاد شده استفاده از C-b w هست که یه لیست از تمام Window به شما میده و با کلید های جهت نما بین اونا به راحتی سوئیچ می کنید.

مدیریت Session ها

امکان جالب Detach

خب اول کار گفتیم یکی از امکانات خوب tmux اینه که میشه detach کرد واسه این کار کافیه بزنید C-b d که با این کار از Session جدا میشید ولی Session داره به کار خودش توی پس زمینه ادامه میده.

لیست گرفتن

برای اینکه لیست کل session ها رو ببینید،‌از دستور tmux ls استفاده کنید. به صورت پیش فرض tmux برای هر session یک اسم در نظر میگیره که این اسم معمولا یک عدده. ایده بهتر اینه که به هر session یک اسم معنی دار بدیم. خب اما اگه می خواید به Session قبلی وصل بشید کافیه از فرمت پایین استفاده کنید:

tmux attach -t session_name

ساخت Session

حتما همیشه سعی کنید به هر session یک اسم خوب بدید، با فرمت پایین یک session جدید بسازید:

tmux new -s session_name
# For example tmux new -s Docker

نتیجه گیری

هدف از نوشتن این پست این بود که یاد بگیریم چطور از خط فرمان به صورت خیلی موثرتری و حرفه ای تری استفاده کنیم. قطعا tmux محدود به چند تا کامند هایی که من گفتم نمیشه و خیلی کارهای بیشتری باهاش میشه انجام داد. اول از همه سعی کنید خوب باهاش کار کنید و بعد از یک مدت از این همه کلید میانبر خسته میشد و به فکر سفارشی کردن اون باشید.

از اینجا کجا بریم؟

آموزش ها و منابع زیادی روی اینترنت واسه ادامه کار وجود داره و لیست پایین پیشنهاد های من هست:

https://linode.com/docs/networking/ssh/persistent-terminal-sessions-with-tmux/
  • یک Cheat sheet خیلی خووب

https://gist.github.com/MohamedAlaa/2961058

* یک تنظیمات از قبل نوشته که معروف به Oh my Tmux و خیلی چیز باحالیه حتما تستش کنید:

https://github.com/gpakosz/.tmux