來源: 我的博客
概述
HammerSpoon 是一個可以用來進(jìn)行窗口管理的 App,開源免費(fèi)。當(dāng)然,功能也不僅限于此
本文旨在介紹如何用 HammerSpoon 配置窗口管理功能。類似的軟件,收費(fèi)的有 SizeUp,Moom 和 Divvy, 免費(fèi)的有 Spectacle 和 Slate
SizeUp 和 Divvy 在功能上各有所長。SizeUp 方便快速調(diào)節(jié)窗口位置,但不方便快速調(diào)節(jié)窗口大小,Divvy反之。雖然也可以在 Divvy 里設(shè)置快速 Resize 到指定大小的快捷鍵,但只是比較基礎(chǔ)的設(shè)置,不能實(shí)時調(diào)整。而 Spectacle 和 Slate 更像是這兩個軟件的功能集合,而且比他們都強(qiáng)大,只是在配置方面要花些時間。Slate 的原作者已經(jīng) 3 年沒管過這個項(xiàng)目了,但這個 fork 還是有人維護(hù)的
推薦HammerSpoon,因?yàn)樗拇翱诠芾砉δ茏銐驈?qiáng)大。而且對開發(fā)者很友好,有控制臺可以 Debug。語言采用 Lua,不難上手。另外,還有茫茫多的系統(tǒng) API 可以隨意調(diào)用。所以說,HammerSpoon 絕不僅僅是一個窗口管理軟件
如果你符合以下這幾點(diǎn):
- 使用 MacOS
- 想用鍵盤調(diào)整窗口大小和位置
- 有多個外接屏幕,想用快捷鍵把窗口在屏幕之間扔來扔去
那么,請繼續(xù)往下讀
不想看配置細(xì)節(jié)或者已經(jīng)掌握了配置方法的朋友,可以直接跳到下載頁面,載入我的配置文件,只需要幾分鐘,你就可以告別這些不科學(xué)的操作了
使用
我們先來看看配置好之后,有什么效果,隨便舉兩個例子:


按照這篇教程配置,你可以用鍵盤快捷鍵觸發(fā)以下動作:
- 在當(dāng)前的屏幕全屏化某個窗口,適用于任何屏幕和窗口
- 在當(dāng)前屏幕上居中窗口
- 把窗口大小調(diào)整到屏幕大小的一半(上下左右)。適用于任何屏幕和窗口
- 把當(dāng)前窗口扔到其他顯示器上,并且全屏(可選)
- 任意調(diào)整當(dāng)前窗口大小
- 關(guān)于任意移動窗口,我沒把這個功能寫進(jìn)來,因?yàn)樽约翰惶枰H绻阈枰獙?shí)現(xiàn)這個功能,看完這篇博客就會了
下載安裝
- 首先是 HammerSpoon 的主程序。這個一定要下載安裝
- 先找到當(dāng)前的最新版
- 下載安裝,把圖標(biāo)拖到 Application 里面去
- 我的配置文件在這里:S1ngS1ng - HammerSpoon,懶得自己配置了就用這個好了
- 可以直接
git clone我的 HammerSpoon 庫,并把我的 init.lua 以及 window-management.lua 放到本地的~/.hammerspoon/文件夾中,然后 Reload 一下就可以使用了
快捷鍵
README 文件里寫的很清楚了,這里還是列出來吧(快捷鍵均為 MacOS 的):
- 把窗口移到另一個屏幕
-
Ctrl-Alt + 左移到左邊的屏幕 -
Ctrl-Alt + 右移到右邊的屏幕
-
- 全屏
Ctrl-Alt-Command + M
- 把窗口放到屏幕中心
Ctrl-alt-Command + C
- 設(shè)置窗口大小為屏幕大小的一半
-
Ctrl-Alt-Command + 左寬度為一半,靠左 -
Ctrl-Alt-Command + 右寬度為一半,靠右 -
Ctrl-Alt-Command + 上高度為一半,靠上 -
Ctrl-Alt-Command + 下高度為一半,靠下
-
- 設(shè)置窗口大小,以左、上為基準(zhǔn) (意思是左邊界和上邊界不動)
-
Ctrl-Alt-Shift + 左窗口右側(cè)邊左移 -
Ctrl-Alt-Shift + 右窗口右側(cè)邊右移 -
Ctrl-Alt-Shift + 上窗口上邊界上移 -
Ctrl-Alt-Shift + 下窗口上邊界下移
-
- 設(shè)置窗口大小,以右、下為基準(zhǔn)
-
Alt-Command-Shift + 左窗口左側(cè)邊左移 -
Alt-Command-Shift + 右窗口左側(cè)邊右移 -
Alt-Command-Shift + 上窗口下邊界上移 -
Alt-Command-Shift + 下窗口下邊界下移
-
其中,居中、全屏、窗口移到其他屏幕、窗口設(shè)置為一半屏幕大小的快捷鍵都和 SizeUp 的一樣。至于窗口大小調(diào)整,只要記住Ctrl-Alt-Shift 是保持左邊和下邊不動,Command-Alt-Shift 是保持右邊和下邊不動就好了。畢竟,Ctrl 在 Command 的左邊
配置
配置方面,HammerSpoon 本身就提供了眾多的 API,不光有它自己的,還有來自 Mac OS 系統(tǒng)的。完整的 API 文檔在這里
API
以下是我的配置文件中,用到的 API:
-
hs.alert - 用來顯示提示信息。位置默認(rèn)為屏幕中央,黑底白字,大概三秒鐘之后消失。類似功能的還有
hs.notify,也就是系統(tǒng)的 Notification(通知) - hs.grid - 用來設(shè)置 Grid(網(wǎng)格)。我的配置文件中,實(shí)現(xiàn)窗口大小調(diào)整和位置調(diào)整,都是基于這個 API
-
hs.hotkey - 用來設(shè)置快捷鍵。我的配置文件中調(diào)用的是它的
bind方法 - hs.screen - 與屏幕(顯示器)相關(guān)的 API,可以獲取屏幕參數(shù),設(shè)置 Grid(網(wǎng)格)
- hs.screen.watcher - 用于監(jiān)聽屏幕(顯示器)分辨率、數(shù)量變化等的 watcher
- hs.window - 與應(yīng)用程序窗口相關(guān)的 API,提供了獲取激活窗口,移動窗口到其他顯示器,移動窗口到屏幕中心等方法
基本原理
首先,根據(jù)屏幕的長寬比,把屏幕分成 Grid(網(wǎng)格)。比如 16:9 的屏幕,就分成 8 * 4,也就是這樣:

