إدارة النوافذ البديلة في لينكس

أنا واحد من أولئك الذين قاموا بتعيين Caps Lock لتبديل التخطيطات لأنني كسول جدًا لدرجة أنني لا أستطيع الضغط على مفتاحين عندما أتمكن من الضغط على أحدهما. أود أيضًا استخدام مفتاحين غير ضروريين: سأستخدم أحدهما لتشغيل التخطيط الإنجليزي والثاني للغة الروسية. لكن المفتاح الثاني غير الضروري هو استدعاء قائمة السياق، وهي غير ضرورية لدرجة أنه تم حذفها من قبل العديد من الشركات المصنعة لأجهزة الكمبيوتر المحمول. لذا عليك أن تكون راضيًا بما لديك.

ولا أريد أيضًا البحث عن أيقوناتها على شريط المهام عند تبديل النوافذ، أو التقاط الأسماء عند التمرير عبرها ALT + TAB، قم بالتمرير عبر أجهزة سطح المكتب، وما إلى ذلك. أريد الضغط على مجموعة مفاتيح (من الأفضل أن تكون واحدة فقط، ولكن لم تعد هناك مفاتيح مجانية غير ضرورية بعد الآن) والوصول فورًا إلى النافذة التي أحتاجها. على سبيل المثال مثل هذا:

  • البديل+F: فايرفوكس
  • Alt+D: فايرفوكس (التصفح الخاص)
  • البديل + T: المحطة الطرفية
  • البديل + م: آلة حاسبة
  • Alt+E: فكرة IntelliJ
  • إلخ.

علاوة على ذلك، بالضغط، على سبيل المثال، على Alt + M أريد أن أرى الآلة الحاسبة بغض النظر عما إذا كان هذا البرنامج قيد التشغيل حاليًا. إذا كان قيد التشغيل، فيجب التركيز على نافذته، وإذا لم يكن كذلك، قم بتشغيل البرنامج المطلوب ونقل التركيز عند تحميله.

بالنسبة للحالات التي لم يغطيها البرنامج النصي السابق، أريد الحصول على مجموعات مفاتيح عامة يمكن تعيينها بسهولة لأي من النوافذ المفتوحة. على سبيل المثال، لدي 10 مجموعات معينة من ALT + 1 إلى ALT + 0والتي لا ترتبط بأي برامج. يمكنني فقط النقر ALT + 1 وسيتم التركيز على النافذة التي يتم التركيز عليها حاليًا عند النقر عليها ALT + 1.

يوجد أسفل المقطع وصف لبعض الميزات الإضافية وإجابة لكيفية القيام بذلك. لكنني سأحذرك على الفور من أن مثل هذا التخصيص "لنفسك" يمكن أن يسبب إدمانًا شديدًا وحتى انسحابًا إذا كنت بحاجة إلى استخدام Windows أو Mac OS أو حتى جهاز كمبيوتر خاص بشخص آخر يعمل بنظام Linux.

في الواقع، إذا فكرت في الأمر، فإننا لا نستخدم هذا العدد الكبير من البرامج يوميًا. متصفح، ومحطة، وIDE، ونوع من برامج المراسلة، ومدير الملفات، وآلة حاسبة، وربما هذا كل شيء تقريبًا. لا تحتاج إلى العديد من اختصارات لوحة المفاتيح لتغطية 95% من مهامك اليومية.

بالنسبة للبرامج التي تحتوي على عدة نوافذ مفتوحة، يمكن تعيين إحداها على أنها النافذة الرئيسية. على سبيل المثال، لديك عدة نوافذ IntelliJ Idea مفتوحة ومخصصة لها البديل + E. في الظروف العادية، عند الضغط البديل + E سيتم فتح بعض نوافذ هذا البرنامج، على الأرجح تلك التي تم فتحها أولاً. ومع ذلك، إذا قمت بالنقر فوق البديل + E عندما تكون إحدى نوافذ هذا البرنامج قيد التركيز بالفعل، فسيتم تعيين هذه النافذة المعينة باعتبارها النافذة الرئيسية وستكون هي النافذة التي سيتم التركيز عليها عند الضغط على المجموعات اللاحقة.

