مدیریت جایگزین پنجره در لینوکس

من یکی از کسانی هستم که Caps Lock را برای تغییر طرح‌بندی تنظیم می‌کنم، زیرا وقتی می‌توانم یکی را فشار دهم برای فشار دادن 2 کلید تنبل هستم. من حتی 2 کلید غیر ضروری را می خواهم: از یکی برای روشن کردن طرح انگلیسی و دومی برای روسی استفاده می کنم. اما دومین کلید غیرضروری فراخوانی منوی زمینه است که به قدری غیرضروری است که توسط بسیاری از تولیدکنندگان لپ‌تاپ قطع می‌شود. پس باید به آنچه که دارید راضی باشید.

و همچنین نمی‌خواهم هنگام جابجایی پنجره‌ها به دنبال نمادهای آن‌ها در نوار وظیفه بگردم یا هنگام پیمایش نام‌ها را بگیرم. زبانه + زبانهمی‌خواهم یک کلید ترکیبی را فشار دهم (در حالت ایده‌آل فقط یک کلید، اما دیگر کلیدهای غیرضروری رایگان وجود ندارد) و بلافاصله به پنجره‌ای که نیاز دارم برسم. به عنوان مثال مانند این:

  • Alt+F: فایرفاکس
  • Alt+D: Firefox (مرور خصوصی)
  • Alt+T: ترمینال
  • Alt+M: ماشین حساب
  • Alt+E: IntelliJ Idea
  • و غیره.

علاوه بر این، با فشار دادن، برای مثال، روی Alt+M من می خواهم ماشین حساب را بدون در نظر گرفتن اینکه آیا این برنامه در حال حاضر اجرا می شود، ببینم. اگر در حال اجرا است، باید به پنجره آن فوکوس داده شود و در غیر این صورت، برنامه مورد نظر را اجرا کنید و هنگام بارگذاری فوکوس را منتقل کنید.

برای مواردی که توسط اسکریپت قبلی پوشش داده نشده اند، می خواهم کلیدهای ترکیبی جهانی داشته باشم که به راحتی به هر یک از پنجره های باز اختصاص داده شود. به عنوان مثال، من 10 ترکیب اختصاص داده شده از Alt + 1 به Alt + 0، که به هیچ برنامه ای وابسته نیستند. من فقط می توانم کلیک کنم Alt + 1 و پنجره ای که در حال حاضر در فوکوس است با کلیک کردن فوکوس دریافت می کند Alt + 1.

در زیر برش شرحی از چند ویژگی دیگر و پاسخی به نحوه انجام این کار وجود دارد. اما من فوراً به شما هشدار خواهم داد که در صورت نیاز به استفاده از Windows، Mac OS یا حتی رایانه شخص دیگری با لینوکس، چنین شخصی سازی "برای خودتان" می تواند باعث اعتیاد شدید و حتی کناره گیری شود.

در واقع، اگر در مورد آن فکر کنید، ما روزانه از این تعداد برنامه استفاده نمی کنیم. یک مرورگر، یک ترمینال، یک IDE، نوعی پیام رسان، یک مدیر فایل، یک ماشین حساب و، شاید، تقریباً همه اینها. ترکیب کلیدهای زیادی برای پوشش 95 درصد کارهای روزمره مورد نیاز نیست.

برای برنامه هایی که چندین پنجره باز دارند، می توان یکی از آنها را به عنوان اصلی تعیین کرد. به عنوان مثال، شما چندین پنجره IntelliJ Idea را باز و به آنها اختصاص داده اید Alt + E. در شرایط عادی، وقتی فشار می دهید Alt + E برخی از پنجره های این برنامه باز می شود، به احتمال زیاد پنجره ای که ابتدا باز شده است. با این حال، اگر بر روی آن کلیک کنید Alt + E هنگامی که یکی از پنجره های این برنامه از قبل در فوکوس است، این پنجره خاص به عنوان پنجره اصلی تخصیص داده می شود و هنگامی که ترکیب های بعدی فشار داده می شود، به آن فوکوس داده می شود.

