Macのウィンドウ切り替えをHammerspoonでちょっと便利にする
Macは command + tab でウィンドウ切り替えできる機能が標準でありますが、Hammerspoonでちょっとだけ便利なウィンドウ切り替えを実現してみました。
何が便利?
command + tab の切り替えは、現在立ち上がっている全てのアプリケーションから選択します。ですが、多くのアプリケーションが立ち上がっていると選択するのが大変です。
- 今表示しているデスクトップ内(Mission Controlでの今の操作スペース)で切り替えしたい。
- 外部ディスプレイを接続している時は、フォーカスのあるディスプレイ内のウィンドウで切り替えしたい。
ということでHammerspoonを使ってウィンドウ切り替えを設定してみました。
Hammerspoonについて
HammerspoonはmacOSで動作する高機能なキーカスタマイズツールといった感じです。といっても、設定ファイルはLuaで記述するプログラムになっていて、キーカスタマイズ以外にも色々できるツールになっています。
何をするにもLuaで記述する必要があるので気軽にGUIでポチポチ設定できたりはしません。その代わりに自分で好きな動作を実現できる自由度があります。
設定内容
早速ですが以下の設定をしてみました。~/.hammerspoon/init.lua
にこの設定をすると、command
+j
とcommand
+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.filter
のsetCurrentSpace(true)
で現在のデスクトップに限定しています。
あとsetDefaultFilter{visible=true}
で最小化されたウィンドウは除外しています。
最後に
ウィンドウ切り替えがちょっとだけ便利になって、作業が快適になりました。Hammerspoonは設定の敷居が高いかもしれないけど、便利で良いツールです。
Discussion