يمكن إعادة تعيين النافذة الرئيسية. للقيام بذلك، يجب عليك أولا إعادة تعيين المجموعة، ثم قم بتعيين نافذة أخرى لها باعتبارها النافذة الرئيسية. لإعادة تعيين مجموعة، تحتاج إلى الضغط على المجموعة نفسها، ثم مجموعة إعادة تعيين خاصة، قمت بتعيينها لها Alt + Backspace. سيؤدي هذا إلى استدعاء برنامج نصي يقوم بإلغاء تعيين النافذة الرئيسية للمجموعة السابقة. وبعد ذلك يمكنك تعيين نافذة رئيسية جديدة كما هو موضح في الفقرة السابقة. تتم إعادة تعيين النافذة المرتبطة إلى المجموعات العامة بنفس الطريقة.

تبين أن المقدمة طويلة، لكنني أردت أولاً أن أخبرك بما سنفعله، ثم أشرح كيفية القيام بذلك.

لأولئك الذين سئموا من القراءة

باختصار، رابط البرامج النصية موجود في نهاية المقال.

لكنك مازلت غير قادر على تثبيته واستخدامه على الفور. سيتعين عليك أولاً معرفة كيفية عثور البرنامج النصي على النافذة المطلوبة. بدون ذلك، لن يكون من الممكن إخبار البرنامج النصي بالمكان الذي يجب نقل التركيز فيه بالضبط. وعليك أن تفهم ما يجب فعله إذا لم يتم العثور على نافذة مناسبة فجأة.

ولن أركز على كيفية تكوين تنفيذ البرامج النصية عن طريق الضغط على مجموعات المفاتيح. على سبيل المثال، في كيدي يكون ذلك في إعدادات النظام → الاختصارات → الاختصارات المخصصة. يجب أن يكون هذا هو الحال أيضًا في مديري النوافذ الآخرين.

تقديم ومكترل

ومكترل - أداة مساعدة لوحدة التحكم للتفاعل مع 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 يعرض قائمة بجميع النوافذ المفتوحة، و -x يقوم بإلحاق اسم الفئة بالمخرج (سكايب سكايب, Navigator.Firefox إلخ). نحتاج هنا إلى معرف النافذة (العمود 1)، واسم الفئة (العمود 3)، واسم النافذة (العمود الأخير).

يمكنك محاولة تنشيط بعض النوافذ باستخدام الخيار -a:

$ wmctrl -a skype.Skype -x

إذا سار كل شيء وفقًا للخطة، فيجب أن تظهر نافذة Skype على الشاشة. إذا بدلا من الخيار -x خيار الاستخدام -i، فبدلاً من اسم الفئة، يمكنك تحديد معرف النافذة. مشكلة المعرف هي أن معرف النافذة يتغير في كل مرة يتم فيها تشغيل التطبيق ولا يمكننا معرفته مسبقًا. من ناحية أخرى، تحدد هذه السمة النافذة بشكل فريد، وهو ما قد يكون مهمًا عندما يفتح التطبيق أكثر من نافذة واحدة. المزيد عن هذا أبعد قليلا.

في هذه المرحلة علينا أن نتذكر أننا سوف نبحث عن النافذة المطلوبة باستخدام regex حسب الإخراج ومكترل -lx. لكن هذا لا يعني أنه يتعين علينا استخدام شيء معقد. عادةً ما يكون اسم الفئة أو اسم النافذة كافيًا.

في الأساس، يجب أن تكون الفكرة الرئيسية واضحة بالفعل. في إعدادات مفاتيح التشغيل السريع/الاختصارات العامة لمدير النوافذ لديك، قم بتكوين المجموعة المطلوبة لتنفيذ البرنامج النصي.

كيفية استخدام البرامج النصية

تحتاج أولاً إلى تثبيت الأدوات المساعدة لوحدة التحكم WMCTRL и xdotool:

$ sudo apt-get install wmctrl xdotool

بعد ذلك، تحتاج إلى تنزيل البرامج النصية وإضافتها إلى $ PATH. عادة ما أضعهم فيها ~ / بن:

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

