Skip to content

Hammerspoon, OS X 上的全能窗口管理器

Posted on:April 1, 2015 at 04:00 PM
0

虽然 Mac 的触摸板很方便,但手指尽量少离开键盘区,仍然是提高效率的好方式。

OS X 上的快捷键很多,也很实用,很多操作只靠键盘就能完成的很好。但一旦涉及窗口管理的时候,就要把手指挪到触摸板上操作了。而我平时最常使用的窗口操作无非就是这几样:切换应用程序、把一个窗口在不同的显示器间移动、最大化窗口、并排排列两个窗口。这些简单的任务,如果都能绑定上快捷键就好了。

Hammerspoon 就是这样一款可高度定制的窗口管理器。

我以前用的是 Slate 作为窗口管理器。但是这货已经有两年多没更新过了,看起来是已经被抛弃了。而且 Slate 又有一些顽固的 Bug。于是我切换到了 Hammerspoon。

Hammerspoon fork 自 mjolnir,但比 mjolnir 更加易用,更像一个成型的产品,需要折腾的东西也更少一些。

下载好 Hammerspoon 后,把它拖到 Application 目录下,运行它,赋予它 Accesibility 权限。之后就可以开始写自己的配置脚本了。

Hammerspoon 的配置脚本基于 Lua,脚本语言其实都相通,这里有一篇 Learn Lua in Y minutes,大致看一下就能知道怎么写了。

打开 ~/.hammerspoon 目录,创建 init.lua 文件。

可以先试一个简单的 Hello World


hs.hotkey.bind({'cmd', 'shift'}, 'h', function()
	hs.alert('Hello World')
end)

保存之后,Reload Config 一下,然后按键盘上的 command + shift + h,屏幕上就会出现一个 Hello World 的字样,过一会就会自动消失。

Hammerspoon 是一个插件化的程序,像 hs.hotkeyhs.alert 这些都是 Hammerspoon 所集成的插件。其它还有很多插件,可以在这里找到详细的文档。

下面来写点更实用的配置。


local hyper = {'ctrl', 'alt', 'cmd'}
local hyperShift = {'ctrl', 'alt', 'cmd', 'shift'}

-- hyper + Q switch to QQ
hs.hotkey.bind(hyper, key, function() hs.application.launchOrFocus('QQ') end)

-- hyper + up maximize the current window
hs.hotkey.bind(hyper, 'up', function()
    hs.grid.maximizeWindow()
end)

-- hyper + shift + left move the current window to the left monitor
hs.hotkey.bind(hyperShift, 'left', function()
    local w = hs.window.focusedWindow()
    if not w then
        return
    end
    local s = w:screen():toWest()
    if s then
        w:moveToScreen(s)
    end
end)

-- hyper + shift + right move the current window to the right monitor
hs.hotkey.bind(hyperShift, 'right', function()
    local w = hs.window.focusedWindow()
    if not w then
        return
    end
    local s = w:screen():toEast()
    if s then
        w:moveToScreen(s)
    end
end)

这个配置中的 hyper 键,其实是把 ctrl + alt + command 的修饰键组合映射到了 caps lock 上。方法来自这篇文章

Hammerspoon 使用脚本语言来操作 OS X 的系统 API。使很多自动化操作成为可能。

我自己目前使用的配置文件,已经实现了下面这些功能。

这里是我的配置文件。将来很可能会逐渐具备更多功能。