Hammerspoon実践活用：Macの作業効率を劇的に向上させる自動化レシピ集


# Hammerspoon実践活用：Macの作業効率を劇的に向上させる自動化レシピ集

この記事では、Macの作業効率を劇的に向上させる強力な自動化ツール「Hammerspoon」の実践的な活用方法を解説します。Hammerspoonは、Luaスクリプトを使ってMacの様々な操作を自動化できるため、日々の作業を大幅に効率化することが可能です。この記事を通して、Hammerspoonの導入から実践的なレシピまでを学び、あなたのMac環境をより快適に、そして生産性の高いものにしましょう。

## 1. はじめに：Hammerspoonで実現できることと、その強力な理由

Hammerspoonは、Macの操作をLuaスクリプトで制御できる、非常に強力な自動化ツールです。キーボードショートカットのカスタマイズ、ウィンドウ操作、アプリケーションの制御、テキスト入力の効率化など、多岐にわたる操作を自動化できます。

**Hammerspoonが強力な理由**

*   **高いカスタマイズ性:** Luaスクリプトによって、ほぼすべての操作を自由にカスタマイズできます。
*   **柔軟な拡張性:** 豊富なAPIが用意されており、複雑な自動化も実現可能です。
*   **無料かつオープンソース:** 費用を気にせず、自由に利用・貢献できます。
*   **キーボード中心の操作:** マウス操作を減らし、より効率的な作業環境を構築できます。

この記事では、Hammerspoonの基本的な使い方から、具体的なレシピまでを解説し、あなたの作業効率を最大化するお手伝いをします。

## 2. 必須設定：Hammerspoon導入と初期設定の最適化

Hammerspoonを利用するには、まずインストールと初期設定が必要です。

