Linux 中的替代視窗管理

我是那些設定大寫鎖定來切換佈局的人之一,因為當我可以按一個鍵時,我懶得按兩個鍵。 我甚至想要兩個不必要的鍵:我會用一個打開英語佈局,第二個打開俄語。 但第二個不必要的按鍵是呼叫上下文選單,該鍵非常不必要,以至於許多筆記型電腦製造商都將其刪除。 所以你必須滿足於你所擁有的。

而且我也不想在切換視窗時在任務欄上尋找它們的圖標,或者在滾動瀏覽時捕捉到它們的名稱 Alt + Tab鍵、捲動桌面等。我想按一個組合鍵(最好只有一個,但不再有免費的不必要的鍵)並立即進入我需要的視窗。 例如這樣:

  • 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 甚至別人的 Linux 計算機,這種「為自己」的客製化可能會導致嚴重的成癮甚至戒斷。

事實上,如果你想一想,我們每天並不會使用那麼多程式。 瀏覽器、終端機、IDE、某種信使、檔案管理器、計算器,也許,這就是全部。 不需要太多的組合鍵就可以完成 95% 的日常任務。

對於開啟多個視窗的程序,可以將其中一個視窗指定為主視窗。 例如,您開啟了多個 IntelliJ Idea 視窗並指派給 Alt + E鍵。 在正常情況下,當您按下 Alt + E鍵 該程式的某些視窗將會打開,很可能是第一個打開的視窗。 但是,如果您單擊 Alt + E鍵 當程式的其中一個視窗已經獲得焦點時,該特定視窗將被指定為主窗口,並且當按下後續組合時,它將成為獲得焦點的視窗。

主視窗可以重新分配。 為此,您必須先重置組合,然後為其指定另一個視窗作為主視窗。 要重置組合,您需要按組合本身,然後按特殊的重置組合,我將其分配給 Alt+退格鍵。 這將呼叫一個腳本,該腳本將取消分配先前組合的主視窗。 然後您可以按照上一段所述分配一個新的主視窗。 將連結視窗重設為通用組合的方式相同。

介紹很長,但我想先告訴我們要做什麼,然後解釋如何做。

對於那些厭倦了閱讀的人

簡而言之,腳本的連結位於文章末尾。

但您仍然無法立即安裝和使用它。 您首先必須弄清楚腳本如何找到所需的視窗。 如果沒有這個,就不可能告訴腳本焦點需要轉移到哪裡。 您需要了解如果突然找不到合適的視窗該怎麼辦。

我不會重點介紹如何透過組合鍵來配置腳本的執行。 例如,在 KDE 中,它位於系統設定 → 快捷方式 → 自訂快捷方式中。 其他視窗管理器也應該是這種情況。

介紹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, 火狐瀏覽器 ETC)。 這裡我們需要視窗 ID(第 1 列)、類別名稱(第 3 列)和視窗名稱(最後一列)。

您可以嘗試使用以下選項來啟動某些窗口 -a:

$ wmctrl -a skype.Skype -x

如果一切按計劃進行,Skype 視窗應該會出現在螢幕上。 如果代替選項 -x 使用選項 -i,然後您可以指定視窗 ID,而不是類別名稱。 id 的問題在於,每次啟動應用程式時,視窗 id 都會發生變化,而我們無法事先知道。 另一方面,此屬性唯一標識一個窗口,當應用程式打開多個窗口時,這可能很重要。 關於這一點還有更多內容。

在這個階段,我們需要記住,我們將使用正規表示式透過輸出搜尋所需的視窗 wmctrl-lx。 但這並不意味著我們必須使用複雜的東西。 通常類別名稱或視窗名稱就足夠了。

基本上,主要思想應該已經很清楚了。 在視窗管理器的全域熱鍵/快速鍵設定中,配置執行腳本所需的組合。

如何使用腳本

首先您需要安裝控制台實用程式 控制面板 и 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 補全應該可以工作。

