Navigate back to the homepage

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

宋辰文
April 1st, 2015 · 1 min read

虽然 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

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

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

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

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

  • 快捷键切换到 QQ
  • 当前窗口铺满屏幕的快捷键
  • 当前窗口切换显示器的快捷键
1local hyper = {'ctrl', 'alt', 'cmd'}
2local hyperShift = {'ctrl', 'alt', 'cmd', 'shift'}
3
4-- hyper + Q switch to QQ
5hs.hotkey.bind(hyper, key, function() hs.application.launchOrFocus('QQ') end)
6
7-- hyper + up maximize the current window
8hs.hotkey.bind(hyper, 'up', function()
9 hs.grid.maximizeWindow()
10end)
11
12-- hyper + shift + left move the current window to the left monitor
13hs.hotkey.bind(hyperShift, 'left', function()
14 local w = hs.window.focusedWindow()
15 if not w then
16 return
17 end
18 local s = w:screen():toWest()
19 if s then
20 w:moveToScreen(s)
21 end
22end)
23
24-- hyper + shift + right move the current window to the right monitor
25hs.hotkey.bind(hyperShift, 'right', function()
26 local w = hs.window.focusedWindow()
27 if not w then
28 return
29 end
30 local s = w:screen():toEast()
31 if s then
32 w:moveToScreen(s)
33 end
34end)

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

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

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

  • 快捷键切换一系列常用应用。
  • 当前窗口铺满屏幕。hyper + up
  • 把当前窗口移动到另一显示器。hyper + shift + left or right
  • 左右调整当前窗口,用来并排排列两个窗口。hyper + left or right
  • 专门排列当前应用窗口模式。hyper + down 进入模式。模式中 left, right 调整窗口。up, down 切换当前窗口。
  • 窗口切换 hints。hyper + h
  • 撤消窗口操作。hyper + z
  • 应用启动或者插上/拔下外接显示器时自动按配置调整窗口到常用位置。
  • 防止系统休眠。hyper + shift + c

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

More articles from 宋辰文

比 Hazel 更便宜强大的 Maid

桌面又成乱糟糟一片图标了,下载里也有数不清的文件。每次整理都很让人焦虑。相信以 OS X 为日常操作系统的人都会有这样的感触。当然其实 Windows 或者 Linux 也一样,收集文件并整理是每个人 IT 生活的一部分。

April 1st, 2015 · 1 min read

解决21世纪十大难题之一 AirDrop 传输失败

OS X 的 AirDrop 功能在近距离传文件又快又方便,比 QQ 好用得多。但却经常抽风,或者是打开 AirDrop 却不显示对方的设备,或者是刚一传文件直接就显示传输失败,实在是让人沮丧。

March 21st, 2015 · 1 min read
© 2019 宋辰文
Link to $https://mp.weixin.qq.com/s?__biz=MzAxNTI3MTUwMA==&mid=2247483701&idx=2&sn=34613cbb3252ac5eb6c31724f3109b59Link to $https://weibo.com/songchenwenLink to $https://twitter.com/songchenwenLink to $https://stackoverflow.com/users/2210682/songchenwen