یادداشتی برای کانفیگ i3
[در ارسال قبلی](shahinism.com/blog/1391/04/15/%d8%aa%d8%ac%.. "تجربهٔ کار با i3 یک رقیب قدر!") از میزکار [i3](i3wm.org "i3 official website") صحبت کردم. قرار شد در این پست در مورد کانفیگ و رفع نیازهای اولیهمان روی این مدیرپنجره صحبت کنیم. اول از همه طبق معمول باید این میزکار را نصب کنیم. همانطور که در پست قبل گفتم این میزکار از نوع اعلان فونت X استفاده میکند که متاسفانه در فونتهایی که من امتحان کردم نتوانستم تایتل فارسی پنجرهها را به درستی نمایش دهم (دوست خوبم فرود در کامنتهای [پست قبل](shahinism.com/blog/1391/04/15/%d8%aa%d8%ac%.. "تجربهٔ کار با i3 یک رقیب قدر!") گفتند که از قرار با فونت Ubuntu مشکل حل شده بود). پس از [تماس با توسعه دهندگان](faq.i3wm.org/question/208/unicode-title-for.. "unicode question on i3faq") i3 و راهنماییشان، برای پشتیبانی از xft و طبیعتا دست بازتر در انتخاب فونتها سورس را با [این پچ](aur.archlinux.org/packages/i3/i3-pango/i3-p.. "i3 pango patch") آماده کردم. دوستان آرچر میتوانند از این [بسته](aur.archlinux.org/packages.php?ID=59344 "i3 pango aur") برای نصب استفاده کنند. اما باقی که میخواهند خودشان کامپایل کنند کافیست پچ را در پوشهٔ سورس کپی کنند و با دستور زیر ترتیب کار را بدهند:
patch -p1 < i3-wm-pango.patch
دوستان اسلکوری هم میتوانند باقی کار را به این [Slackbuild](slackbuilds.org/result/?search=i3&sv=13.. "i3 & i3status slackbuilds") بسپارند. پس از نصب میزکار را اجرا کنید. چیزی که ما میخواهیم در نهایت شبیهش شویم به صورت زیر است:
قبل از این که بگویید این که چیزی ندارد تا بخواهیم کانفیگش کنیم بگذارید بگویم که دو روز وقتم را گرفت تا بتوانم به اینجا برسانمش ;-)
برای شروع کار میخواهیم فونت میزکار را تعیین کنیم. فایل کانفیگ i3 برای هر کاربر از شاخهٔ ~/.i3/config خوانده میشود (توجه داشته باشید که در اولین اجرا اگر این فایل وجود نداشته باشد برنامهٔ کانفیگ خودکار i3 شروع میشود و از شما میپرسد که کدام کلید را به عنوان metaیتان تعریف کند و بعد این فایل ساخته میشود-اگر هم نشد در [userguide](i3wm.org/docs/userguide.html "i3 userguide") دنبالش بگردید و مسیرش را ببینید!) فایل کانفیگ را پیدا میکنیم و دنبال خط زیر میگردیم:
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
و آن را به صورت زیر ویرایش میکنیم:
font xft:Terminus 9
همچنین از آنجا که ترمینال پیشفرض i3 را دوست نداریم و میخواهیم Terminator جایگزینش شود به دنبال # start a terminal میگردیم و خط زیرش را به صورت زیر ویرایش میکنیم:
bindsym $mod+Return exec --no-startup-id terminator
در ادامهٔ کار با کانفیگهای پیشفرض i3 میسازیم، جز این که یک مشکل کوچک و قابل حل وجود دارد. آن هم این که بعد از تغییر layout کیبورد به فارسی دیگر کلیدهای میانبر میزکارمان کار نمیکنند و باید layout را انگلیسی کنیم تا به کار بیافتند. برای حل این مشکل باید به جای کلیدهای bindsym (کلیدهای میانبری که با اسم کلید مثلا shift, Return و ... تعریف میشوند) از bindcode استفاده کنیم. برای نمونه ما کلیدهای میانبر تغییر layout را به این صورت تعریف میکنیم.
کلیدهای مدنظر ما برای تغییر صفحه کلید Alt+Shift است. اول از همه در اول فایل کانفیگ یک متغیر به اسم $mod1 که به Alt اشاره میکند به صورت زیر تعریف میکنیم:
set $mod1 Mod1
و سپس خطوط زیر را در انتهای فایل کانفیگ اضافه میکنیم:
bindcode $mod1+62 exec ~/.i3/changekb.sh
bindcode $mod1+50 exec ~/.i3/changekb.sh
خوب حالا این دو خط چه میکنند؟ دستور bindcode به i3 میفهماند که باید از کد کلیدهای کیبورد برای شناسایی کلید ترکیبی استفاده کند. $mod1 را هم که پیشتر خودمان به عنوان کلید Alt تعریف کردیم. حالا میماند اعداد ۶۲ و ۵۰. این اعداد کدهایی هستند که کلیدهای شیفت چپ و راست کیبورد با آنها شناخته میشوند و دقیقا مختص همین کلیدها هستند. برای کشفشان میتوانید در ترمینال برنامهٔ xev را اجرا کنید کلید مورد نظرتان را فشار دهید و در خروجیها به دنبال عبارت keycode و عدد روبرویش بگردید.
exec هم فرمانی است که با استفاده از آن میتوانیم یک اسکریپت خارجی را اجرا کنیم که در اینجا ما اسکریپتی که layout را بررسی میکند و با توجه به وضعیت فعلیاش آن را به انگلیسی یا فارسی تغییر میدهد را به آن شناساندیم. پس لازم است کد زیر را که مربوط به این اسکریپت است در فایل changekb.sh وارد کرده و فایل را به پوشهٔ .i3 در پوشهٔ خانگیتان کپی کنید:
#This is a script for changing keyboard between English and Persian layouts
if [ `setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'` = us ];
then echo "EN"; echo "changing to IR..."; setxkbmap ir;
else echo "IR"; echo "Changing to US..."; setxkbmap us ;
fi
نکته اینجاست که نمیدانم چرا Alt+Shift راست پس از تغییر layout به فارسی قادر به بازگردانیش به انگلیسی نیستند، در حالی که کلیدهای سمت چپ به راحتی این کار را انجام میدهند! البته این کار مزیتی برای خودش دارد و آن هم این که با استفاده از کلیدهای سمت راست دیگر خیالم راحت است که کیبورد فارسی است ;-)
در ادامه به حیاتیترین بخش میزکارمان میرسیم. بخش گزارشگیری! نوار پایینی میزکار توسط برنامهٔ i3bar کنترل میشود. این برنامه میتواند خروجی برنامههای مختلف را در خود نمایش دهد. خود i3 برنامهای به اسم i3status برای گزارشگیری دارد که من زیاد از آن خوشم نیامد. این شد که تصمیم گرفتم از conky برای این بخش استفاده کنم. چون هم ابزارهای بیشتری دارد و هم قابلیت اجرای یک اسکریپت خارجی را بدون درد و خونریزی! این شد که به دنبال خط bar که احتمالا در انتهای فایل کانفیگ قرار دارد میگردیم و در میان آکولادهای روبرویش دو خط زیر را اضافه میکنیم:
font -*-terminus-bold-*-*-*-12-*-*-*-*-*-iso10646-*
status_command exec conky -c ~/.i3/i3conky
خط اول این دستور که فونت terminus را برای خروجی i3bar تعریف کرده را میتوانید نادیده بگیرید و یا به صورت xft مثل دفعهٔ قبل تعیین کنید. اما خط دوم دستور conky را با فایل کانفیگ i3conky که در شاخهٔ .i3 قرار دارد اجرا میکند. پس لازم است این فایل را ایجاد کنید و دستورات زیر را در آن کپی کنید:
background no
out_to_console yes
double_buffer no
short_units yes
out_to_x no
update_interval 1.0
total_run_times 0
use_spacer right
TEXT
CPU: ${cpu cpu1},${cpu cpu2},${cpu cpu3},${cpu cpu4} @ FRQ: $freq | RAM:$mem/${memmax} ($memperc%) ${if_up eth0}| LAN: D:${downspeed eth0} U:${upspeed eth0} ${endif} \
| ${exec ~/.i3/kbstatus.sh} | VOL: $mixer | ${time %a %d.%m.%y} ${time %H:%M}
توضیح آرگومانهای این فایل بماند به عهدهٔ خودتان. فقط من برای دیدن وضعیت فعلی صفحه کلید اسکریپت تغییر صفحه کلید را ویرایش کردم و آن را به اسم kbstatus.sh در شاخهٔ .i3 قرار دادم تا از conky آن را فرا بخوانم. این اسکریپت فقط layout فعلی را در خروجی نشان میدهد و کدش به صورت زیر است:
#!/usr/bin/bas
setxkbmap -print | grep xkb_symbols | awk '{print $4}' | awk -F"+" '{print $2}'
کانفیگ میزکارمان دیگر تقریبا تمام شده. فقط میماند یک چند تا ریزه کاری. i3 به صورت پیشفرض صفحه را از طرفی که بزرگتر است نصف میکند. پس دز عمدهٔ مانیتورها این مسیر به صورت افقی تعریف میشود. حال آن که من تقسیم عمودی را بیشتر ترجیح میدهم. پس با خط زیر به i3 میفهمانم که این کار را طبق نظر من انجام دهد:
default_orientation vertical
همچنین میخواهم تعدادی از برنامههایم مثل mdic یا vlc به صورت float (تایل نشده) باز شوند که برای این کار دستورات زیر را اضافه میکنم:
for_window [class="Vlc"] floating enable
for_window [class="Mdic"] floating enable
for_window [instance="DTA"] floating enable
for_window [instance="Download"] floating enable
for_window [instance="xfce4-notifyd"] floating enable
مقدار class و یا instance را میتوانید پس از ران کردن دستور xprop WM_CLASS و سپس کلیک روی برنامهٔ مورد نظر به دست آورید. مثلا در مورد فایرفاکس خروجی به صورت زیر است:
WM_CLASS(STRING) = "Navigator", "Firefox"
که Nvigator مقدار instance و Firefox مقدار class است. توجه داشته باشید که این مقدار Case sensetive است!
من فایل کانفیگ i3 و اسکریپتهای مورد استفادهام را روی [این کانال git](github.com/shahinism/i3-wm-theme "my i3 wm theme on git") گذاشتهام. برای پیبردن بیشتر به جزئیات میتوانید از آنها استفاده کنید!