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

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


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


  • Alt + F: Firefox
  • 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 أو حتى كمبيوتر شخص آخر مع Linux.


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


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


 $ wmctrl -a skype.Skype -x 

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


في هذه المرحلة ، علينا أن نتذكر أننا سنبحث عن النافذة المطلوبة باستخدام regex وفقًا لإخراج wmctrl -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 

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


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


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


 $ showwin "Mozilla Firefox$" firefox 

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


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


  • Alt + F: showwin فايرفوكس "Mozilla Firefox $"
  • Alt + D: showwin "Mozilla Firefox (التصفح الخاص) $" "firefox - نافذة خاصة"
  • Alt + C: showwin "chromium-browser.Chromium-browser N *" chromium-browser
  • Alt + X: showwin "متصفح chromium. متصفح Chromium I *" "متصفح chromium -incognito"
  • Alt + S: showwin "skype.Skype" skypeforlinux
  • البديل + E: showwin "فكرة jetbrains"

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


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


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


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


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


  • Alt + 1: showwin "CustomKey1"
  • Alt + 2: showwin "CustomKey2"
  • ...
  • Alt + 0: showwin "CustomKey0"
  • بديل + مسافة للخلف: 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) 

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


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


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


يبدو الأمر شيئًا مثل هذا:


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

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


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


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


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


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


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

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


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

يعد تذكر شيء ما في bash أسهل طريقة لإنشاء ملفات في نظام ملفات افتراضي في الذاكرة. على Ubuntu ، يتم توصيل هذا افتراضيًا في / 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 . ستكون هناك حاجة إلى ذلك لإزالة معرف النافذة لمجموعة محددة إذا لزم الأمر باستخدام البرنامج النصي showwinDetach .


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


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


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


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


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


بدلا من الاستنتاج


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


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


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


رابط البرنامج النصي

Source: https://habr.com/ru/post/ar483846/


All Articles