TwoStackWM 與 Hammerspoon
作者:gugod 發佈於: ,更新於: #software最近花了一些時間在試用一些於 macOS 上提供所謂 tiling window management 的軟體。
比較有名的是這三家:
- Amythest
- AeroSpace
- yabai + shkd
綜合來說,Amythest 算是夠好用,也很好裝(相對於其他兩者而言)。但是對於我而言總是有一些不夠,或是很難搞的地方。
我花了點時間稍微定義了一下於我而言必要的「視窗管理機能」,大約是以下這幾項:
- 所有功能皆能夠定義在快速鍵上。如果按一個快速鍵可以依序發動多重功能更爲理想。例如:按 Hyper-Q 後先將 Slack 關掉,再將 Zoom 關掉。
- 提供快速切換到特定視窗的能力。例如:按 Hyper-e 後切換到現在開著的 Emacs。
- 提供「將視窗最大化」及「將最大化的視窗變成不是最大化」
- 基本上將畫面上幾個視窗以平鋪的方式同時顯示出來,但最多顯示兩三個視窗就好。
- 能將畫面分成左右兩區,分爲「主要區」與「側邊區」。能讓我將較需要空間的視窗放在主要區,而側邊區則是放一些偶爾需要,但是不會一直需要的視窗。
- 主要區與側邊區的大小比例可以讓我調整,但不要讓我常常花時間在調整。
「主要區」與「側邊區」的這種區分概念主要是在用過 xmonad 與 dwm 後帶過來的,比起要經常決定「要把目前這個視窗放在螢幕上的哪個區象限」,以「把目前這個視窗移動去主要區或是側邊區」這種方式來簡化管理難度,對我而言更加合適。
在釐清了自己的需求之後,很容易就可以發現到之前試過的幾個 tiling window manager 都不夠用了。於是只好自己找工具湊合看看了。
在定義快速鍵方面,有找到 Keyboard Cowboy 這個能讓人自定自動化工作流程,並將工作流程綁在快速鍵上的工具。能滿足我上述需求列表中的第一點及第二點。
在視窗管理方面,雖然沒有找到能直接滿足我需求的軟體,但找到了 Hammerspoon 這個工具。這個工具能讓人以 lua 程式語言來自己寫一套 tiling window manager 出來。於是我立刻就自己寫了一套試試。名爲 TwoStackWM。
這個 TwoStackWM 只提供六個能將目前焦點視窗移動到別處的函數:
moveFocusedWindowToMainStack()
-- 移動到主要區moveFocusedWindowToSideStack()
-- 移動到側邊區maximizeFocusedWindow()
-- 最大化toggleFocusedWindowToMainOrSide()
-- 在主要區與側邊區兩狀態間切換toggleFocusedWindowToMaxOrMainOrSide()
-- 在最大、主要區與側邊區三中狀態中切換moveFocusedWindowToNextScreen()
-- 移動到下一個螢幕
而主要區與側邊區的大小比例,則是在設定當中一次性寫好的。無法動態調整。也就是說我可花一次時間將其調整到大致順眼的比例,然後就再也不必管了。
TwoStackWM 並不會把所有視窗一次顯示出來。而是最多只會顯示兩個,一主一側。要切換焦點就使用 macOS 原生、改不掉的 Cmd-Tab
快速鍵,使其成爲視窗堆疊中最上層的就好。
Hammerspoon 提供的函數十分直覺好用。並且,它也提供了一個 Console 可以讓人立刻執行一段 lua 程式碼。十分便於開發。能過讓我以不到 100 行的程式碼就定義出能符合自己需求的 Window Manager出來。
目前還沒摸索出如何以 Hammerspoon 取代 Keyboard Cowbody 提供的工作流程功能。但想必一定程度上也是做得到的。