💡

Macのウィンドウ切り替えをHammerspoonでちょっと便利にする

2024/01/21に公開

Macは command + tab でウィンドウ切り替えできる機能が標準でありますが、Hammerspoonでちょっとだけ便利なウィンドウ切り替えを実現してみました。

何が便利?

command + tab の切り替えは、現在立ち上がっている全てのアプリケーションから選択します。ですが、多くのアプリケーションが立ち上がっていると選択するのが大変です。

  • 今表示しているデスクトップ内(Mission Controlでの今の操作スペース)で切り替えしたい。
  • 外部ディスプレイを接続している時は、フォーカスのあるディスプレイ内のウィンドウで切り替えしたい。

ということでHammerspoonを使ってウィンドウ切り替えを設定してみました。

Hammerspoonについて

HammerspoonはmacOSで動作する高機能なキーカスタマイズツールといった感じです。といっても、設定ファイルはLuaで記述するプログラムになっていて、キーカスタマイズ以外にも色々できるツールになっています。

何をするにもLuaで記述する必要があるので気軽にGUIでポチポチ設定できたりはしません。その代わりに自分で好きな動作を実現できる自由度があります。

設定内容

早速ですが以下の設定をしてみました。~/.hammerspoon/init.luaにこの設定をすると、command+jcommand+kで現在のディスプレイ&デスクトップ内でのウィンドウ切り替えができるようになります。

-- Hammerspoon config file ~/.hammerspoon/init.lua

local wf = hs.window.filter
local currentMainScreen = -1
local switcher

local function updateCurrentScreen()
    local current = hs.screen.mainScreen():id()
    if current ~= currentMainScreen then
        currentMainScreen = current
        switcher = hs.window.switcher.new(
            wf.new():setCurrentSpace(true):setScreens(current):setDefaultFilter{visible=true})
    end
end

updateCurrentScreen()

---@param direction integer
local function switchWindow(direction)
    return function()
        updateCurrentScreen()
        if direction > 0 then
            switcher:next()
        else
            switcher:previous()
        end
    end
end

hs.hotkey.bind({"cmd"}, "J", switchWindow(1))
hs.hotkey.bind({"cmd"}, "K", switchWindow(-1))

関数updateCurrentScreenでは、外部ディスプレイを接続している場合の処理をしています。hs.screen.mainScreen():id()でフォーカスのあるディスプレイ番号が得られるので、変化していたらhs.window.switcher.new()でswitcherを新たに作っています。

switcherを作る際にはhs.window.filtersetCurrentSpace(true)で現在のデスクトップに限定しています。
あとsetDefaultFilter{visible=true}で最小化されたウィンドウは除外しています。

最後に

ウィンドウ切り替えがちょっとだけ便利になって、作業が快適になりました。Hammerspoonは設定の敷居が高いかもしれないけど、便利で良いツールです。

Discussion