إذا كان الدليل ~ / بن لم يكن هناك، فأنت بحاجة إلى إنشائه وإعادة التشغيل (أو إعادة تسجيل الدخول)، وإلا ~ / بن لن تصل $ PATH. إذا تم كل شيء بشكل صحيح، فيجب أن يكون الوصول إلى البرامج النصية من وحدة التحكم ويجب أن يعمل إكمال علامة التبويب.

النص الرئيسي showwin يأخذ معلمتين: الأول هو regex، والذي من خلاله سنبحث عن النافذة المطلوبة، والمعلمة الثانية هي أمر يجب تنفيذه إذا لم يتم العثور على النافذة المطلوبة.

يمكنك محاولة تشغيل برنامج نصي، على سبيل المثال:

$ showwin "Mozilla Firefox$" firefox

إذا تم تثبيت Firefox، فيجب التركيز على نافذته. حتى لو لم يكن Firefox قيد التشغيل، كان ينبغي أن يبدأ.

إذا نجح، فيمكنك محاولة تكوين تنفيذ الأوامر على المجموعات. في إعدادات مفاتيح الاختصارات/مفاتيح التشغيل العامة، أضف:

  • Alt+F: عرض فايرفوكس "Mozilla Firefox$".
  • Alt+D: showwin "Mozilla Firefox (تصفح خاص)$" "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: عرض "skype.Skype" skypeforlinux
  • Alt+E: عرض فكرة "Jetbrains-idea".sh

إلخ. يمكن للجميع تكوين مجموعات المفاتيح والبرامج حسب ما يرونه مناسبًا.
إذا سار كل شيء بشكل صحيح، فباستخدام المجموعات المذكورة أعلاه، سنكون قادرين على التبديل بين النوافذ بمجرد الضغط على المفاتيح.

سأخيب آمال محبي الكروم: فهو يستطيع التمييز بين النافذة العادية من خلال مخرجاتها WMCTRL لا يمكنك ذلك، فلديهم نفس أسماء الفئات وعناوين النوافذ. في التعبير العادي المقترح، هناك حاجة إلى الأحرف N* وI* فقط بحيث تختلف هذه التعبيرات العادية عن بعضها البعض ويمكن تعيينها كالنوافذ الرئيسية.

لإعادة ضبط النافذة الرئيسية للمجموعة السابقة (في الواقع بالنسبة إلى regex، والتي showwin تم الاتصال به آخر مرة) تحتاج إلى استدعاء البرنامج النصي showwinDetach. لقد قمت بتعيين هذا البرنامج النصي لمجموعة مفاتيح Alt + Backspace.

في البرنامج النصي showwin هناك وظيفة أخرى. عندما يتم استدعاؤها بمعلمة واحدة (في هذه الحالة تكون المعلمة مجرد معرف)، فإنها لا تتحقق من التعبير العادي على الإطلاق، ولكنها تعتبر جميع النوافذ مناسبة. في حد ذاته، يبدو هذا عديم الفائدة، ولكن بهذه الطريقة يمكننا تعيين أي نافذة باعتبارها النافذة الرئيسية والتحول بسرعة إلى تلك النافذة المحددة.

لقد قمت بتكوين المجموعات التالية:

  • Alt+1: عرض "CustomKey1"
  • Alt+2: عرض "CustomKey2"
  • ...
  • Alt+0: عرض "CustomKey0"
  • Alt + مسافة للخلف: showwinDetach

بهذه الطريقة يمكنني ربط أي نوافذ بالمجموعات ALT + 1...ALT + 0. فقط عن طريق النقر ALT + 1 أقوم بربط النافذة الحالية بهذه المجموعة. يمكنني إلغاء الربط عن طريق النقر ALT + 1وبعد ذلك Alt + Backspace. أو أغلق النافذة، وهذا يعمل أيضًا.

بعد ذلك سأخبرك ببعض التفاصيل الفنية. ليس عليك قراءتها، ولكن فقط حاول إعدادها ورؤيتها. لكنني ما زلت أوصي بفهم نصوص الآخرين قبل تشغيلها على جهاز الكمبيوتر الخاص بك :).

كيفية التمييز بين النوافذ المختلفة لنفس التطبيق