پنجره اصلی را می توان دوباره اختصاص داد. برای این کار ابتدا باید ترکیب را ریست کنید و سپس پنجره دیگری را به عنوان پنجره اصلی به آن اختصاص دهید. برای تنظیم مجدد یک ترکیب، باید خود ترکیب را فشار دهید و سپس یک ترکیب تنظیم مجدد خاص، من آن را به آن اختصاص داده ام Alt+Backspace. با این کار اسکریپتی فراخوانی می شود که تخصیص پنجره اصلی ترکیب قبلی را لغو می کند. و سپس می توانید یک پنجره اصلی جدید را همانطور که در پاراگراف قبلی توضیح داده شد اختصاص دهید. بازنشانی یک پنجره مرتبط به ترکیبات جهانی به همین ترتیب انجام می شود.

مقدمه طولانی شد، اما می خواستم ابتدا بگویم که چه کاری انجام خواهیم داد و سپس نحوه انجام آن را توضیح دهم.

برای کسانی که از خواندن خسته شده اند

به طور خلاصه، لینک اسکریپت ها در انتهای مقاله قرار دارد.

اما هنوز نمی توانید آن را بلافاصله نصب و استفاده کنید. ابتدا باید بفهمید که چگونه اسکریپت پنجره مورد نظر را پیدا می کند. بدون این، نمی توان به فیلمنامه گفت که تمرکز دقیقاً به کجا باید منتقل شود. و باید بدانید که اگر ناگهان پنجره مناسبی پیدا نشد چه کاری باید انجام دهید.

و من روی نحوه پیکربندی اجرای اسکریپت ها با فشار دادن کلیدهای ترکیبی تمرکز نمی کنم. به عنوان مثال، در KDE در تنظیمات سیستم → میانبرها → میانبرهای سفارشی قرار دارد. این باید در سایر مدیران پنجره نیز وجود داشته باشد.

معرفی wmctrl

Wmctrl - ابزار کنسول برای تعامل با X Window Manager. این برنامه کلیدی برای اسکریپت است. بیایید نگاهی گذرا به نحوه استفاده از آن بیندازیم.

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

$ wmctrl -lx
0x01e0000e -1 plasmashell.plasmashell             N/A Desktop — Plasma
0x01e0001e -1 plasmashell.plasmashell             N/A Plasma
0x03a00001  0 skype.Skype                         N/A Skype
0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)
...

گزینه -l لیستی از تمام پنجره های باز را نمایش می دهد و -NNS نام کلاس را به خروجی اضافه می کند (اسکایپ.اسکایپ, Navigator.Firefox و غیره). در اینجا به شناسه پنجره (ستون 1)، نام کلاس (ستون 3) و نام پنجره (ستون آخر) نیاز داریم.

با استفاده از گزینه می توانید سعی کنید پنجره ای را فعال کنید -a:

$ wmctrl -a skype.Skype -x

اگر همه چیز طبق برنامه پیش رفت، پنجره اسکایپ باید روی صفحه ظاهر شود. اگر به جای گزینه -x گزینه استفاده -i، سپس به جای نام کلاس می توانید شناسه پنجره را مشخص کنید. مشکل id این است که هر بار که برنامه راه اندازی می شود شناسه پنجره تغییر می کند و ما نمی توانیم آن را از قبل بدانیم. از سوی دیگر، این ویژگی به طور منحصربه‌فرد یک پنجره را شناسایی می‌کند، که وقتی یک برنامه بیش از یک پنجره را باز می‌کند، می‌تواند مهم باشد. بیشتر در این مورد کمی بیشتر.

در این مرحله باید به خاطر داشته باشیم که پنجره مورد نظر را با استفاده از regex با خروجی جستجو خواهیم کرد wmctrl -lx. اما این بدان معنا نیست که ما باید از چیز پیچیده ای استفاده کنیم. معمولاً نام کلاس یا نام پنجره کافی است.

اساساً، ایده اصلی باید از قبل روشن باشد. در تنظیمات کلیدهای میانبر/میانبر جهانی برای مدیر پنجره خود، ترکیب مورد نیاز را برای اجرای اسکریپت پیکربندی کنید.

نحوه استفاده از اسکریپت ها

ابتدا باید برنامه های کاربردی کنسول را نصب کنید wmctrl и xdotool:

$ sudo apt-get install wmctrl xdotool

در مرحله بعد باید اسکریپت ها را دانلود کرده و به آنها اضافه کنید $ PATH. من معمولا آنها را داخل می گذارم ~/bin:

$ cd ~/bin
$ git clone https://github.com/masyamandev/Showwin-script.git
$ ln -s ./Showwin-script/showwin showwin
$ ln -s ./Showwin-script/showwinDetach showwinDetach

اگر دایرکتوری ~/bin در آنجا نبود، پس باید آن را ایجاد کنید و راه اندازی مجدد (یا دوباره وارد شوید)، در غیر این صورت ~/bin ضربه نمی زند $ PATH. اگر همه چیز به درستی انجام شود، اسکریپت ها باید از کنسول قابل دسترسی باشند و تکمیل Tab باید کار کند.

اسکریپت اصلی نشان می دهد 2 پارامتر می گیرد: اولی یک regex است که به وسیله آن پنجره مورد نیاز را جستجو می کنیم و پارامتر دوم دستوری است که در صورت یافت نشدن پنجره مورد نیاز باید اجرا شود.

می توانید یک اسکریپت را اجرا کنید، به عنوان مثال:

$ showwin "Mozilla Firefox$" firefox

اگر فایرفاکس نصب شده باشد، پنجره آن باید فوکوس شود. حتی اگر فایرفاکس اجرا نمی شد، باید شروع می شد.

اگر کار کرد، می توانید اجرای دستورات را روی ترکیبات پیکربندی کنید. در تنظیمات کلیدهای میانبر/میانبر جهانی اضافه کنید:

  • Alt+F: نمایش فایرفاکس "Mozilla Firefox$".
  • Alt+D: showwin "Mozilla Firefox (Private Browsing)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chromium-browser
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -incognito"
  • Alt+S: showwin "skype.Skype" skypeforlinux
  • Alt+E: showwin “jetbrains-idea” idea.sh

و غیره هرکسی می‌تواند ترکیب کلیدها و نرم‌افزار را به دلخواه خود پیکربندی کند.
اگر همه چیز به درستی انجام شود، با استفاده از ترکیب های بالا می توانیم به سادگی با فشار دادن کلیدها بین ویندوز جابجا شویم.

من دوستداران کروم را ناامید خواهم کرد: می تواند یک پنجره معمولی را با خروجی خود به طور ناشناس تشخیص دهد wmctrl شما نمی توانید، نام کلاس ها و عنوان پنجره ها یکسان است. در regex پیشنهادی، کاراکترهای N* و I* فقط مورد نیاز هستند تا این عبارات منظم با یکدیگر متفاوت باشند و بتوان آنها را به عنوان پنجره اصلی اختصاص داد.

برای تنظیم مجدد پنجره اصلی ترکیب قبلی (در واقع برای regex، که نشان می دهد آخرین بار تماس گرفته شد) باید اسکریپت را فراخوانی کنید showwin جدا کردن. من این اسکریپت را به یک کلید ترکیبی اختصاص داده ام Alt+Backspace.

در فیلمنامه نشان می دهد یک تابع دیگر وجود دارد هنگامی که با یک پارامتر فراخوانی می شود (در این مورد پارامتر فقط یک شناسه است)، به هیچ وجه regex را بررسی نمی کند، بلکه همه پنجره ها را مناسب می داند. این به خودی خود بی فایده به نظر می رسد، اما به این ترتیب می توانیم هر پنجره ای را به عنوان پنجره اصلی تعیین کنیم و سریعاً به آن پنجره خاص سوئیچ کنیم.

من ترکیبات زیر را پیکربندی کرده ام:

  • Alt+1: showwin "CustomKey1"
  • Alt+2: showwin "CustomKey2"
  • ...
  • Alt+0: showwin "CustomKey0"
  • Alt+Backspace: showwinDetach

به این ترتیب من می توانم هر پنجره ای را به ترکیبات متصل کنم Alt + 1...Alt + 0. فقط با کلیک کردن Alt + 1 من پنجره فعلی را به این ترکیب متصل می کنم. من می توانم با کلیک کردن صحافی را لغو کنم Alt + 1و بعد Alt+Backspace. یا پنجره را ببندید، این نیز کار می کند.

در ادامه چند جزییات فنی را به شما خواهم گفت. لازم نیست آنها را بخوانید، اما فقط سعی کنید آنها را تنظیم کنید و ببینید. اما من همچنان توصیه می‌کنم قبل از اجرای اسکریپت‌های دیگران در رایانه خود، آنها را درک کنید :).

نحوه تشخیص بین ویندوزهای مختلف یک برنامه

