【備忘録】HammerSpoonにウィンドウ操作設定をちょっとだけした話

# やりたかったこと
HammerSpoonで下記
- ShiftItで行なっている画面分割
- Windowsチックなタブ移動
- マウスを触らずにウィンドウを画面移動
- etc..

# HammerSpoonをインストール
HammerspoonをHomebrew経由でインストール。
```install
brew install --cask hammerspoon
```

# ShiftIt Spoonをインストール
[ShiftIt spoon](https://github.com/peterklijn/hammerspoon-shiftit#step-2)をダウンロード。

# 画面分割の設定
- `loadSpoon`で`ShiftIt Spoon`のロードを行う。
- `setWindowCyclingSizes`で複数回ショートカットキーを押した時の画面サイズを指定できる。
    - 第一引数：横サイズのサイクルを指定
        - `{50,33,25}`であれば１回目：５０％、２回目:３３％、３回目：２５％のサイズとなる
    - 第二引数：縦サイズのサイクルを指定
        - `{50}` であれば何回押しても50%のサイズとなる。
- `bindHotkeys`にHotkey設定を行うことで特定のショートカットキーを選択できる
    - 例：`left = { { 'ctrl', 'shift' }, 'a' }`：ctrlキー, shiftキー、aキーの同時押しで左寄せ
```init.lua
 hs.loadSpoon("ShiftIt")
 spoon.ShiftIt:setWindowCyclingSizes({ 50, 33, 25 }, { 50 })
 spoon.ShiftIt:bindHotkeys({
    left = { { 'ctrl', 'shift' }, 'a' },
    right = { { 'ctrl', 'shift' }, 'd' },
    up = { { 'ctrl', 'shift' }, 'w' },
    down = { { 'ctrl', 'shift' }, 'x' },
    upleft = { { 'ctrl', 'shift' }, 'q' },
    upright = { { 'ctrl', 'shift' }, 'e' },
    botleft = { { 'ctrl', 'shift' }, 'z' },
    botright = { { 'ctrl', 'shift' }, 'c' },
    maximum = { { 'ctrl', 'shift' }, 'm' },
    center = { { 'ctrl', 'shift' }, 's' }
 })
```

# ウィンドウ切り替えの設定
- HammerSpoonに標準装備されている`switcher`を使用して切り替えが行える。
- `switcher.ui`に設定を行うことで画面表示を変えることができる。
    - 詳細は[こちら](https://github.com/Hammerspoon/hammerspoon/blob/master/extensions/window/window_switcher.lua#L53)を参考
- ウィンドウ移動をHotkeyに設定
    - `next()`で次のウィンドウへ移動
    - `previous()`で前のウィンドウへ移動
```init.lua
 switcher = hs.window.switcher.new()
 switcher.ui.showTitles =false
 switcher.ui.showExtraKeys = false
 switcher.ui.thumbnailSize = 200
 switcher.ui.showSelectedThumbnail = false
 switcher.ui.backgroundColor = {0, 0, 0, 0.8}
 switcher.ui.highlightColor = {0.3, 0.3, 0.3, 0.8}
 hs.hotkey.bind('option', 'k', function()switcher:next()end)
 hs.hotkey.bind('option', 'j', function()switcher:previous()end)
```
# デスクトップ移動
- `hs.window.focusedWindow()`フォーカスしているウィンドウを取得
- 画面サイズが変わることを考慮してウィンドウのサイズを変更する必要がある。。
    - サイズ情報を取得
        - `app:frame()`:フォーカスしているウィンドウのサイズ
        - `app:screen():frame()`:現在の画面のサイズ
        - `app:screen():next():frame()`:移動さきの画面のサイズ
- `app:moveToScreen(app:screen():next())`：次の画面へウィンドウを移動する。（2画面しか使わないから切り替えているだけ。。）
- HotKey設定を施し完了！！
```init.lua
 function moveToChangeScreen()
   local app = hs.window.focusedWindow()
   local appSize = app:frame()
   local focusScreenSize = app:screen():frame()
   local changeScreenSize = app:screen():next():frame()
   
   app:moveToScreen(app:screen():next())
   appSize.x = ((((appSize.x - focusScreenSize.x) / focusScreenSize.w) * changeScreenSize.w) + changeScreenFrame.x)
   appSize.y = ((((appSize.y - focusScreenSize.y) / focusScreenSize.h) * changeScreenSize.h) + changeScreenFrame.y)
   appSize.h = ((appSize.h / focusScreenSize.h) * changeScreenSize.h)
   appSize.w = ((appSize.w / focusScreenSize.w) * changeScreenSize.w)
 end
 hs.hotkey.bind({"ctrl", "shift"}, "1", moveToChangeScreen)
```
# さいごに
設定をReloadして使えるようになるで！！！
もっと良い設定があれば追記予定。。。。。。

# 参考文献
https://www.hammerspoon.org/docs/index.html
https://kawase-k.hatenablog.com/entry/2022/02/19/070000
https://blog.apiless.com/2023/02/02/mac-hammerspoon-switcher/