TwoStackWM 與 Hammerspoon

作者:   發佈於: ,更新於:   #software

最近花了一些時間在試用一些於 macOS 上提供所謂 tiling window management 的軟體。

比較有名的是這三家:

綜合來說,Amythest 算是夠好用,也很好裝(相對於其他兩者而言)。但是對於我而言總是有一些不夠,或是很難搞的地方。

我花了點時間稍微定義了一下於我而言必要的「視窗管理機能」,大約是以下這幾項:

  1. 所有功能皆能夠定義在快速鍵上。如果按一個快速鍵可以依序發動多重功能更爲理想。例如:按 Hyper-Q 後先將 Slack 關掉,再將 Zoom 關掉。
  2. 提供快速切換到特定視窗的能力。例如:按 Hyper-e 後切換到現在開著的 Emacs。
  3. 提供「將視窗最大化」及「將最大化的視窗變成不是最大化」
  4. 基本上將畫面上幾個視窗以平鋪的方式同時顯示出來,但最多顯示兩三個視窗就好。
  5. 能將畫面分成左右兩區,分爲「主要區」與「側邊區」。能讓我將較需要空間的視窗放在主要區,而側邊區則是放一些偶爾需要,但是不會一直需要的視窗。
  6. 主要區與側邊區的大小比例可以讓我調整,但不要讓我常常花時間在調整。

「主要區」與「側邊區」的這種區分概念主要是在用過 xmonad 與 dwm 後帶過來的,比起要經常決定「要把目前這個視窗放在螢幕上的哪個區象限」,以「把目前這個視窗移動去主要區或是側邊區」這種方式來簡化管理難度,對我而言更加合適。

在釐清了自己的需求之後,很容易就可以發現到之前試過的幾個 tiling window manager 都不夠用了。於是只好自己找工具湊合看看了。

在定義快速鍵方面,有找到 Keyboard Cowboy 這個能讓人自定自動化工作流程,並將工作流程綁在快速鍵上的工具。能滿足我上述需求列表中的第一點及第二點。

在視窗管理方面,雖然沒有找到能直接滿足我需求的軟體,但找到了 Hammerspoon 這個工具。這個工具能讓人以 lua 程式語言來自己寫一套 tiling window manager 出來。於是我立刻就自己寫了一套試試。名爲 TwoStackWM

這個 TwoStackWM 只提供六個能將目前焦點視窗移動到別處的函數:

而主要區與側邊區的大小比例,則是在設定當中一次性寫好的。無法動態調整。也就是說我可花一次時間將其調整到大致順眼的比例,然後就再也不必管了。

TwoStackWM 並不會把所有視窗一次顯示出來。而是最多只會顯示兩個,一主一側。要切換焦點就使用 macOS 原生、改不掉的 Cmd-Tab 快速鍵,使其成爲視窗堆疊中最上層的就好。

Hammerspoon 提供的函數十分直覺好用。並且,它也提供了一個 Console 可以讓人立刻執行一段 lua 程式碼。十分便於開發。能過讓我以不到 100 行的程式碼就定義出能符合自己需求的 Window Manager出來。

目前還沒摸索出如何以 Hammerspoon 取代 Keyboard Cowbody 提供的工作流程功能。但想必一定程度上也是做得到的。