Pengurusan tetingkap alternatif dalam Linux

Saya adalah salah seorang yang menetapkan Caps Lock untuk menukar susun atur kerana saya terlalu malas untuk menekan 2 kekunci apabila saya boleh menekan satu. Saya juga mahukan 2 kekunci yang tidak diperlukan: Saya akan menggunakan satu untuk menghidupkan susun atur bahasa Inggeris, dan yang kedua untuk bahasa Rusia. Tetapi kunci kedua yang tidak diperlukan ialah memanggil menu konteks, yang sangat tidak perlu sehingga ia dipotong oleh banyak pengeluar komputer riba. Jadi anda perlu redha dengan apa yang anda ada.

Dan saya juga tidak mahu mencari ikon mereka pada bar tugas semasa menukar tetingkap, atau menangkap nama semasa menatal Alt + Tab, tatal melalui desktop, dsb. Saya ingin menekan kombinasi kekunci (idealnya hanya satu, tetapi tiada lagi kekunci percuma yang tidak diperlukan) dan segera pergi ke tetingkap yang saya perlukan. Contohnya seperti ini:

  • Alt+F: Firefox
  • Alt+D: Firefox (Menyemak Imbas Peribadi)
  • Alt+T: Terminal
  • Alt+M: Kalkulator
  • Alt+E: Idea IntelliJ
  • dan lain-lain.

Selain itu, dengan menekan, sebagai contoh, pada Alt+M Saya ingin melihat kalkulator tidak kira sama ada program ini sedang dijalankan. Jika ia sedang berjalan, maka tetingkapnya perlu diberi fokus, dan jika tidak, jalankan program yang diingini dan pindahkan fokus apabila ia dimuatkan.

Untuk kes yang tidak diliputi oleh skrip sebelumnya, saya ingin mempunyai kombinasi kunci universal yang boleh dengan mudah diberikan kepada mana-mana tetingkap yang terbuka. Sebagai contoh, saya mempunyai 10 kombinasi yang diberikan daripada Alt + 1 kepada Alt + 0, yang tidak terikat dengan mana-mana program. Saya boleh klik sahaja Alt + 1 dan tetingkap yang sedang dalam fokus akan mendapat fokus apabila diklik Alt + 1.

Di bawah potongan terdapat penerangan tentang beberapa lagi ciri dan jawapan tentang cara ini boleh dilakukan. Tetapi saya akan segera memberi amaran kepada anda bahawa penyesuaian sedemikian "untuk diri sendiri" boleh menyebabkan ketagihan yang teruk dan juga penarikan diri jika anda perlu menggunakan Windows, Mac OS atau komputer orang lain dengan Linux.

Malah, jika anda fikirkan, kami tidak menggunakan program sebanyak itu setiap hari. Pelayar, terminal, IDE, sejenis messenger, pengurus fail, kalkulator dan, mungkin, itu sahaja. Tidak banyak kombinasi kunci yang diperlukan untuk menampung 95% tugas harian.

Untuk program yang mempunyai beberapa tetingkap terbuka, salah satu daripadanya boleh ditetapkan sebagai yang utama. Sebagai contoh, anda mempunyai beberapa tetingkap IntelliJ Idea yang dibuka dan diberikan kepada Alt + E. Dalam keadaan biasa, apabila anda menekan Alt + E beberapa tetingkap program ini akan dibuka, kemungkinan besar yang dibuka dahulu. Walau bagaimanapun, jika anda klik pada Alt + E apabila salah satu tetingkap program ini sudah berada dalam fokus, maka tetingkap tertentu ini akan ditetapkan sebagai tetingkap utama dan ia akan menjadi tetingkap yang akan diberikan fokus apabila kombinasi seterusnya ditekan.