در اصل، اولین مثال "wmctrl -a skype.Skype -x" کار می کرد و می توان از آن استفاده کرد. اما بیایید دوباره به مثال فایرفاکس نگاه کنیم که در آن 2 پنجره باز است:

0x04400003  0 Navigator.Firefox                   N/A Google Переводчик - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Лучшие публикации за сутки / Хабр - Mozilla Firefox (Private Browsing)

پنجره اول حالت عادی و دومی مرور خصوصی است. من می خواهم این پنجره ها را به عنوان برنامه های کاربردی مختلف در نظر بگیرم و با استفاده از کلیدهای ترکیبی مختلف به آنها سوئیچ کنم.

لازم است اسکریپتی که ویندوز را تغییر می دهد پیچیده شود. من از این راه حل استفاده کردم: نمایش لیستی از تمام ویندوزها، انجام دهید grep استفاده توسط regex، خط اول را با سر، ستون اول را دریافت کنید (این شناسه پنجره خواهد بود) با استفاده از برش، به پنجره با شناسه تبدیل شوید.

باید یک شوخی در مورد عبارات منظم و دو مشکل وجود داشته باشد، اما در واقع من از چیز پیچیده ای استفاده نمی کنم. من به عبارات منظم نیاز دارم تا بتوانم انتهای خط را نشان دهم (نماد "$") و "Mozilla Firefox$" را از "Mozilla Firefox (Private Browsing)$" متمایز کنم.

دستور چیزی شبیه به این است:

$ wmctrl -i -a `wmctrl -lx | grep -i "Mozilla Firefox$" | head -1 | cut -d" " -f1`

در اینجا می توانید ویژگی دوم اسکریپت را حدس بزنید: اگر grep چیزی را برنگرداند، برنامه مورد نظر باز نیست و باید آن را با اجرای دستور از پارامتر دوم شروع کنید. و سپس به طور دوره ای بررسی کنید که آیا پنجره مورد نیاز برای انتقال تمرکز به آن باز شده است یا خیر. من روی این موضوع تمرکز نمی‌کنم؛ هر کسی که به آن نیاز دارد به منابع نگاه می‌کند.

زمانی که پنجره های برنامه قابل تشخیص نیستند

بنابراین، ما یاد گرفتیم که چگونه فوکوس را به پنجره برنامه مورد نظر منتقل کنیم. اما اگر یک برنامه بیش از یک پنجره باز داشته باشد چه؟ روی کدام یک تمرکز کنم؟ اسکریپت بالا به احتمال زیاد به اولین پنجره باز منتقل می شود. با این حال، ما می خواهیم انعطاف پذیری بیشتری داشته باشیم. می‌خواهم بتوانم به خاطر بیاورم که به کدام پنجره نیاز داریم و به آن پنجره خاص سوئیچ کنیم.

ایده این بود: اگر بخواهیم یک پنجره خاص را برای یک ترکیب کلید به خاطر بسپاریم، باید این ترکیب را زمانی که پنجره مورد نظر در فوکوس است فشار دهیم. در آینده با فشار دادن این ترکیب، تمرکز روی این پنجره قرار می گیرد. تا زمانی که پنجره بسته شود یا برای این ترکیب اسکریپت ریست انجام دهیم showwin جدا کردن.

الگوریتم اسکریپت نشان می دهد چیزی مثل این:

  • بررسی کنید که آیا قبلاً شناسه پنجره ای که باید فوکوس به آن منتقل شود را به خاطر آورده ایم.
    اگر به یاد دارید و چنین پنجره ای هنوز وجود دارد، ما تمرکز را به آن منتقل می کنیم و خارج می شویم.
  • ما نگاه می‌کنیم که کدام پنجره در حال حاضر در فوکوس است، و اگر با درخواست ما مطابقت داشت، شناسه آن را به خاطر بسپارید تا در آینده به آن بروید و از آن خارج شوید.
  • حداقل به پنجره ای مناسب در صورت وجود می رویم یا برنامه مورد نظر را باز می کنیم.

با تبدیل خروجی آن به فرمت هگزا دسیمال، می توانید با استفاده از ابزار کنسول xdotool متوجه شوید که کدام پنجره در حال حاضر در فوکوس است:

$ printf "0x%08x" `xdotool getwindowfocus`