من حيث المبدأ، كان المثال الأول "wmctrl -a skype.Skype -x" يعمل ويمكن استخدامه. لكن دعونا نلقي نظرة مرة أخرى على مثال Firefox، حيث تكون نافذتان مفتوحتان:

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

النافذة الأولى هي الوضع العادي، والثانية هي التصفح الخاص. أرغب في اعتبار هذه النوافذ تطبيقات مختلفة والتبديل إليها باستخدام مجموعات مفاتيح مختلفة.

من الضروري تعقيد البرنامج النصي الذي يقوم بتبديل النوافذ. لقد استخدمت هذا الحل: عرض قائمة بجميع النوافذ، افعل ذلك البقرى بواسطة regex، خذ السطر الأول مع رئيس، احصل على العمود الأول (سيكون هذا هو معرف النافذة) باستخدام مختون، قم بالتبديل إلى النافذة بواسطة المعرف.

يجب أن تكون هناك مزحة حول التعبيرات العادية ومشكلتين، لكن في الحقيقة أنا لا أستخدم أي شيء معقد. أحتاج إلى تعبيرات عادية حتى أتمكن من الإشارة إلى نهاية السطر (الرمز "$") وتمييز "Mozilla Firefox$" عن "Mozilla Firefox (التصفح الخاص)$".

يبدو الأمر كالتالي:

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

هنا يمكنك بالفعل تخمين الميزة الثانية للبرنامج النصي: إذا لم يُرجع grep أي شيء، فإن التطبيق المطلوب غير مفتوح وتحتاج إلى تشغيله عن طريق تنفيذ الأمر من المعلمة الثانية. ثم تحقق بشكل دوري مما إذا كانت النافذة المطلوبة قد فتحت لنقل التركيز إليها. لن أركز على هذا، فمن يحتاج إليه فليراجع المصادر.

عندما لا يمكن تمييز نوافذ التطبيق

لذلك، تعلمنا كيفية نقل التركيز إلى نافذة التطبيق المطلوب. ولكن ماذا لو كان التطبيق يحتوي على أكثر من نافذة مفتوحة؟ أي واحد يجب أن أركز عليه؟ من المرجح أن يتم نقل البرنامج النصي أعلاه إلى أول نافذة مفتوحة. ومع ذلك، نود المزيد من المرونة. أود أن أكون قادرًا على تذكر النافذة التي نحتاجها والتبديل إلى تلك النافذة المحددة.

كانت الفكرة كما يلي: إذا أردنا أن نتذكر نافذة معينة لمجموعة مفاتيح، فسنحتاج إلى الضغط على هذه المجموعة عندما تكون النافذة المطلوبة في التركيز. في المستقبل، عند الضغط على هذه المجموعة، سيتم التركيز على هذه النافذة. حتى تغلق النافذة أو نقوم بإعادة تعيين مجموعة البرامج النصية هذه showwinDetach.

خوارزمية البرنامج النصي showwin شيء من هذا القبيل:

  • تحقق مما إذا كنا قد تذكرنا مسبقًا معرف النافذة التي يجب نقل التركيز إليها.
    إذا كنت تتذكر ولا تزال هذه النافذة موجودة، فإننا ننقل التركيز إليها ونخرج.
  • نحن ننظر إلى النافذة التي يتم التركيز عليها حاليًا، وإذا كانت تتوافق مع طلبنا، فتذكر معرفها للذهاب إليها في المستقبل والخروج.
  • نذهب إلى بعض النوافذ المناسبة على الأقل إذا كانت موجودة أو نفتح التطبيق المطلوب.

يمكنك معرفة النافذة التي يتم التركيز عليها حاليًا باستخدام الأداة المساعدة xdotool console عن طريق تحويل مخرجاتها إلى تنسيق سداسي عشري:

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

أسهل طريقة لتذكر شيء ما في bash هي إنشاء ملفات في نظام ملفات افتراضي موجود في الذاكرة. في Ubuntu يتم تمكين هذا افتراضيًا /ديف/شم/. لا أستطيع أن أقول أي شيء عن التوزيعات الأخرى، وآمل أن يكون هناك شيء مماثل أيضا. يمكنك أن تبحث مع الأمر:

$ mount -l | grep tmpfs