Tetingkap utama boleh ditetapkan semula. Untuk melakukan ini, anda mesti menetapkan semula gabungan dahulu, dan kemudian tetapkan tetingkap lain kepadanya sebagai tetingkap utama. Untuk menetapkan semula gabungan, anda perlu menekan gabungan itu sendiri, dan kemudian gabungan tetapan semula khas, saya telah menetapkannya kepada Alt + Ruang Belakang. Ini akan memanggil skrip yang akan membatalkan penetapan tetingkap utama untuk gabungan sebelumnya. Dan kemudian anda boleh menetapkan tetingkap utama baharu seperti yang diterangkan dalam perenggan sebelumnya. Menetapkan semula tetingkap yang dipautkan kepada kombinasi universal berlaku dengan cara yang sama.

Pengenalan itu ternyata panjang, tetapi saya ingin memberitahu terlebih dahulu apa yang akan kami lakukan, dan kemudian menerangkan cara melakukannya.

Bagi yang bosan membaca

Pendek kata, pautan ke skrip ada di penghujung artikel.

Tetapi anda masih tidak akan dapat memasang dan menggunakannya serta-merta. Anda perlu terlebih dahulu memikirkan bagaimana skrip menemui tetingkap yang dikehendaki. Tanpa ini, ia tidak akan mungkin untuk memberitahu skrip di mana betul-betul fokus perlu dipindahkan. Dan anda perlu memahami apa yang perlu dilakukan jika tiba-tiba tetingkap yang sesuai tidak dijumpai.

Dan saya tidak akan memberi tumpuan kepada cara mengkonfigurasi pelaksanaan skrip dengan menekan kombinasi kekunci. Sebagai contoh, dalam KDE ia berada dalam Tetapan Sistem β†’ Pintasan β†’ Pintasan Tersuai. Ini juga sepatutnya berlaku dalam pengurus tetingkap lain.

Memperkenalkan wmctrl

Wmctrl β€” utiliti konsol untuk berinteraksi dengan Pengurus Tetingkap X. Ini adalah program utama untuk skrip. Mari kita lihat dengan cepat bagaimana anda boleh menggunakannya.

Mula-mula, mari kita paparkan senarai tetingkap terbuka:

$ 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)
...

Pilihan -l memaparkan senarai semua tetingkap terbuka, dan -x menambahkan nama kelas pada output (skype.Skype, Navigator.Firefox dan lain-lain). Di sini kita memerlukan id tetingkap (lajur 1), nama kelas (lajur 3) dan nama tetingkap (lajur terakhir).

Anda boleh cuba mengaktifkan beberapa tetingkap menggunakan pilihan -a:

$ wmctrl -a skype.Skype -x

Jika semuanya berjalan mengikut rancangan, tetingkap Skype akan muncul pada skrin. Jika bukan pilihan -x menggunakan pilihan -i, maka bukannya nama kelas anda boleh menentukan id tetingkap. Masalah dengan id ialah id tetingkap berubah setiap kali aplikasi dilancarkan dan kami tidak dapat mengetahuinya terlebih dahulu. Sebaliknya, atribut ini secara unik mengenal pasti tetingkap, yang boleh menjadi penting apabila aplikasi membuka lebih daripada satu tetingkap. Lebih lanjut mengenai ini sedikit lebih jauh.

Pada peringkat ini kita perlu ingat bahawa kita akan mencari tetingkap yang dikehendaki menggunakan regex mengikut output wmctrl -lx. Tetapi itu tidak bermakna kita perlu menggunakan sesuatu yang rumit. Biasanya nama kelas atau nama tetingkap sudah memadai.

Pada asasnya, idea utama sepatutnya sudah jelas. Dalam tetapan hotkey/pintasan global untuk pengurus tetingkap anda, konfigurasikan gabungan yang diperlukan untuk melaksanakan skrip.

Cara menggunakan skrip

Mula-mula anda perlu memasang utiliti konsol wmctrl ΠΈ xdotool:

$ sudo apt-get install wmctrl xdotool

Seterusnya anda perlu memuat turun skrip dan menambahnya $ PATH. Saya biasanya meletakkannya ~/bin:

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

Jika direktori ~/bin tidak ada di sana, maka anda perlu menciptanya dan but semula (atau log masuk semula), jika tidak ~/bin tidak akan memukul $ PATH. Jika semuanya dilakukan dengan betul, maka skrip harus boleh diakses dari konsol dan penyiapan Tab akan berfungsi.