主要腳本 秀贏 有兩個參數:第一個是正規表示式,我們將透過它搜尋所需的窗口,第二個參數是如果找不到所需窗口則需要執行的命令。

您可以嘗試執行腳本,例如:

$ showwin "Mozilla Firefox$" firefox

如果安裝了 Firefox,則其視窗應獲得焦點。 即使 Firefox 沒有運行,它也應該已經啟動。

如果有效,那麼您可以嘗試設定組合命令的執行。 在全域熱鍵/快捷鍵設定中新增:

  • Alt+F:顯示“Mozilla Firefox$” 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: showwin “skype.Skype” skypeforlinux
  • Alt+E:showwin “jetbrains-idea” idea.sh

等等。每個人都可以根據自己的需求配置組合鍵和軟體。
如果一切正常,那麼使用上述組合,我們只需按鍵即可在視窗之間切換。

我會讓 Chrome 愛好者失望的:它可以透過輸出隱身區分常規窗口 控制面板 你不能,它們具有相同的類別名稱和視窗標題。 在所提出的正規表示式中,僅需要字元 N* 和 I*,以便這些正規表示式彼此不同並且可以將它們指定為主視窗。

重置先前組合的主視窗(實際上對於正規表示式, 秀贏 上次呼叫)您需要呼叫腳本 showwin分離。 我已將此腳本指派給組合鍵 Alt+退格鍵.

在劇本上 秀贏 還有一項功能。 當使用一個參數呼叫它時(在這種情況下,參數只是一個標識符),它根本不檢查正則表達式,而是認為所有視窗都適合。 就其本身而言,這似乎沒什麼用,但透過這種方式,我們可以將任何窗口指定為主窗口,並快速切換到該特定窗口。

我配置了以下組合:

  • Alt+1:顯示“CustomKey1”
  • Alt+2:顯示“CustomKey2”
  • ...
  • Alt+0:顯示“CustomKey0”
  • Alt+退格鍵:showwinDetach

這樣我就可以將任何視窗綁定到組合 Alt + 1鍵...Alt + 0鍵。 只需點擊 Alt + 1鍵 我將當前視窗綁定到該組合。 我可以點擊取消綁定 Alt + 1鍵然後 Alt+退格鍵。 或關閉窗口,也可以。

接下來我來跟大家講一些技術細節。 您不必閱讀它們,只需嘗試設定它們並查看即可。 但我仍然建議在您的電腦上運行其他人的腳本之前先了解它們:)。

如何區分同一個應用程式的不同窗口

原則上,第一個範例「wmctrl -a skype.Skype -x」正在運行並且可以使用。 但讓我們再看一下 Firefox 的範例,其中開啟了 2 個視窗:

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

第一個視窗是正常模式,第二個視窗是隱私瀏覽。 我想將這些視窗視為不同的應用程序,並使用不同的組合鍵切換到它們。

有必要將切換視窗的腳本複雜化。 我使用了這個解決方案:顯示所有視窗的列表,執行 grep的 透過正規表示式,取第一行 ,使用以下命令獲取第一列(這將是視窗 ID) ,透過id切換到視窗。

應該有一個關於正規表示式和兩個問題的笑話,但實際上我沒有使用任何複雜的東西。 我需要正規表示式,以便可以指示行尾(“$”符號)並區分“Mozilla Firefox$”和“Mozilla Firefox (Private Browsing)$”。

該命令看起來像這樣:

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

在這裡您已經可以猜測該腳本的第二個功能:如果 grep 沒有返回任何內容,則所需的應用程式尚未打開,您需要透過執行第二個參數中的命令來啟動它。 然後定期檢查所需的視窗是否已打開,以便將焦點轉移到它。 我不會關注這個;任何需要它的人都會查看來源。

當應用程式視窗無法區分時

因此,我們已經學習瞭如何將焦點轉移到所需應用程式的視窗。 但是,如果應用程式打開了多個視窗怎麼辦? 我應該專注在哪一個? 上面的腳本很可能會轉移到第一個打開的視窗。 然而,我們希望有更大的靈活性。 我希望能夠記住我們需要哪個視窗並切換到該特定視窗。

