عشق بازی با ترمینال لینوکس (urxvt, رنگآمیزی و کانفیگش)
برای من یکی، ترمینال حکم چوب جادوگری را دارد. یعنی آنقدر قدرت دارد که صاحبش را تنها به دانشاش محدود میکند. در دنیای ترمینال، تقریبا همه چیز ممکن است. این است که لازم میشود بهترین چوب جادوگری ممکن را برای رفع نیازهایمان آماده کنیم.
قبلا در مورد Terminator پستی داشتم ([+](shahinism.com/blog/1391/03/31/%d8%aa%d8%b1%.. "ترمیناتور، آخرالزمان ترمینالها")). تا همین چند روز پیش هم از آن استفاده میکردم. واقعا معرکه بود. همه چیز را آماده داشت و تا جای ممکن کمکت میکرد. اما چند روزی است که [urxvt](software.schmorp.de/pkg/rxvt-unicode.html "urxvt official web page") و قابلیتهایش نظرم را جلب کرده. این است که ضمن جایگزین کردنش با Terminator چیزهایی از آن یاد گرفتم که میخواهم در این پست در موردش صحبت کنم.
رنگآمیزی urxvt و Terminator
اول این که حیفم آمد این روش تغییر رنگ Terminator را که یاد گرفتهام بازگو نکنم. این است که در این پست با یک تیر دو نشان میزنم.
دوم هم این که شاید این کار را بیهوده بدانید. ولی قرار است که مدت زیادی در این ترمینال کار کنیم و به نظرم حیاتیترین کاری که باید انجام دهیم، قابل تحمل کردن رنگبندیاش است ;-)
ترمینالهایی مثل urxvt و Terminator سر جمع ۱۸ رنگ را برای رنگ کردن خروجیشان استفاده میکنند. رنگ پسزمینه، رنگ اصلی خروجی، هشت رنگ تیره و هشت رنگ روشن. سر هم کردن این همه رنگ، جوری که بتوان از ترکیبشان استفاده کرد، جدا کار طاقتفرسایی است. حقیقتش من یکی که هرگز موفق نشدم به صورت دستی این کار را انجام دهم. همین سختی هم باعث شده که [4bit](ciembor.github.com/4bit "4bit webpage") به وجود بیاید. طرز کارش خیلی سر راست و ساده است. پالت رنگتان را ایجاد کنید، و وقتی از خروجی خوشتان آمد روی Get scheme کلیک کنید ([رنگهای مورد استفاده من](raw.github.com/shahinism/Python_scripts/mas.. "my urxvt color scheme")). همانطور که میبینید، برای اکثر ترمینالها یک خروجی حاضر کرده، جز Terminator. خوب اگر میخواهید مثل من urxvt را کانفیگ کنید، کد مربوطهاش را بگیرید و بسته به تنظیمات توزیعتان آن را در .Xdefaults یا .Xresources وارد کنید (برای فهمیدن چند و چون ماجرا man urxvt توضیحات خوبی داده).
حالا برگردیم به تنظیم رنگ برای آن یکی ترمینال محبوبمان. خیلی ساده، همان فایل مربوط به urxvt را بگیرید. [این اسکریپت پایتون](raw.github.com/shahinism/Python_scripts/mas.. "xterm to terminator python script") را که نوشتهام را هم بگیرید و دو تا را کنار هم قرار داده و در ترمینال تایپ کنید:
python xterm_to_terminator.py color_scheme_file
خروجی را کپی کنید و در مسیر .config/terminator/config جایگزین خطوط مربوطه کنید. (همه چیز سر راست است فکر کنم ;-))
یک نکته هم اضافه کنم. 4bit رنگهای خروجیاش را به صورت colorN یا background ارائه میدهد. در حالت کلی خوب است. ولی ممکن است شما دوست نداشته باشید تمام نرمافزارهایی که تنظیم رنگشان را از منابع X میخوانند همین رنگی شود. این است که میتوانید با تبدیل متغیرها به صورت URxvtcolorN یا URxvtbackground آنها را به urxvt محدود کنید ;-)
رنگ آمیزی تمام شد.
کانفیگ urxvt
urxvt عالی است. امکانات فوقالعادهای دارد. ولی تنظیمات پیشفرضش حال به هم زن است! یک ترمینال بی روح سفید نافرم! مشکل سفیدیاش که حل شد. ولی هنوز کار دارد.
font:
نویسندهٔ اصلی urxvt قبلا از mlterm استفاده میکرد. اما همیشه مجبور بود برای دیدن کاراکترهای ژاپنی (یا شایدم چینی) و لاتین، بین فونتهای مختلف سوئیچ کند. چون هیچ فونت مناسبی پیدا نمیکرد که تمام کاراکترهای مورد نیازش را داشته باشد. همین میشود که کلافه از این که چرا توسعه دهندهها فکر میکنند تمام کاراکترهای unicode را میتوان با یک فونت نشان داد، دست به انگولک rxvt میزند و علاوه بر قابلیت یونیکد، پستیبانی از چند فونت را هم به آن اضافه میکند. برای تغییر فونت میتوانید مثل من خط زیر را به .Xdefaults اضافه کنید:
URxvt*font: xft:Terminus:pixelsize=12
و یا اگر فکر میکنید فونت انتخابیتان به حد کافی کامل نیست، از ویژگی چند فونتی به صورت زیر استفاده کنید:
URxvt.font: 9x15bold,
-misc-fixed-bold-r-normal--15-140-75-75-c-90-iso10646-1,
-misc-fixed-medium-r-normal--15-140-75-75-c-90-iso10646-1,
[codeset=JISX0208]xft:Kochi Gothic:antialias=false,
xft:Code2000:antialias=false
یک قابلیت جالب دیگر urxvt این است که میتوان تعیین کرد که نوشتههای Bold, Italic و یا Underline با فونتهای متفاوتی نشان داده شوند. من خودم اینها را تنظیم نکردم (حقیقتش وقت نکردم هنوز) ولی میتوانید در manpage به دنبال کانفیگهای boldFont, italicFont, boldItalicFont و … بگردید.
تنظیم رابط:
اسکرولبار به نظرم چیز زیادیای است. ضمن این که خود urxvt میانبرهایی برای پیمایش متن دارد. همچنین urxvt این قابلیت را دارد که بهش بفهمانیم که چند خط از خروجی ترمینال را برایمان ذخیره کند تا بتوانیم آن را پیمایش کنیم.
URxvt*scrollBar: False
URxvt*scrollTtyOutput: False
URxvt*scrollTtyKeypress: True
URxvt*secondaryScroll: True
URxvt*saveLines: 8000
URxvt*letterSpace: 0
URxvt*cursorBlink: True
URxvt*cursorUnderline: True
پنج خط اول این تنظیمات که باید در فایل منبع Xتان ذخیره کنید مربوط به چیزهایی است که ذکرشان رفت. ممکن است با توجه به شرایط نصب و کانفیگتان احساس کنید که کاراکترهای متن در urxvt کمی فشرده است. تنظیم leterSpace میتواند در این رابطه کمک کند. اعدادی در بازهٔ اعداد صحیح میتواند برای کنترل این آپشن استفاده شود.
همینطور به طور پیشفرض نشانکر Urxvt ثابت است و من دوست دارد که بیحیائی کند و چشمک بزند. و البته به جای آن مربع همیشگی کاراکتر _ را ترجیح میدهم. دو خط آخر این تنظیمات مربوط به همین علایق است ;-)
Modifier:
کلید Modifier همان کلیدی است که برای زدن کاراکترهای ترکیبی (کنترل) urxvt مورد استفاده قرار میگیرد. این کلید قرار است به طور پیشفرض Alt باشد ولی نمیدانم چرا اصلا هیچکدام از Modifier ها برای من کار نمیکرد. اگر شما هم در چنین وضعیتی هستید، با استفاده از خط زیر این ویژگی را تعریف کنید:
URxvt*modifier: alt
افزونهها:
یکی از قابلیتهای خوشگل urxvt افزونههای perlاش است. افزونههایی که قابلیتهای گاها غیرقابل باوری به آن اضافه میکنند. فعلا ما تنها به باورپذیرهایش کار داریم. و اما از آنجایی که افزونههایی که به طور پیشفرض همراه urxvt هستند کفاف نیازمان را نمیدهند، یک چندتایی هم از [اینجا](github.com/muennich/urxvt-perls "urxvt-perls on git") میگیریم.
فایلهای این افزونهها را دریافت کنید، و در مسیر /usr/lib/urxvt/perl (یا اگر ۶۴ بیتی هستید lib64) قرار دهید. حالا خط زیر را برای وارد کردنشان به urxvt اضافه کنید:
URxvt.perl-ext-common : default,matcher,tabbed,keyboard-select,url-select,clipboard
چندتای اول همراه خود i3 هستند که من آن tabbed را خیلی دوست دارم. میگذارد urxvt برایتان تب کند ;-) شوخی کردم، همان تببندی خودمان است. برای این که به طور به درد بخوری کانفیگش کرده باشیم، خطوط زیر را به تنظیمات اضافه کنید (اعداد جلویشان همان شماره رنگها هستند):
URxvt.tabbed.tabbar-fg: 5
URxvt.tabbed.tabbar-bg: 0
URxvt.tabbed.tab-fg: 14
URxvt.tabbed.tab-bg: 0
فوقالعاده است. با Shift و فلش پایین میتوانید تب جدید اضافه کنید. با Shift و فلشهای دو طرف به اینور آنور بروید و با Ctrl+D تب را ببندید. کلیدهای بیشترش را از [ویکی آرچ](wiki.archlinux.org/index.php/Rxvt-unicode#T.. "urxvt tabs on arch wiki") یاد بگیرید ;-)
اما سه افزونهٔ آخر آنهایی هستند که urxvt-perls برایمان ساخته. حقیقتش این است که اینها فقط یه سری تابع ساده به زبان perlاند. پس باید غیر از فعال کردنشان، کلیدهای میانبری برای اجرایشان تعریف کنیم.
تعریف کلید میانبر:
مثل همه جای دیگر، کار بسیار آسانی است. کلید متا یا Modifierمان را که تعریف کردیم، حالا کافیست که با سینتکس:
keysym.: Action
یک کلید میانبر تعریف کنیم. خوب بگذارید کمی مثالهای واقعیتری بزنیم. افزونهٔ اولمان keyboard-select است که قابلیتهای پیمایش ماهی در ترمینال به ما میدهد. تقریبا از ماوس بینیازمان میکند. خطوط زیر را برای کانفیگش اضافه کنید:
URxvt.keysym.M-Escape: perl:keyboard-select:activate
URxvt.keysym.M-s: perl:keyboard-select:search
حالا گفتیم با M-Escape یا همان Alt+Esc تابع پرل به نام keyboard-select را فعال کن. این کلیدها کمک میکند که با کلیدهای میانبر vim درون متن ترمینال پیمایش کنید. همینطور M-s قابلیت سرچ درون متن ترمینال را از تابع keyboard-select رو نویس میکند. (این قابلیت به صورت پیشفرض در urxvt وجود دارد ولی این یکی بهتر است ;-))
افزونهٔ بعدی url-select است. خیلی پیش میآید که میخواهیم تنها روی یک url از توی ترمینال کلیک کنیم. خوبیت ندارد که تابع Search را برای این کار انتخاب کنیم. این است که به صورت زیر این افزونه را فعال میکنیم:
URxvt.keysym.M-u: perl:url-select:select_next
URxvt.url-select.autocopy: True
URvxt.url-select.button: 2
URxvt.url-select.launcher: firefox
URxvt.url-select.underline: True
فکر کنم تنظیمات به قدر کافی گویا هستند. پس دیگر زیاد شلوغش نمیکنم!
و افزونهٔ آخر clipboard که یک کمی دردسرش بیشتر است. این تابع به طور پیشفرض از xsel برای کپی و پیست متن استفاده میکند. (البته در ادامه میگویم که اگر خواستید چطور تغییرش دهید). این برنامه به دستور xsel -ib متن را کپی میکند (میتوانید این دستور را تایپ کنید، انتر کنید، متن مورد نظرتان را تایپ کنید و Ctrl+D بزنید) و با xsel -ob متن را پیست کنید. به نظرم فکر خوبی است که این برنامه را نصب کنید (ضمن این که باقی برنامهها هم عکسالعمل خوبی بعد از نصب این برنامه نشان دادند ;-)) و بعد با خطوط زیر این افزونه را تنظیم کنید:
URxvt.keysym.M-c: perl:clipboard:copy
URxvt.keysym.M-v: perl:clipboard:paste
URxvt.keysym.M-C-v: perl:clipboard:paste_escaped
جای Ctrl+c و یا غیره ما از همان M استفاده کردیم (آن هم از روی کالیبر بالایمان ;-)) ولی اگر دوست دارید که همان کلیدهای همیشگی را داشته باشید، به جای M حرف C بزرگ را تایپ کنید!
اما اگر حال نصب xsel را ندارید و دستور کپی دیگری مد نظرتان است، میتوانید آن دستورها را به صورت زیر جایگزین xsel کنید:
URxvt.clipboard.copycmd: Command
URxvt.clipboard.pastecmd: Command
خوب تا همین اندازه فکر کنم برای شروع کار کافی باشد. فایل کانفیگ کامل من را میتوانید در [این لینک](raw.github.com/shahinism/.configs/master/.X.. "My xdefaults config") ببینید. اما هنوز هم نکاتی هست که ذکرشان خالی از لطف نیست:
نکات اضافه:
- یکی از قابلیتهای خیلی به درد بخور urxvt این است که میتوان به صورت daemon اجرایش کرد. یعنی یک بار هستهٔ daemon را اجرا میکنید و پس از آن ترمینالهای مختلف را روی همان هستهٔ اصلی به صورت کلاینت صدا میکنید. مزیت این کار سرعت خیلی بالای فراخوانی ترمینالهاست. ولی خوب یک مشکل هم دارد. اگر یک ترمینال کرش کند، کل ترمینالها به فنا میروند، ولی خوب مگر تا به حال چند بار ترمینال زیر دستتان کرش کرده؟ این است که روی i3 با هر بار لود مدیر پنجره urxvtd را برای ران شدن daemon صدا میکنم و هر وقت نیاز به ترمینال داشتم urxvtc را اجرا میکنم ;-) توصیه میکنم که این بخش از ویکی آرچ را در این رابطه بخوانید. اسکریپت به درد بخوری است!
- ممکن است بعد از بعد از هر بار تغییر Xdefaults فایل کانفیگ به درستی لود نشود، این است که میتوانید از دستور زیر برای بارگذاری دوبارهاش استفاده کنید:
xrdb -merge ~/.Xdefaults
- قبلا گفتم که میتوان برای حالتهای Bold, Italic و … فونتهای مختلفی تعیین کرد. حالا اضافه میکنم که رنگهای این فونتها نیز قابل تغییر است در manpage به دنبال آپشنهایی مثل colorBD, colorIT, colorUL و … بگردید.
- مسیر پلاگینهای perl برای urxvt به صورت پیشفرض /usr/lib/urxvt/perl است. اما ممکن است دوست نداشته باشید که این افزونهها به صورت systemwide در دسترس باشد. یا شاید شما دسترسی نوشتن در این آدرس را ندارید. با آپشن زیر میتوانید مسیر جدیدی برای این افزونهها اضافه کنید:
perl-lib: PATH
- گاها ممکن است نیاز داشته باشید که ترمینالهایتان را به صورت login shell ران کنید. که خوب مزیتهای خودش را دارد. با اپشن loginShell: True میتوانید به این عمل دست یابید.
- نکتهٔ آخر و خیلی مهم هم این که شما میتوانید تمام این امکاناتی که بحثشان رفت را تنها در زمان فراخوانی urxvt اعمال کنید. تمام آپشنهای ذکر شده، یک آرگومان خط فرمان هم دارند که کار همینها را انجام میدهد.