Skrip utama showwin mengambil 2 parameter: yang pertama ialah regex, yang mana kita akan mencari tetingkap yang diperlukan, dan parameter kedua ialah arahan yang perlu dilaksanakan jika tetingkap yang diperlukan tidak dijumpai.

Anda boleh cuba menjalankan skrip, contohnya:

$ showwin "Mozilla Firefox$" firefox

Jika Firefox dipasang, tetingkapnya harus diberi fokus. Walaupun Firefox tidak berjalan, ia sepatutnya bermula.

Jika ia berfungsi, maka anda boleh cuba mengkonfigurasi pelaksanaan arahan pada kombinasi. Dalam tetapan hotkey/pintasan global tambahkan:

  • Alt+F: showwin β€œMozilla Firefox$” firefox
  • Alt+D: showwin "Mozilla Firefox (Pelayaran Peribadi)$" "firefox -private-window"
  • Alt+C: showwin "chromium-browser.Chromium-browser N*" chromium-browser
  • Alt+X: showwin "chromium-browser.Chromium-browser I*" "chromium-browser -inkognito"
  • Alt+S: showwin β€œskype.Skype” skypeforlinux
  • Alt+E: showwin "jetbrains-idea" idea.sh

Dsb. Semua orang boleh mengkonfigurasi kombinasi kekunci dan perisian mengikut kesesuaian mereka.
Jika semuanya berjalan dengan betul, maka menggunakan kombinasi di atas kita akan dapat bertukar antara tingkap dengan hanya menekan kekunci.

Saya akan mengecewakan pencinta krom: ia boleh menyamar membezakan tetingkap biasa dengan outputnya wmctrl Anda tidak boleh, mereka mempunyai nama kelas dan tajuk tetingkap yang sama. Dalam regex yang dicadangkan, aksara N* dan I* diperlukan hanya supaya ungkapan biasa ini berbeza antara satu sama lain dan ia boleh ditetapkan sebagai tetingkap utama.

Untuk menetapkan semula tetingkap utama gabungan sebelumnya (sebenarnya untuk regex, yang showwin dipanggil kali terakhir) anda perlu memanggil skrip showwinDetach. Saya mempunyai skrip ini diberikan kepada gabungan kekunci Alt + Ruang Belakang.

Pada skrip showwin ada satu lagi fungsi. Apabila ia dipanggil dengan satu parameter (dalam kes ini parameter hanyalah pengecam), ia tidak menyemak regex sama sekali, tetapi menganggap semua tetingkap sesuai. Dengan sendirinya, ini kelihatan tidak berguna, tetapi dengan cara ini kita boleh menetapkan mana-mana tetingkap sebagai tetingkap utama dan dengan cepat beralih ke tetingkap tertentu itu.

Saya mempunyai kombinasi berikut dikonfigurasikan:

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

Dengan cara ini saya boleh mengikat mana-mana tingkap kepada gabungan Alt + 1...Alt + 0. Hanya dengan mengklik Alt + 1 Saya mengikat tetingkap semasa kepada gabungan ini. Saya boleh membatalkan pengikatan dengan mengklik Alt + 1dan kemudian Alt + Ruang Belakang. Atau tutup tetingkap, itu juga berfungsi.

Seterusnya saya akan memberitahu anda beberapa butiran teknikal. Anda tidak perlu membacanya, tetapi cuba sediakannya dan lihat. Tetapi saya masih mengesyorkan memahami skrip orang lain sebelum menjalankannya pada komputer anda :).

Bagaimana untuk membezakan antara tingkap yang berbeza bagi aplikasi yang sama

Pada dasarnya, contoh pertama "wmctrl -a skype.Skype -x" telah berfungsi dan boleh digunakan. Tetapi mari kita lihat semula contoh dengan Firefox, di mana 2 tetingkap dibuka:

0x04400003  0 Navigator.Firefox                   N/A Google ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ - Mozilla Firefox
0x04400218  0 Navigator.Firefox                   N/A Π›ΡƒΡ‡ΡˆΠΈΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π° сутки / Π₯Π°Π±Ρ€ - Mozilla Firefox (Private Browsing)

Tetingkap pertama ialah mod biasa, dan yang kedua ialah Penyemakan Imbas Peribadi. Saya ingin menganggap tetingkap ini sebagai aplikasi yang berbeza dan beralih kepada mereka menggunakan kombinasi kekunci yang berbeza.

Ia adalah perlu untuk merumitkan skrip yang menukar tingkap. Saya menggunakan penyelesaian ini: paparkan senarai semua tetingkap, lakukan grep oleh regex, ambil baris pertama dengan kepala, dapatkan lajur pertama (ini akan menjadi id tetingkap) menggunakan memotong, tukar ke tetingkap dengan id.

Perlu ada jenaka tentang ungkapan biasa dan dua masalah, tetapi sebenarnya saya tidak menggunakan apa-apa yang rumit. Saya memerlukan ungkapan biasa supaya saya boleh menunjukkan penghujung baris (simbol β€œ$”) dan membezakan β€œMozilla Firefox$” daripada β€œMozilla Firefox (Pelayaran Peribadi)$”.

Perintah kelihatan seperti ini:

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

Di sini anda sudah boleh meneka tentang ciri kedua skrip: jika grep tidak mengembalikan apa-apa, maka aplikasi yang dikehendaki tidak dibuka dan anda perlu memulakannya dengan melaksanakan arahan dari parameter kedua. Dan kemudian semak secara berkala sama ada tetingkap yang diperlukan telah dibuka untuk memindahkan fokus kepadanya. Saya tidak akan memberi tumpuan kepada perkara ini; sesiapa yang memerlukannya akan melihat sumbernya.

Apabila tetingkap aplikasi tidak dapat dibezakan

Jadi, kami telah mempelajari cara memindahkan fokus ke tetingkap aplikasi yang diingini. Tetapi bagaimana jika aplikasi mempunyai lebih daripada satu tetingkap terbuka? Mana satu yang harus saya berikan tumpuan? Skrip di atas kemungkinan besar akan dipindahkan ke tetingkap pertama yang terbuka. Walau bagaimanapun, kami ingin lebih fleksibiliti. Saya ingin dapat mengingati tetingkap mana yang kita perlukan dan beralih ke tetingkap tertentu itu.

Ideanya ialah ini: Jika kita ingin mengingati tetingkap tertentu untuk kombinasi kekunci, maka kita perlu menekan gabungan ini apabila tetingkap yang dikehendaki berada dalam fokus. Pada masa hadapan, apabila anda menekan gabungan ini, tumpuan akan diberikan kepada tetingkap ini. Sehingga tetingkap ditutup atau kami melakukan tetapan semula untuk gabungan skrip ini showwinDetach.

Algoritma skrip showwin sesuatu seperti ini:

  • Semak sama ada kita sebelum ini mengingati id tetingkap yang mana tumpuan harus dipindahkan.
    Jika anda masih ingat dan tetingkap sedemikian masih wujud, maka kami memindahkan fokus kepadanya dan keluar.
  • Kami melihat tetingkap mana yang sedang dalam fokus, dan jika ia sepadan dengan permintaan kami, maka ingat idnya untuk pergi ke sana pada masa hadapan dan keluar.
  • Kami pergi ke sekurang-kurangnya beberapa tetingkap yang sesuai jika wujud atau buka aplikasi yang dikehendaki.

Anda boleh mengetahui tetingkap mana yang sedang difokuskan menggunakan utiliti konsol xdotool dengan menukar outputnya kepada format perenambelasan:

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

Cara paling mudah untuk mengingati sesuatu dalam bash ialah mencipta fail dalam sistem fail maya yang terletak dalam ingatan. Dalam Ubuntu ini didayakan secara lalai dalam /dev/shm/. Saya tidak boleh mengatakan apa-apa tentang pengedaran lain, saya harap ada yang serupa juga. Anda boleh melihat dengan arahan:

