HammerSpoon - 不止是窗口管理

来源: 我的博客

概述

HammerSpoon 是一个可以用来进行窗口管理的 App,开源免费。当然,功能也不仅限于此

本文旨在介绍如何用 HammerSpoon 配置窗口管理功能。类似的软件,收费的有 SizeUpMoomDivvy, 免费的有 SpectacleSlate

SizeUp 和 Divvy 在功能上各有所长。SizeUp 方便快速调节窗口位置,但不方便快速调节窗口大小,Divvy反之。虽然也可以在 Divvy 里设置快速 Resize 到指定大小的快捷键,但只是比较基础的设置,不能实时调整。而 Spectacle 和 Slate 更像是这两个软件的功能集合,而且比他们都强大,只是在配置方面要花些时间。Slate 的原作者已经 3 年没管过这个项目了,但这个 fork 还是有人维护的

推荐HammerSpoon,因为它的窗口管理功能足够强大。而且对开发者很友好,有控制台可以 Debug。语言采用 Lua,不难上手。另外,还有茫茫多的系统 API 可以随意调用。所以说,HammerSpoon 绝不仅仅是一个窗口管理软件

如果你符合以下这几点:

  1. 使用 MacOS
  2. 想用键盘调整窗口大小和位置
  3. 有多个外接屏幕,想用快捷键把窗口在屏幕之间扔来扔去

那么,请继续往下读

不想看配置细节或者已经掌握了配置方法的朋友,可以直接跳到下载页面,载入我的配置文件,只需要几分钟,你就可以告别这些不科学的操作了

使用

我们先来看看配置好之后,有什么效果,随便举两个例子:

Halves.gif
AnchorLeft.gif

按照这篇教程配置,你可以用键盘快捷键触发以下动作:

  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 是保持右边和下边不动就好了。毕竟,CtrlCommand 的左边

配置

配置方面,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,也就是这样:


GridExample.jpg

那么,通过设置窗口占多少个格子,就可以实现快速布局了

一点建议

  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()
hs.application.allWindows(hs.application.find('chrome'))

写在最后

开头提到过,其实 HammerSpoon 能干的事情很多,绝不止窗口管理。我会在下一篇博客中讲讲关于音乐播放器的全局控制。感兴趣的朋友可以看下我提交的代码,以及文档


欢迎在页面下方评论和留言。如果你喜欢这篇文章,请帮我点个赞👍

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • Sublime Text:一款具有代码高亮、语法提示、自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插...
    追風逸少丶阅读 11,316评论 1 34
  • Sublime Text:一款具有代码高亮、语法提示、自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插...
    xiaotao123阅读 9,489评论 0 27
  • 返回上次光标的位置Ctrl+Alt+ left/right 返回至上次浏览的位置 Alt+回车 导入包,自动修正C...
    请叫我四爷阅读 1,906评论 1 2
  • 又值一年中秋日 与一友相谈,有感于他的境遇和自己的经历一路走来的心路历程,随做一词: 水调歌头 中秋 客寄边城月...
    而淑阅读 522评论 5 7
  • 史蒂芬柯维在高效能人士的七个习惯中将积极主动列为第一个习惯,是由内到外全面打造自己的基础。 梭罗说,最令人鼓舞的事...
    向日小葵123阅读 824评论 1 1