HammerSpoon - 不止是窗口管理

來源:singsing.io/blog/2016/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 絕不僅僅是一個窗口管理軟體

如果你符合以下這幾點:

  1. 使用 MacOS
  2. 想用鍵盤調整窗口大小和位置
  3. 有多個外接屏幕,想用快捷鍵把窗口在屏幕之間扔來扔去

那麼,請繼續往下讀

不想看配置細節或者已經掌握了配置方法的朋友,可以直接跳到下載頁面,載入我的配置文件,只需要幾分鐘,你就可以告別這些不科學的操作了

使用

我們先來看看配置好之後,有什麼效果,隨便舉兩個例子:

按照這篇教程配置,你可以用鍵盤快捷鍵觸發以下動作:

  1. 在當前的屏幕全屏化某個窗口,適用於任何屏幕和窗口
  2. 在當前屏幕上居中窗口
  3. 把窗口大小調整到屏幕大小的一半(上下左右)。適用於任何屏幕和窗口
  4. 把當前窗口扔到其他顯示器上,並且全屏(可選)
  5. 任意調整當前窗口大小
  6. 關於任意移動窗口,我沒把這個功能寫進來,因為自己不太需要。如果你需要實現這個功能,看完這篇博客就會了

下載安裝

  1. 首先是 HammerSpoon 的主程序。這個一定要下載安裝
    • 先找到當前的最新版
    • 下載安裝,把圖標拖到 Application 裡面去
  2. 我的配置文件在這裡:S1ngS1ng - HammerSpoon,懶得自己配置了就用這個好了
  3. 可以直接 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:

  1. hs.alert - 用來顯示提示信息。位置默認為屏幕中央,黑底白字,大概三秒鐘之後消失。類似功能的還有 hs.notify,也就是系統的 Notification(通知)
  2. hs.grid - 用來設置 Grid(網格)。我的配置文件中,實現窗口大小調整和位置調整,都是基於這個 API
  3. hs.hotkey - 用來設置快捷鍵。我的配置文件中調用的是它的 bind 方法
  4. hs.screen - 與屏幕(顯示器)相關的 API,可以獲取屏幕參數,設置 Grid(網格)
  5. hs.screen.watcher - 用於監聽屏幕(顯示器)解析度、數量變化等的 watcher
  6. hs.window - 與應用程序窗口相關的 API,提供了獲取激活窗口,移動窗口到其他顯示器,移動窗口到屏幕中心等方法

基本原理

首先,根據屏幕的長寬比,把屏幕分成 Grid(網格)。比如 16:9 的屏幕,就分成 8 * 4,也就是這樣:

那麼,通過設置窗口佔多少個格子,就可以實現快速布局了

一點建議

  1. 關於 Lua 語言。如果有 Python 或者 JavaScript 的基礎,寫起配置來並不會太難,可以參考最新版(目前是5.3.3) Lua 語言的官網。遇到語言方面的問題了,可以先去 StackOverflow 搜搜看,基本都能搜到結果
  2. 遇到關於 HammerSpoon 的問題,可以先看看他們的 Start Guide,一些初級的問題可以在這裡找到答案
  3. Lua 語言中,調用 function 有兩種寫法。一個是 foo.bar(),另一個是 foo:bar()。用了冒號,就相當於傳入了 this(或者說是 Python 中的 self)作為函數的第一個參數。因此,foo:bar(baz) 其實就相當於 foo.bar(foo, baz)
  4. 用好 Console(控制台),這十分重要。安裝好 HammerSpoon,點擊 MenuBar 上的 HammerSpoon 圖標,然後點擊 Console,就可以打開控制台了。HammerSpoon 本身也提供了 Console 的介面 hs.console
  5. 如果只是簡單的想在 Console 輸出內容,那麼只需要在代碼中寫上 print 就可以了。Lua 中支持兩種 print 寫法,一個是 print "foo",適用於字元串。還有一種是 print(foo),適用於變數
  6. HammerSpoon 的文檔中,一些方法是用.調用的,一些是用:調用的。用.調用的方法,基本都可以在 Console 中直接執行。但用:調用的方法,如果直接在 Console 中執行是會報錯的。比如這個:hs.application:allWindows()。看名字就知道,這個是用來獲取某個 Application(應用)的所有窗口。在 Console 中,我們只需要用一個實例來調用它就好了。比如,我們要顯示 Chrome 的所有窗口,那麼這兩種寫法其實是一樣的:

hs.application.find(chrome):allWindows()nhs.application.allWindows(hs.application.find(chrome))n

寫在最後

開頭提到過,其實 HammerSpoon 能幹的事情很多,絕不止窗口管理。我會在下一篇博客中講講關於音樂播放器的全局控制。感興趣的朋友可以看下我提交的代碼,以及文檔

—————————————————————————————————————————

在學習過程如果有任何疑問,請來極樂網(dreawer.com)提問,或者掃描下方二維碼,關注極樂官方微信,在平台下方留言~


推薦閱讀:

用好Lua+Unity,讓性能飛起來—LuaJIT性能坑詳解
Lua程序逆向之Luac文件格式分析
用LuaStudio調試Unity中SLua里的Lua5.3代碼
維基百科中模板和模塊有什麼區別?

TAG:窗口管理器 | Lua |