◆

Mac 初始化配置与 Hammerspoon 快捷键

2023-12-20 01:190

这篇是我换新 Mac 时的配置备忘。重装系统或者换机器最费时间的不是装软件,而是那些零散的系统设置和快捷键——不记下来每次都得凭记忆重新摸一遍。

常用工具

toolbox https://www.jetbrains.com.cn/toolbox-app/download/download-thanks.html?platform=macM1

JetBrains Toolbox 是管理 IDE 的入口,装了它之后 WebStorm、IntelliJ 这些都从里面装和更新,不用各自去官网下。好处是版本升级时能保留旧版本、配置自动迁移,出问题可以一键回退到上个版本。链接是 Apple Silicon 版本,Intel 机器要换 platform 参数。

鼠标滚轮方向

1.鼠标滚轮方向 https://download.csdn.net/download/weixin_40013817/88484392?spm=1001.2014.3001.5501

macOS 默认的滚动方向是「自然」的(内容跟着手指走),和 Windows 相反。系统设置里虽然有开关,但它会同时作用于触控板和鼠标——触控板用自然方向很顺,外接鼠标却希望是传统方向,系统自带的设置做不到这种区分。

上面的链接是解决这个问题的工具。同类的还有 Mos 这个开源工具(GitHub 上能找到),我现在用的是它:可以只反转鼠标的滚动方向、触控板保持不变,还能给鼠标滚动加平滑效果,缓解外接鼠标滚动一格跳一大截的问题。

Hammerspoon 快捷键配置

Hammerspoon 是 macOS 上的自动化工具,用 Lua 写配置,能拿到窗口、屏幕、鼠标、应用的完整控制权。配置文件放在 ~/.hammerspoon/init.lua,改完在菜单栏图标里点 Reload Config 即时生效,不用重启。

它比系统设置强的地方在于能做系统压根没提供的操作,比如下面这几个——把鼠标瞬移到另一块屏幕、把窗口整体挪到另一块屏幕并保持相对位置。多显示器办公时这两个能省掉大量拖拽动作。

-- 使用【Option+Q】在不同屏幕之间移动鼠标
hs.hotkey.bind({'command'}, 'escape', function()
    local screen = hs.mouse.getCurrentScreen()
    local nextScreen = screen:next()
    local rect = nextScreen:fullFrame()
    local center = hs.geometry.rectMidPoint(rect)
    hs.mouse.absolutePosition(center)
end)

-- 使用【Option+W】在不同屏幕之间移动窗口
hs.hotkey.bind({'option'}, '`', function()
    -- get the focused window
    local win = hs.window.focusedWindow()
    -- get the screen where the focused window is displayed, a.k.a. current screen
    local screen = win:screen()
    -- compute the unitRect of the focused window relative to the current screen
    -- and move the window to the next screen setting the same unitRect
    win:move(win:frame():toUnitRect(screen:frame()), screen:next(), true, 0)
end)

-- 打开访达
hs.hotkey.bind({"option"}, "E", function()
    x = hs.application.open("/System/Library/CoreServices/Finder.app")
end)

-- 打开系统设置
hs.hotkey.bind({"option"}, ",", function()
    x = hs.application.open("/System/Applications/System Settings.app")
end)

逐段说下这几个配置在做什么。

hs.hotkey.bind({修饰键}, 按键, 回调) 是注册全局快捷键的入口,三个参数分别是修饰键数组、主键、按下时执行的函数。全局意味着不管当前焦点在哪个应用都会触发。

移动鼠标那段:hs.mouse.getCurrentScreen() 拿到鼠标当前所在的屏幕,screen:next() 取下一块屏幕(多屏时循环),fullFrame() 得到那块屏幕的完整矩形区域,rectMidPoint 算出中心点,最后 absolutePosition 把鼠标传送过去。效果是一个键把鼠标直接扔到另一块屏幕中央,不用横跨半米去拖。

移动窗口那段:核心是 toUnitRect。它把窗口的绝对坐标转换成相对于所在屏幕的比例坐标(比如「占屏幕左半边」表示成 0,0,0.5,1)。然后用这个比例在新屏幕上重新定位,所以两块屏幕分辨率不同也能保持相同的相对布局——窗口在原屏占一半,到新屏还是占一半。win:move 最后两个参数是 ensureInScreenBounds 和动画时长,设 0 表示瞬间完成不要动画。

打开应用那两段:hs.application.open 传绝对路径。访达在 /System/Library/CoreServices/Finder.app(不在 Applications 里,因为它是系统核心服务),系统设置在 /System/Applications/System Settings.app。注意这个路径在 Ventura 之前叫 System Preferences.app,老系统上要改成旧名字,否则打不开。

有个不一致要注意:代码注释写的是「Option+Q」和「Option+W」,但实际绑定的是 command + escape 和 `option + ``。注释是从别处抄来后改了键位没同步更新——这种情况在配置文件里很常见,以代码为准。

选键位的原则是避开系统和常用应用已占用的组合。option 加符号键(`、,、.)比较安全,很少有应用用这类组合。

第一次运行 Hammerspoon 需要在「系统设置 → 隐私与安全性 → 辅助功能」里授权,否则它拿不到窗口控制权限,脚本执行没有任何反应也不报错。这是最容易卡住的一步。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEMac 初始化配置与 Hammerspoon 快捷键加载中