HammerSpoon - 不止是窗口管理
來源:http://singsing.io/blog/2016/11/27/HammerSpoon-1/
作者:S1ngS1ng(轉載已獲得作者許可)
文中有些圖片為動圖,請先點擊一次,才能看見動態效果!n
HammerSpoon 是一個可以用來進行窗口管理的 App,開源免費。當然,功能也不僅限於此
本文旨在介紹如何用 HammerSpoon 配置窗口管理功能。類似的軟體,收費的有 SizeUp,Moom 和 Divvy, 免費的有 Spectacle 和 Slate
SizeUp 和 Divvy 在功能上各有所長。SizeUp 方便快速調節窗口位置,但不方便快速調節窗口大小,Divvy反之。雖然也可以在 Divvy 里設置快速 Resize 到指定大小的快捷鍵,但只是比較基礎的設置,不能實時調整。而 Spectacle 和 Slate 更像是這兩個軟體的功能集合,而且比他們都強大,只是在配置方面要花些時間。Slate 的原作者已經 3 年沒管過這個項目了,但這個 fork 還是有人維護的
推薦HammerSpoon,因為它的窗口管理功能足夠強大。而且對開發者很友好,有控制台可以 Debug。語言採用 Lua,不難上手。另外,還有茫茫多的系統 API 可以隨意調用。所以說,HammerSpoon 絕不僅僅是一個窗口管理軟體
如果你符合以下這幾點:
- 使用 MacOS
- 想用鍵盤調整窗口大小和位置
- 有多個外接屏幕,想用快捷鍵把窗口在屏幕之間扔來扔去
那麼,請繼續往下讀
不想看配置細節或者已經掌握了配置方法的朋友,可以直接跳到下載頁面,載入我的配置文件,只需要幾分鐘,你就可以告別這些不科學的操作了
使用
我們先來看看配置好之後,有什麼效果,隨便舉兩個例子:
按照這篇教程配置,你可以用鍵盤快捷鍵觸發以下動作:
- 在當前的屏幕全屏化某個窗口,適用於任何屏幕和窗口
- 在當前屏幕上居中窗口
- 把窗口大小調整到屏幕大小的一半(上下左右)。適用於任何屏幕和窗口
- 把當前窗口扔到其他顯示器上,並且全屏(可選)
- 任意調整當前窗口大小
- 關於任意移動窗口,我沒把這個功能寫進來,因為自己不太需要。如果你需要實現這個功能,看完這篇博客就會了
下載安裝
- 首先是 HammerSpoon 的主程序。這個一定要下載安裝
- 先找到當前的最新版
- 下載安裝,把圖標拖到 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
- 設置窗口大小為屏幕大小的一半
- Ctrl-Alt-Command + 左 寬度為一半,靠左
- Ctrl-Alt-Command + 右 寬度為一半,靠右
- Ctrl-Alt-Command + 上 高度為一半,靠上
- Ctrl-Alt-Command + 下 高度為一半,靠下
- 設置窗口大小,以左、上為基準 (意思是左邊界和上邊界不動)
- Ctrl-Alt-Shift + 左 窗口右側邊左移
- Ctrl-Alt-Shift + 右 窗口右側邊右移
- Ctrl-Alt-Shift + 上 窗口上邊界上移
- Ctrl-Alt-Shift + 下 窗口上邊界下移
- 設置窗口大小,以右、下為基準
- Alt-Command-Shift + 左 窗口左側邊左移
- Alt-Command-Shift + 右 窗口左側邊右移
- Alt-Command-Shift + 上 窗口下邊界上移
- Alt-Command-Shift + 下 窗口下邊界下移
其中,居中、全屏、窗口移到其他屏幕、窗口設置為一半屏幕大小的快捷鍵都和 SizeUp 的一樣。至於窗口大小調整,只要記住Ctrl-Alt-Shift 是保持左邊和下邊不動,Command-Alt-Shift 是保持右邊和下邊不動就好了。畢竟,Ctrl 在 Command的左邊
配置
配置方面,HammerSpoon 本身就提供了眾多的 API,不光有它自己的,還有來自 Mac OS 系統的。完整的 API 文檔在這裡
API
以下是我的配置文件中,用到的 API:
- hs.alert - 用來顯示提示信息。位置默認為屏幕中央,黑底白字,大概三秒鐘之後消失。類似功能的還有 hs.notify,也就是系統的 Notification(通知)
- hs.grid - 用來設置 Grid(網格)。我的配置文件中,實現窗口大小調整和位置調整,都是基於這個 API
- hs.hotkey - 用來設置快捷鍵。我的配置文件中調用的是它的 bind 方法
- hs.screen - 與屏幕(顯示器)相關的 API,可以獲取屏幕參數,設置 Grid(網格)
- hs.screen.watcher - 用於監聽屏幕(顯示器)解析度、數量變化等的 watcher
- hs.window - 與應用程序窗口相關的 API,提供了獲取激活窗口,移動窗口到其他顯示器,移動窗口到屏幕中心等方法
基本原理
首先,根據屏幕的長寬比,把屏幕分成 Grid(網格)。比如 16:9 的屏幕,就分成 8 * 4,也就是這樣:
那麼,通過設置窗口佔多少個格子,就可以實現快速布局了
一點建議
- 關於 Lua 語言。如果有 Python 或者 JavaScript 的基礎,寫起配置來並不會太難,可以參考最新版(目前是5.3.3) Lua 語言的官網。遇到語言方面的問題了,可以先去 StackOverflow 搜搜看,基本都能搜到結果
- 遇到關於 HammerSpoon 的問題,可以先看看他們的 Start Guide,一些初級的問題可以在這裡找到答案
- Lua 語言中,調用 function 有兩種寫法。一個是 foo.bar(),另一個是 foo:bar()。用了冒號,就相當於傳入了 this(或者說是 Python 中的 self)作為函數的第一個參數。因此,foo:bar(baz) 其實就相當於 foo.bar(foo, baz)
- 用好 Console(控制台),這十分重要。安裝好 HammerSpoon,點擊 MenuBar 上的 HammerSpoon 圖標,然後點擊 Console,就可以打開控制台了。HammerSpoon 本身也提供了 Console 的介面 hs.console
- 如果只是簡單的想在 Console 輸出內容,那麼只需要在代碼中寫上 print 就可以了。Lua 中支持兩種 print 寫法,一個是 print "foo",適用於字元串。還有一種是 print(foo),適用於變數
- HammerSpoon 的文檔中,一些方法是用.調用的,一些是用:調用的。用.調用的方法,基本都可以在 Console 中直接執行。但用:調用的方法,如果直接在 Console 中執行是會報錯的。比如這個:hs.application:allWindows()。看名字就知道,這個是用來獲取某個 Application(應用)的所有窗口。在 Console 中,我們只需要用一個實例來調用它就好了。比如,我們要顯示 Chrome 的所有窗口,那麼這兩種寫法其實是一樣的:
hs.application.find(chrome):allWindows()nhs.application.allWindows(hs.application.find(chrome))n
寫在最後
開頭提到過,其實 HammerSpoon 能幹的事情很多,絕不止窗口管理。我會在下一篇博客中講講關於音樂播放器的全局控制。感興趣的朋友可以看下我提交的代碼,以及文檔
—————————————————————————————————————————
在學習過程如果有任何疑問,請來極樂網(http://www.dreawer.com)提問,或者掃描下方二維碼,關注極樂官方微信,在平台下方留言~
推薦閱讀:
※用好Lua+Unity,讓性能飛起來—LuaJIT性能坑詳解
※Lua程序逆向之Luac文件格式分析
※用LuaStudio調試Unity中SLua里的Lua5.3代碼
※維基百科中模板和模塊有什麼區別?