那么,通過設(shè)置窗口占多少個格子,就可以實(shí)現(xiàn)快速布局了
一點(diǎn)建議
- 關(guān)于 Lua 語言。如果有 Python 或者 JavaScript 的基礎(chǔ),寫起配置來并不會太難,可以參考最新版(目前是5.3.3) Lua 語言的官網(wǎng)。遇到語言方面的問題了,可以先去 StackOverflow 搜搜看,基本都能搜到結(jié)果
- 遇到關(guān)于 HammerSpoon 的問題,可以先看看他們的 Start Guide,一些初級的問題可以在這里找到答案
- Lua 語言中,調(diào)用
function有兩種寫法。一個是foo.bar(),另一個是foo:bar()。用了冒號,就相當(dāng)于傳入了this(或者說是 Python 中的self)作為函數(shù)的第一個參數(shù)。因此,foo:bar(baz)其實(shí)就相當(dāng)于foo.bar(foo, baz) - 用好 Console(控制臺),這十分重要。安裝好 HammerSpoon,點(diǎn)擊 MenuBar 上的 HammerSpoon 圖標(biāo),然后點(diǎn)擊 Console,就可以打開控制臺了。HammerSpoon 本身也提供了 Console 的接口 hs.console
- 如果只是簡單的想在 Console 輸出內(nèi)容,那么只需要在代碼中寫上
print就可以了。Lua 中支持兩種print寫法,一個是print "foo",適用于字符串。還有一種是print(foo),適用于變量 - HammerSpoon 的文檔中,一些方法是用
.調(diào)用的,一些是用:調(diào)用的。用.調(diào)用的方法,基本都可以在 Console 中直接執(zhí)行。但用:調(diào)用的方法,如果直接在 Console 中執(zhí)行是會報(bào)錯的。比如這個:hs.application:allWindows()。看名字就知道,這個是用來獲取某個 Application(應(yīng)用)的所有窗口。在 Console 中,我們只需要用一個實(shí)例來調(diào)用它就好了。比如,我們要顯示 Chrome 的所有窗口,那么這兩種寫法其實(shí)是一樣的:
hs.application.find('chrome'):allWindows()
hs.application.allWindows(hs.application.find('chrome'))
寫在最后
開頭提到過,其實(shí) HammerSpoon 能干的事情很多,絕不止窗口管理。我會在下一篇博客中講講關(guān)于音樂播放器的全局控制。感興趣的朋友可以看下我提交的代碼,以及文檔
歡迎在頁面下方評論和留言。如果你喜歡這篇文章,請幫我點(diǎn)個贊??