$ mount -l | grep tmpfs

Skrip akan membuat direktori kosong dalam folder ini, seperti ini: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID. Selain itu, setiap kali ia dipanggil ia akan mencipta symlink /dev/shm/$USER/showwin/showwin_last pada /dev/shm/$USER/showwin/$SEARCH_REGEX. Ini diperlukan untuk, jika perlu, mengalih keluar id tetingkap untuk gabungan tertentu menggunakan skrip showwinDetach.

Apa yang boleh diperbaiki

Pertama, skrip mesti dikonfigurasikan secara manual. Sudah tentu, kerana keperluan untuk menyelidiki dan melakukan banyak perkara dengan tangan anda, ramai daripada anda tidak akan cuba untuk mengkonfigurasi sistem. Sekiranya mungkin untuk memasang pakej dan mengkonfigurasi semuanya dengan lebih mudah, maka mungkin ia akan mendapat populariti. Dan kemudian lihat, aplikasi itu akan dikeluarkan ke dalam pengedaran standard.

Dan mungkin ia boleh dilakukan dengan lebih mudah. Jika dengan id tetingkap anda boleh mengetahui id proses yang menciptanya, dan dengan id proses anda boleh mengetahui arahan yang menciptanya, maka ia mungkin untuk mengautomasikan persediaan. Sebenarnya, saya tidak faham sama ada apa yang saya tulis dalam perenggan ini mungkin. Hakikatnya saya secara peribadi berpuas hati dengan cara ia berfungsi sekarang. Tetapi jika seseorang selain saya mendapati keseluruhan pendekatan itu mudah dan seseorang memperbaikinya, maka saya akan berbesar hati menggunakan penyelesaian yang lebih baik.

Masalah lain, seperti yang telah saya tulis, ialah dalam beberapa kes tingkap tidak boleh dibezakan antara satu sama lain. Setakat ini saya hanya memerhati ini dengan inkognito dalam krom/kromium, tetapi mungkin terdapat sesuatu yang serupa di tempat lain. Sebagai pilihan terakhir, sentiasa ada pilihan kombinasi universal Alt + 1...Alt + 0. Sekali lagi, saya menggunakan Firefox dan bagi saya secara peribadi masalah ini tidak penting.

Tetapi masalah penting bagi saya ialah saya menggunakan Mac OS untuk bekerja dan saya tidak dapat mengkonfigurasi apa-apa seperti itu di sana. utiliti wmctrl Saya fikir saya boleh memasangnya, tetapi ia tidak benar-benar berfungsi pada Mac OS. Sesuatu boleh dilakukan dengan aplikasi Automator, tetapi ia sangat perlahan sehingga ia tidak mudah digunakan walaupun ia berfungsi. Saya juga tidak dapat menyediakan kombinasi kekunci supaya ia berfungsi dalam semua program. Jika seseorang tiba-tiba datang dengan penyelesaian, saya akan berbesar hati menggunakannya.

Daripada kesimpulan

Ia ternyata sejumlah besar perkataan yang tidak dijangka untuk fungsi yang kelihatan mudah. Saya ingin menyampaikan idea dan tidak membebankan teks, tetapi saya masih belum mengetahui cara untuk memberitahunya dengan lebih mudah. Mungkin ia lebih baik dalam format video, tetapi orang ramai tidak menyukainya di sini.

Saya bercakap sedikit tentang apa yang ada di bawah tudung skrip dan cara mengkonfigurasinya. Saya tidak pergi ke butiran skrip itu sendiri, tetapi ia hanya 50 baris, jadi ia tidak sukar untuk difahami.

Saya berharap orang lain akan mencuba idea ini dan mungkin menghargainya. Saya boleh katakan tentang diri saya bahawa skrip itu ditulis kira-kira 3 tahun yang lalu dan ia SANGAT memudahkan saya. Sangat mudah sehingga menyebabkan ketidakselesaan yang serius apabila bekerja dengan komputer orang lain. Dan dengan MacBook yang berfungsi.

Pautan ke skrip

Sumber: www.habr.com

Tambah komen