Hammerspoon実践活用:Macの作業効率を劇的に向上させる自動化レシピ集
この記事では、Macの作業効率を劇的に向上させる強力な自動化ツール「Hammerspoon」の実践的な活用方法を解説します。Hammerspoonは、Luaスクリプトを使ってMacの様々な操作を自動化できるため、日々の作業を大幅に効率化することが可能です。この記事を通して、Hammerspoonの導入から実践的なレシピまでを学び、あなたのMac環境をより快適に、そして生産性の高いものにしましょう。
1. はじめに:Hammerspoonで実現できることと、その強力な理由
Hammerspoonは、Macの操作をLuaスクリプトで制御できる、非常に強力な自動化ツールです。キーボードショートカットのカスタマイズ、ウィンドウ操作、アプリケーションの制御、テキスト入力の効率化など、多岐にわたる操作を自動化できます。
Hammerspoonが強力な理由
- 高いカスタマイズ性: Luaスクリプトによって、ほぼすべての操作を自由にカスタマイズできます。
- 柔軟な拡張性: 豊富なAPIが用意されており、複雑な自動化も実現可能です。
- 無料かつオープンソース: 費用を気にせず、自由に利用・貢献できます。
- キーボード中心の操作: マウス操作を減らし、より効率的な作業環境を構築できます。
この記事では、Hammerspoonの基本的な使い方から、具体的なレシピまでを解説し、あなたの作業効率を最大化するお手伝いをします。
2. 必須設定:Hammerspoon導入と初期設定の最適化
Hammerspoonを利用するには、まずインストールと初期設定が必要です。
- Hammerspoonのダウンロード: 公式サイト(http://www.hammerspoon.org/)から最新版をダウンロードし、インストールします。
-
設定ファイルの作成:
~/.hammerspoon/init.lua
に設定を記述します。このファイルがHammerspoonのメイン設定ファイルとなります。 - アクセシビリティ設定: システム環境設定の「セキュリティとプライバシー」で、Hammerspoonにアクセシビリティを許可します。
初期設定として、以下の設定をinit.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
モジュールを使って、ウィンドウを画面の左半分、右半分、全画面に移動させる例です。
-- グリッド設定
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
モジュールを使ったウィンドウ操作スクリプト
上記の例をさらに拡張し、グリッドのサイズをカスタマイズすることも可能です。
-- グリッドを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のようなランチャーを、よりカスタマイズされた形で構築できます。
具体例:特定のアプリを特定のワークスペースで起動、アプリ切り替えを快適に
以下のコードは、特定のアプリケーションを特定のワークスペースで起動する例です。
-- アプリケーション起動関数
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
モジュールを使用すると、アプリケーションの起動、アクティブ化、終了など、様々な操作を自動化できます。
-- アプリケーションを切り替える関数
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は、テキスト入力の効率化にも役立ちます。スニペット機能や、日付、時刻の自動挿入などを実現できます。
具体例:よく使うテキストをショートカットで入力、日付や時刻を自動挿入
以下のコードは、よく使うテキストをショートカットで入力するスニペット機能の例です。
-- スニペットを設定
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
モジュールを使うと、より複雑なスニペット機能も実装できます。
-- スニペットを動的に生成する関数
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では、カスタムメニューや通知を実装することも可能です。これにより、作業を中断することなく、必要な情報を収集したり、操作を実行したりできます。
具体例:クリップボード履歴、システム情報の表示、外部スクリプトの実行
以下のコードは、クリップボード履歴を表示するメニューを作成する例です。
-- クリップボード履歴を保持するテーブル
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
モジュールを組み合わせることで、様々な情報をメニューに表示したり、通知を送信したりできます。
-- システム情報を表示するメニュー
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/
- Hammerspoon API ドキュメント: http://www.hammerspoon.org/docs/
- Hammerspoon 設定例: https://github.com/Hammerspoon/hammerspoon/wiki/Sample-Configurations