ShiftitからHammerspoon Shiftitへの移行と設定方法

メンテナンスが止まってしまったShiftIt（執筆時2023年7月19日）からHammerspoon ShiftIt へ移行しようとしたのですが、手順や設定周りでつまづきました。

今回は私が行った移行手順や設定を紹介していきたいと思います。

## ShiftItの現状

更新が止まっている状態で新しいメンテナを探しています。
[Looking for a new maintainer? · Issue #296 · fikovnik/ShiftIt](https://github.com/fikovnik/ShiftIt/issues/296)

![fikovnik-ShiftIt-Managing-windows-size-and-position-in-OSX.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64171/3555eb5c-f437-8889-3719-d4be191beb54.png)

代替案として Hammerspoon、そしてHammerspoon に ShiftIt 機能を実装するShiftIt Spoonが推奨されています。

## Hammerspoon とは
ウィンドウ、マウス ポインター、クリップボード、位置情報サービス、Wi-Fi などのイベントをアクションに接続することができるユーティリティです。
構成ファイルをLua言語で記述します。

## Hammerspoon ShiftIt とは
HammerspoonでShiftItライクに画面分割を行えるツールです。

## Hammerspoon ShiftItのインストール

こちらにそって行います。
[peterklijn/hammerspoon-shiftit: A ShiftIt like Hammerspoon window management configuration](https://github.com/peterklijn/hammerspoon-shiftit#installation)

**step1**  
```
$ brew install --cask hammerspoon
```
brew でHammerspoonをインストールする。
起動し、メニューバーに Hammerspoon のロゴが表示されるのを確認

**step2**

[Hammerspoon ShiftItのダウンロード](https://github.com/peterklijn/hammerspoon-shiftit/raw/master/Spoons/ShiftIt.spoon.zip) し、Finder を使用して解凍する。
Finderを使用して `ShiftIt.spoon` をファイルを開く。

以下のパスにinit.luaがあることを確認
```sh
ls ~/.hammerspoon/Spoons/ShiftIt.spoon/
> init.lua
```

**step3**
Hammerspoon のメニューバー アイコンをクリックし、`Open Config` をクリックします。
そしてエディタでinit.luaファイルを開きます。

init.luaファイルに以下を貼り付け、保存して閉じます。

```
hs.loadSpoon("ShiftIt")
spoon.ShiftIt:bindHotkeys({})
```

Hammerspoon のメニューバー アイコンを再度クリックし、 `Reload Config` をクリックします。

**step4**
` System Preferences > Security & Privacy > Accessibility ` を確認して　Hammerspoon.appに権限があることを確認します。

## Hammerspoon ShiftItのキーマッピングの変更の仕方

` ~/.hammerspoon/Spoons/init.lua ` にキーマッピング設定を記載します。
以下がデフォルトのキーマッピングです。

```lua
{
 left = { { 'ctrl', 'alt', 'cmd' }, 'left' },
  right = { { 'ctrl', 'alt', 'cmd' }, 'right' },
  up = { { 'ctrl', 'alt', 'cmd' }, 'up' },
  down = { { 'ctrl', 'alt', 'cmd' }, 'down' },
  upleft = { { 'ctrl', 'alt', 'cmd' }, '1' },
  upright = { { 'ctrl', 'alt', 'cmd' }, '2' },
  botleft = { { 'ctrl', 'alt', 'cmd' }, '3' },
  botright = { { 'ctrl', 'alt', 'cmd' }, '4' },
  maximum = { { 'ctrl', 'alt', 'cmd' }, 'm' },
  toggleFullScreen = { { 'ctrl', 'alt', 'cmd' }, 'f' },
  toggleZoom = { { 'ctrl', 'alt', 'cmd' }, 'z' },
  center = { { 'ctrl', 'alt', 'cmd' }, 'c' },
  nextScreen = { { 'ctrl', 'alt', 'cmd' }, 'n' },
  previousScreen = { { 'ctrl', 'alt', 'cmd' }, 'p' },
  resizeOut = { { 'ctrl', 'alt', 'cmd' }, '=' },
  resizeIn = { { 'ctrl', 'alt', 'cmd' }, '-' }
}
```

` 動作名 = {keymapping} ` で設定できます。
例えば、` left = { { 'ctrl', 'alt', 'cmd' }, 'left' },` の場合は、`control + option + command ` でウィンドウを左寄せにします。

使用できるキーはHammerspoonのドキュメントに記載されています。
[Hammerspoon docs: hs.keycodes](https://www.hammerspoon.org/docs/hs.keycodes.html#map)


参考までにこちらが私の設定です。
```lua
-- SpoonInstall の設定
hs.loadSpoon("SpoonInstall")

-- ShiftItの設定
-- [peterklijn/hammerspoon-shiftit: A ShiftIt like Hammerspoon window management configuration](https://github.com/peterklijn/hammerspoon-shiftit)
spoon.SpoonInstall.repos.ShiftIt = {
   url = "https://github.com/peterklijn/hammerspoon-shiftit",
   desc = "ShiftIt spoon repository",
   branch = "master",
}
spoon.SpoonInstall:andUse("ShiftIt", { repo = "ShiftIt" })



-- ShiftItの設定
hs.loadSpoon("ShiftIt")
local mash = { 'shift', 'alt', 'cmd' }

-- hotkeyの設定の仕方
-- 動作名 = {keybind}
spoon.ShiftIt:bindHotkeys({
    left = { mash, 'left' },
    right = { mash, 'right' },
    maximum = { mash, 'up' },
})
```

## 参考文献
- [peterklijn/hammerspoon-shiftit: A ShiftIt like Hammerspoon window management configuration](https://github.com/peterklijn/hammerspoon-shiftit)
- [fikovnik/ShiftIt: Managing windows size and position in OSX](https://github.com/fikovnik/ShiftIt)
- [Hammerspoon が面白い - rochefort's blog](https://rochefort.hatenablog.com/entry/2017/02/25/070000)
- [ShiftItをHammerspoonによって代替する - Qiita](https://qiita.com/kabosu3d/items/66f6727f1140497b2cf7)