ساده ترین راه برای به خاطر سپردن چیزی در bash، ایجاد فایل ها در یک سیستم فایل مجازی واقع در حافظه است. در اوبونتو این به طور پیش فرض فعال است /dev/shm/. من نمی توانم در مورد توزیع های دیگر چیزی بگویم، امیدوارم چیزی مشابه وجود داشته باشد. می توانید با دستور نگاه کنید:

$ mount -l | grep tmpfs

اسکریپت دایرکتوری های خالی در این پوشه ایجاد می کند، مانند زیر: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. علاوه بر این، هر بار که آن را فراخوانی کنید، یک Symlink ایجاد می کند /dev/shm/$USER/showwin/showwin_last بر /dev/shm/$USER/showwin/$SEARCH_REGEX. این برای حذف شناسه پنجره برای ترکیب خاصی با استفاده از یک اسکریپت در صورت لزوم مورد نیاز است showwin جدا کردن.

چه چیزی را می توان بهبود بخشید

در مرحله اول، اسکریپت ها باید به صورت دستی پیکربندی شوند. مطمئناً به دلیل نیاز به کنکاش و انجام کارهای زیادی با دستان خود، بسیاری از شما حتی سعی نمی کنید سیستم را پیکربندی کنید. اگر می‌توانستید بسته را به سادگی نصب کنید و همه چیز را راحت‌تر پیکربندی کنید، شاید محبوبیت بیشتری پیدا کند. و سپس نگاه کنید، برنامه در توزیع های استاندارد منتشر می شود.

و شاید بتوان آن را راحت تر انجام داد. اگر با شناسه یک پنجره می‌توانید شناسه فرآیندی را که آن را ایجاد کرده است، و با شناسه فرآیند می‌توانید بفهمید که کدام دستور آن را ایجاد کرده است، می‌توانید تنظیمات را به صورت خودکار انجام دهید. در واقع من متوجه نشدم که آیا آنچه در این پاراگراف نوشتم امکان پذیر است یا خیر. واقعیت این است که من به شخصه از نحوه کار در حال حاضر راضی هستم. اما اگر کسی غیر از من کل رویکرد را مناسب بداند و کسی آن را بهبود بخشد، خوشحال خواهم شد که از راه حل بهتری استفاده کنم.

مشکل دیگر همانطور که قبلاً نوشتم این است که در برخی موارد نمی توان پنجره ها را از یکدیگر متمایز کرد. تا کنون من این را فقط با حالت ناشناس در کروم/کروم مشاهده کرده‌ام، اما شاید در جای دیگر چیزی مشابه وجود داشته باشد. به عنوان آخرین راه حل، همیشه گزینه ترکیب های جهانی وجود دارد Alt + 1...Alt + 0. باز هم من از فایرفاکس استفاده می کنم و شخصا این مشکل برای من مهم نیست.

اما مشکل مهم برای من این است که من از سیستم عامل مک برای کار استفاده می کنم و نتوانستم چیزی شبیه به آن را در آنجا پیکربندی کنم. سودمندی wmctrl فکر می کنم توانستم آن را نصب کنم، اما واقعاً روی سیستم عامل مک کار نمی کند. با برنامه می توان کاری انجام داد Automator است، اما آنقدر کند است که استفاده از آن حتی زمانی که کار می کند راحت نیست. همچنین نتوانستم ترکیب کلیدها را طوری تنظیم کنم که در همه برنامه ها کار کنند. اگر کسی به طور ناگهانی راه حلی پیدا کند، خوشحال می شوم از آن استفاده کنم.

به جای یک نتیجه گیری

معلوم شد که تعداد کلمات غیرمنتظره زیادی برای چنین عملکرد به ظاهر ساده ای است. من می خواستم ایده را منتقل کنم و متن را بیش از حد بار نکنم، اما هنوز نفهمیدم چگونه ساده تر آن را بیان کنم. شاید در قالب ویدیو بهتر باشد، اما مردم اینجا آن را دوست ندارند.

من کمی در مورد آنچه در زیر کاپوت اسکریپت است و نحوه پیکربندی آن صحبت کردم. من وارد جزئیات خود فیلمنامه نشدم، اما فقط 50 خط است، بنابراین درک آن دشوار نیست.

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

پیوند به اسکریپت ها

منبع: www.habr.com

اضافه کردن نظر