سيقوم البرنامج النصي بإنشاء أدلة فارغة في هذا المجلد، مثل هذا: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. بالإضافة إلى ذلك، في كل مرة يتم استدعاؤها سيتم إنشاء رابط رمزي /dev/shm/$USER/showwin/showwin_last في /dev/shm/$USER/showwin/$SEARCH_REGEX. ستكون هناك حاجة لذلك، إذا لزم الأمر، لإزالة معرف النافذة لمجموعة معينة باستخدام البرنامج النصي showwinDetach.

ما الذي يمكن تحسينه

أولاً، يجب تكوين البرامج النصية يدويًا. بالتأكيد، بسبب الحاجة إلى الخوض في الكثير والقيام به بيديك، لن يحاول الكثير منكم حتى تكوين النظام. إذا كان من الممكن تثبيت الحزمة وتكوين كل شيء بسهولة أكبر، فربما تكتسب بعض الشعبية. ومن ثم انظر، سيتم إصدار التطبيق في التوزيعات القياسية.

وربما يمكن القيام بذلك بشكل أسهل. إذا كان بإمكانك من خلال معرف النافذة معرفة معرف العملية التي أنشأتها، ومن خلال معرف العملية يمكنك معرفة الأمر الذي أنشأها، فسيكون من الممكن أتمتة الإعداد. وفي الحقيقة لم أفهم هل ما كتبته في هذه الفقرة ممكن أم لا. الحقيقة هي أنني شخصياً راضٍ عن الطريقة التي تعمل بها الآن. ولكن إذا وجد شخص آخر غيري أن النهج برمته مناسب وقام شخص ما بتحسينه، فسوف أكون سعيدًا باستخدام حل أفضل.

هناك مشكلة أخرى، كما كتبت بالفعل، وهي أنه في بعض الحالات لا يمكن تمييز النوافذ عن بعضها البعض. لقد لاحظت هذا حتى الآن فقط مع وضع التصفح المتخفي في الكروم/الكروم، ولكن ربما يكون هناك شيء مماثل في مكان آخر. كملاذ أخير، هناك دائما خيار مجموعات عالمية ALT + 1...ALT + 0. مرة أخرى، أستخدم Firefox وبالنسبة لي شخصيًا، هذه المشكلة ليست كبيرة.

لكن المشكلة الكبيرة بالنسبة لي هي أنني أستخدم نظام التشغيل Mac OS للعمل ولم أتمكن من تكوين أي شيء من هذا القبيل هناك. جدوى WMCTRL أعتقد أنني تمكنت من تثبيته، لكنه لا يعمل حقًا على نظام التشغيل Mac OS. يمكن فعل شيء ما مع التطبيق اتمتة، ولكنه بطيء جدًا لدرجة أنه ليس من المناسب استخدامه حتى أثناء العمل. لم أتمكن أيضًا من إعداد مجموعات المفاتيح بحيث تعمل في جميع البرامج. إذا توصل شخص فجأة إلى حل، سأكون سعيدًا باستخدامه.

بدلا من خاتمة

اتضح أن هناك عددًا كبيرًا بشكل غير متوقع من الكلمات لمثل هذه الوظيفة التي تبدو بسيطة. أردت أن أنقل الفكرة وألا أثقل على النص، لكنني لم أفهم بعد كيفية سردها بشكل أكثر بساطة. ربما يكون الأمر أفضل بتنسيق الفيديو، لكن الناس لا يحبون الأمر بهذه الطريقة هنا.

لقد تحدثت قليلاً عما يوجد تحت غطاء البرنامج النصي وكيفية تكوينه. لم أخوض في تفاصيل النص نفسه، لكنه يتكون من 50 سطرًا فقط، لذا ليس من الصعب فهمه.

آمل أن يجرب شخص آخر هذه الفكرة وربما يقدرها. أستطيع أن أقول عن نفسي أن السيناريو كتب منذ حوالي 3 سنوات وهو مناسب جدًا بالنسبة لي. مريحة للغاية لدرجة أنها تسبب إزعاجًا خطيرًا عند العمل مع أجهزة كمبيوتر الآخرين. ومع جهاز MacBook يعمل.

رابط إلى البرامج النصية

المصدر: www.habr.com

إضافة تعليق