想法是這樣的:如果我們想記住某個特定視窗的組合鍵,那麼我們需要在所需視窗處於焦點時按下該組合。 以後,當您按下該組合鍵時,焦點將移至該視窗。 直到視窗關閉或我們對此腳本組合進行重置 showwin分離.

腳本演算法 秀贏 像這樣的東西:

  • 檢查我們之前是否記住了焦點應轉移到的視窗的 ID。
    如果您記得並且這樣的視窗仍然存在,那麼我們將焦點轉移到它並退出。
  • 我們查看當前焦點是哪個窗口,如果它符合我們的請求,請記住它的 ID,以便將來訪問它並退出。
  • 我們至少會轉到某個合適的視窗(如果存在)或打開所需的應用程式。

您可以使用 xdotool 控制台公用程式透過將其輸出轉換為十六進位格式來找出目前處於焦點的視窗:

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

在 bash 中記住某些內容的最簡單方法是在位於記憶體中的虛擬檔案系統中建立檔案。 在 Ubuntu 中,此功能預設為啟用 /dev/shm/。 我不能對其他發行版說什麼,我希望也有類似的東西。 可以用指令查看:

$ mount -l | grep tmpfs

該腳本將在此資料夾中建立空目錄,如下所示: /dev/shm/$USER/showwin/$SEARCH_REGEX/$WINDOW_ID。 此外,每次調用它時都會創建一個符號鏈接 /dev/shm/$USER/showwin/showwin_last/dev/shm/$USER/showwin/$SEARCH_REGEX。 如有必要,需要使用腳本刪除特定組合的視窗 ID showwin分離.

有什麼可以改進的地方

首先,必須手動配置腳本。 當然,由於需要深入研究並用手做很多事情,很多人甚至不會嘗試配置系統。 如果可以簡單地安裝軟體包並更輕鬆地配置所有內容,那麼也許它會受到一些歡迎。 然後看看,該應用程式將發佈到標準發行版中。

也許這可以做得更容易。 如果透過視窗的 id,您可以找到建立它的進程的 id,並且透過進程的 id,您可以找到建立它的命令,那麼您就可以自動化設定。 其實我也不明白我這一段寫的是否可行。 事實上,我個人對它現在的運作方式感到滿意。 但是,如果除了我之外的其他人發現整個方法很方便並且有人對其進行了改進,那麼我將很樂意使用更好的解決方案。

正如我已經寫過的,另一個問題是在某些情況下視窗無法彼此區分。 到目前為止,我只在 chrome/chromium 中以隱身方式觀察到這一點,但也許其他地方也有類似的情況。 作為最後的手段,總是可以選擇通用組合 Alt + 1鍵...Alt + 0鍵。 同樣,我使用 Firefox,對我個人來說這個問題並不重要。

但對我來說,一個重要的問題是我使用 Mac 作業系統來工作,但我無法在那裡配置任何類似的東西。 公用事業 控制面板 我想我能夠安裝它,但它在 Mac 作業系統上不起作用。 可以透過應用程式做一些事情 的Automator但速度太慢,即使在工作時使用也不方便。 我也無法設定組合鍵以便它們在所有程式中都有效。 如果有人突然想出一個解決方案,我會很高興使用它。

取而代之的是結論

對於這樣一個看似簡單的功能來說,結果卻是出乎意料的大量單字。 我想傳達這個想法,而不是讓文字太多,但我還沒有弄清楚如何更簡單地講述它。 也許影片格式會更好,但人們不喜歡這樣。

我討論了腳本的底層內容以及如何配置它。 劇本本身我沒有詳細介紹,不過只有50行,要理解並不困難。

我希望其他人能夠嘗試這個想法,甚至可能會欣賞它。 我可以說,這個劇本大約是三年前寫的,對我來說非常方便。 如此方便以至於在使用其他人的計算機時會造成嚴重的不適。 以及一台可以正常運作的 MacBook。

連結到腳本

來源: www.habr.com

添加評論