1.  **Hammerspoonのダウンロード:** 公式サイト([http://www.hammerspoon.org/](http://www.hammerspoon.org/))から最新版をダウンロードし、インストールします。
2.  **設定ファイルの作成:** `~/.hammerspoon/init.lua` に設定を記述します。このファイルがHammerspoonのメイン設定ファイルとなります。
3.  **アクセシビリティ設定:** システム環境設定の「セキュリティとプライバシー」で、Hammerspoonにアクセシビリティを許可します。

初期設定として、以下の設定を`init.lua`に記述することを推奨します。

```lua
-- リロード用のキーバインドを設定 (Ctrl + Shift + R)
hs.hotkey.bind({"ctrl", "shift"}, "r", function()
  hs.reload()
end)

-- 設定ファイルの変更を監視し、自動でリロードする
hs.fs.watcher.new(os.getenv("HOME") .. "/.hammerspoon", function()
  hs.reload()
end):start()
```

この設定により、設定ファイルを変更するたびにHammerspoonを再起動する必要がなくなります。

## 3. ウィンドウ操作の自動化：キーボードだけでウィンドウを自由自在に操る

Hammerspoonの強力な機能の一つが、ウィンドウ操作の自動化です。キーボードショートカットを使って、ウィンドウの移動、リサイズ、画面分割などを効率的に行うことができます。

### 具体例：画面分割、ウィンドウ移動、リサイズをショートカットで実行

以下のコードは、`hs.grid`モジュールを使って、ウィンドウを画面の左半分、右半分、全画面に移動させる例です。

```lua
-- グリッド設定
local grid = hs.grid.new()

-- ウィンドウを左半分に移動
hs.hotkey.bind({"ctrl", "alt"}, "left", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(1, 1, 2, 1))
end)

-- ウィンドウを右半分に移動
hs.hotkey.bind({"ctrl", "alt"}, "right", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(3, 1, 2, 1))
end)

-- ウィンドウを全画面に移動
hs.hotkey.bind({"ctrl", "alt"}, "m", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(1, 1, 4, 1))
end)
```

このコードを`init.lua`に追加し、Hammerspoonをリロードすると、`Ctrl + Alt + Left`でウィンドウが左半分に、`Ctrl + Alt + Right`で右半分に、`Ctrl + Alt + M`で全画面に移動するようになります。

### コード例：`hs.grid`モジュールを使ったウィンドウ操作スクリプト

上記の例をさらに拡張し、グリッドのサイズをカスタマイズすることも可能です。

```lua
-- グリッドを4x2に設定
local grid = hs.grid.new(4, 2)

-- ウィンドウを左上に移動
hs.hotkey.bind({"ctrl", "alt"}, "1", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(1, 1, 1, 1))
end)

-- ウィンドウを右上に移動
hs.hotkey.bind({"ctrl", "alt"}, "2", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(2, 1, 1, 1))
end)

-- ウィンドウを左下に移動
hs.hotkey.bind({"ctrl", "alt"}, "3", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(1, 2, 1, 1))
end)

-- ウィンドウを右下に移動
hs.hotkey.bind({"ctrl", "alt"}, "4", function()
  grid:pushWindowToUnit(hs.window.focusedWindow(), grid.getUnit(2, 2, 1, 1))
end)
```

この例では、ウィンドウを画面の四隅に移動させることができます。

## 4. アプリケーション起動・切り替えの高速化：Alfredを超える効率的なランチャー構築

Hammerspoonを使って、アプリケーションの起動や切り替えを高速化することも可能です。Alfredのようなランチャーを、よりカスタマイズされた形で構築できます。

### 具体例：特定のアプリを特定のワークスペースで起動、アプリ切り替えを快適に

以下のコードは、特定のアプリケーションを特定のワークスペースで起動する例です。

```lua
-- アプリケーション起動関数
local function launchApp(appName, workspace)
  local app = hs.application.find(appName)
  if not app then
    hs.application.launch(appName)
    app = hs.application.find(appName)
  end
  if app then
    app:activate(true)
    if workspace then
      hs.spaces.moveToSpace(workspace, app:windows()[1])
    end
  end
end

-- 特定のアプリを特定のワークスペースで起動
hs.hotkey.bind({"ctrl", "alt"}, "t", function()
  launchApp("iTerm2", 1)
end)

hs.hotkey.bind({"ctrl", "alt"}, "e", function()
  launchApp("Visual Studio Code", 2)
end)
```

このコードでは、`Ctrl + Alt + T`でiTerm2をワークスペース1で、`Ctrl + Alt + E`でVisual Studio Codeをワークスペース2で起動します。

### コード例：`hs.application`モジュールを使ったアプリ制御スクリプト

`hs.application`モジュールを使用すると、アプリケーションの起動、アクティブ化、終了など、様々な操作を自動化できます。

```lua
-- アプリケーションを切り替える関数
local function switchApp(appName)
  local app = hs.application.find(appName)
  if app then
    app:activate(true)
  end
end

-- アプリケーションを切り替えるショートカット
hs.hotkey.bind({"ctrl", "alt"}, "a", function()
  switchApp("Safari")
end)

hs.hotkey.bind({"ctrl", "alt"}, "s", function()
  switchApp("Slack")
end)
```

このコードでは、`Ctrl + Alt + A`でSafari、`Ctrl + Alt + S`でSlackに切り替えます。

## 5. テキスト入力の効率化：スニペット、変換、マクロで作業時間を大幅短縮

Hammerspoonは、テキスト入力の効率化にも役立ちます。スニペット機能や、日付、時刻の自動挿入などを実現できます。

### 具体例：よく使うテキストをショートカットで入力、日付や時刻を自動挿入

以下のコードは、よく使うテキストをショートカットで入力するスニペット機能の例です。

```lua
-- スニペットを設定
local snippets = {
  ["em"] = "example@email.com",
  ["sig"] = "--\nYour Name\nYour Title",
}

-- スニペット展開関数
local function expandSnippet(key)
  local snippet = snippets[key]
  if snippet then
    hs.textinput.insert(snippet)
  end
end

-- スニペット展開ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "1", function()
  expandSnippet("em")
end)

hs.hotkey.bind({"ctrl", "alt"}, "2", function()
  expandSnippet("sig")
end)

-- 日付を挿入する関数
local function insertDate()
  local date = os.date("%Y-%m-%d")
  hs.textinput.insert(date)
end

-- 日付挿入ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "d", function()
  insertDate()
end)
```

このコードでは、`Ctrl + Alt + 1`でメールアドレス、`Ctrl + Alt + 2`で署名、`Ctrl + Alt + D`で現在の日付を挿入します。

### コード例：`hs.textinput`モジュールを使ったスニペット機能の実装

`hs.textinput`モジュールを使うと、より複雑なスニペット機能も実装できます。

```lua
-- スニペットを動的に生成する関数
local function dynamicSnippet(prefix)
  local snippet = prefix .. os.date("%Y-%m-%d %H:%M:%S")
  hs.textinput.insert(snippet)
end

-- 動的なスニペット挿入ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "t", function()
  dynamicSnippet("Timestamp: ")
end)
```

このコードでは、`Ctrl + Alt + T`で「Timestamp: 」に続けて現在の日時を挿入します。

## 6. カスタムメニューと通知の活用：作業を中断させない情報収集と操作

Hammerspoonでは、カスタムメニューや通知を実装することも可能です。これにより、作業を中断することなく、必要な情報を収集したり、操作を実行したりできます。

### 具体例：クリップボード履歴、システム情報の表示、外部スクリプトの実行

以下のコードは、クリップボード履歴を表示するメニューを作成する例です。

```lua
-- クリップボード履歴を保持するテーブル
local clipboardHistory = {}

-- クリップボード監視
hs.pasteboard.watcher.new(function(changeType)
  if changeType == "change" then
    local content = hs.pasteboard.getContents()
    if content then
      table.insert(clipboardHistory, 1, content)
      if #clipboardHistory > 10 then
        table.remove(clipboardHistory, 11)
      end
    end
  end
end):start()

-- メニュー作成
local clipboardMenu = hs.menubar.new()

-- メニュー更新関数
local function updateMenu()
  local items = {}
  for i, text in ipairs(clipboardHistory) do
    table.insert(items, hs.menubar.menuItem(text, function()
      hs.pasteboard.setContents(text)
    end))
  end
  clipboardMenu:setMenu(items)
end

-- メニュー表示ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "c", function()
  updateMenu()
  clipboardMenu:show()
end)
```

このコードでは、`Ctrl + Alt + C`でクリップボード履歴を表示するメニューが表示されます。

### コード例：`hs.menubar`モジュールと`hs.notify`モジュールを使ったメニューと通知の実装

`hs.menubar`モジュールと`hs.notify`モジュールを組み合わせることで、様々な情報をメニューに表示したり、通知を送信したりできます。

```lua
-- システム情報を表示するメニュー
local systemMenu = hs.menubar.new()
local function updateSystemMenu()
  local items = {
    hs.menubar.menuItem("CPU: " .. hs.cpu.usage(), nil),
    hs.menubar.menuItem("Memory: " .. hs.memory.usage(), nil),
    hs.menubar.menuItem("Battery: " .. hs.battery.level() * 100 .. "%", nil),
  }
  systemMenu:setMenu(items)
end

-- システム情報メニュー表示ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "i", function()
  updateSystemMenu()
  systemMenu:show()
end)

-- 通知を送信する関数
local function sendNotification(title, message)
  hs.notify.new({title = title, informativeText = message}):send()
end

-- 通知送信ショートカット
hs.hotkey.bind({"ctrl", "alt"}, "n", function()
  sendNotification("Hammerspoon", "Notification test")
end)
```

このコードでは、`Ctrl + Alt + I`でシステム情報を表示するメニュー、`Ctrl + Alt + N`で通知を送信します。

## 7. トラブルシューティングと注意点：Hammerspoonでハマりやすい落とし穴と解決策

Hammerspoonは強力なツールですが、設定ミスやエラーが発生することもあります。以下に、よくあるトラブルシューティングと注意点をまとめました。

*   **設定ファイルの管理:** `init.lua`は非常に重要なファイルです。変更する前にバックアップを取ることを推奨します。
*   **エラーログの確認:** Hammerspoonのコンソールでエラーログを確認し、問題の原因を特定します。
*   **パフォーマンスチューニング:** 過度に複雑なスクリプトはパフォーマンスに影響を与える可能性があります。不要な処理を減らし、効率的なコードを心がけましょう。
*   **競合するショートカット:** 他のアプリケーションやシステムとショートカットが競合しないように注意しましょう。
*   **アクセシビリティ許可:** アクセシビリティ許可が正しく設定されているか確認しましょう。

## 8. まとめ：Hammerspoonを使いこなして、Macでの作業効率を最大化する

この記事では、Hammerspoonの基本的な使い方から、実践的なレシピまでを解説しました。Hammerspoonは、あなたのMac環境をより快適に、そして生産性の高いものにするための強力なツールです。

この記事で紹介したコード例を参考に、ぜひ自分だけのカスタマイズを試してみてください。Hammerspoonを使いこなすことで、Macでの作業効率を最大化し、より快適なデジタルライフを送りましょう。

**参考リンク:**

*   Hammerspoon 公式サイト: [http://www.hammerspoon.org/](http://www.hammerspoon.org/)
*   Hammerspoon API ドキュメント: [http://www.hammerspoon.org/docs/](http://www.hammerspoon.org/docs/)
*   Hammerspoon 設定例: [https://github.com/Hammerspoon/hammerspoon/wiki/Sample-Configurations](https://github.com/Hammerspoon/hammerspoon/wiki/Sample-Configurations)