
2026/07/13 5:52
Show HN: 「Zenモード」——マカオス向けグローバル・フォーカスモード
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Ryan Cabeen の「Zen Mode」とは、マク OS アプリを単一のホットキー操作(
Option + Cmd + Z)ですべての macOS アプリを一瞬で distractions ない集中環境に変えるハムースプーンスクリプトであり、Esc キーでトグルできます。個別アプリごとの設定が必要となるツールの違い、アクティブウィンドウを全高に中央揃えにし、ダークな CoreGraphics バックドロップを使用してメニューバー、ドック、壁紙などのシステムクラッターを滑らかにフェードアウトさせることで(ブラurring ではなく)光リークを防ぎます。スクリプトは init.lua 設定ファイル内のカスタマイズ可能な変数(余白、 Corner 半径、アニメーション速度など)を通じて、現在の macOS 機能(例: Tahoe の丸みのある角など)に適応します。現時点ではシングルウィンドウのフォーカスと非リサイズ可能ユーティリティウィンドウでの利用が未対応ですが、開発者やクリエイターが-setup なり疲れなしで瞬時に深い作業モードへの切り替えを可能にします。今後のアップデートではアプリ間のスムーズな遷移や Spaces 間での安全な切り替えに対応予定ですが、現時点ではバックドロップの正しく動作を確保するためにグローバルウィンドウアニメーションは無効化されています。本文
Ryann の禅モード (Zen Mode)
macOS で動作するあらゆるアプリケーションに対し、注意を再獲得するためのグローバルな集中モードを提供します。
常に画面いっぱいに散らばる要素(他ウィンドウ、通知バッジ、メニューバー、ドック、壁紙など)が注意力を引きます。「禅モード」はこれらを沈静化させる単一のホットキーです。
- 動作原理: 作業中のウィンドウのみを画面中央へ滑り寄せ、全面の高さまで伸ばします(幅は維持されます)。
- UI の隠蔽: メニューバーやドックを除く全ての背景要素が黒くフェードアウトします。
- 終了方法: ホットキーを再度押す、または
キーを押すと元通りの位置と状態に戻ります。Esc - モードの性質: フルスクリーンではなく、ウィンドウの自然な幅を維持するため、「スポットライト」のような感覚です。
対応アプリ・仕組み
- プラットフォーム: Hammerspoon スクリプト(独立したアプリではありません)。
- 適用範囲: ターミナル、ブラウザ、PDF リーダーなど、「ウィンドウを持つあらゆる Mac アプリ」。
- 実装: アプリ固有の設定ではなく、グローバルモードとして動作します。
既存技術との比較
| 技術・ツール | 特徴 | 本スクリプトとの違い |
|---|---|---|
| 注意散漫防止ダимер (Distractor dimmers) | 背景を自動暗くするが、ウィンドウの移動やリサイズを行わない。壁紙などにも影響しない。 | ウィンドウ自体を画面中央に移動・拡大させます。 |
| 他のウィンドウを不透明オーバーレイで覆う「孤立モード」。 | ウィンドウの再配置やメニューバー/ドックの隠蔽を含みます。 |
| アプリ固有の禅モード (VS Code 等) | 特定のアプリ内でのみ利用可能。 | アプリに依存せず、あらゆるウィンドウで動作します。 |
| macOS 標準フルスクリーン | メニューバー・ドックは隠れるが、ウィンドウを端まで伸ばさない。 | ウィンドウの幅を維持しつつ中央揃えにし、全面に拡大できます。 |
本スクリプトの利点は、これらの要素を単一の意図的な操作で統合し、依存関係のない Lua コード(約 250 行)であることです。
機能点
- あらゆるアプリ対応: アプリ固有の設定不要。同じホットキーでターミナル、ブラウザ、ノートアプリなどに対応します。
- 単一キー操作:
で入出力が切り替えられます。Option + Cmd + Z - 中央揃え・全面の高さ: 幅を維持したまま、画面高さに伸びて水平中央に配置されます。
- 積極的な UI 隠蔽: macOS カーソルウィンドウレベルで描画され、メニューバーとドックを完全に覆います。
- 完全な視覚的シール: カットアウト(透明部分)はわずかに内側にずらし丸みをつけることで、背景のピクセル漏れを防ぎます。
- 滑らかな遷移エフェクト: 「2 フェーズイージングインアウト」を使用。
- ウィンドウが中央へ滑り寄る間に背景を黒くフェードアウト。
- 暗闇の中でウィンドウ高さを全面に拡大。
- カスタマイズ:
(移動時間)とmoveDuration
(拡大時間)で調整可能です。resizeDuration
- リアルタイム追従: ウィンドウをドラッグ・リサイズすると、カットアウトもそれに追従します。
- 安全な Esc キーフック: 禅モード有効時のみインターセプトされ、退出直後に macOS に返却するため、Vim などに干渉しません。
- 状態の復元: 退出時には正確な位置とサイズを記憶し、元に戻します。
インストール手順
-
Hammerspoon のインストール
brew install --cask hammerspoon -
アクセシビリティ権限の付与
>システム設定
>プライバシーとセキュリティ
から Hammerspoon を追加してください。アクセシビリティ
-
スクリプトの登録 リポジトリの
ファイルの内容をinit.lua
に追加します。~/.hammerspoon/init.luamkdir -p ~/.hammerspoon curl -fsSL https://raw.githubusercontent.com/cabeen/zen-mode/main/init.lua >> ~/.hammerspoon/init.lua -
設定の読み込み メニューバーの Hammerspoon アイコンをクリックし、「Reload Config」を選択します。
使用方法
| 動作 | キー操作 |
|---|---|
| 禅モードの切り替え (入力・退出) | |
| 禅モードから退出 (代替) | |
独自化 (init.lua
の設定変数)
init.lua以下のテーブル内で値を変更して、好みの状態に調整可能です。
| 変数名 | デフォルト値 | 効果 |
|---|---|---|
| 40 | メニューバーやカメラノッチから上の余白。 |
| 40 | 下の余白。 |
| 24 | カットアウトの角丸処理。 ※ウィンドウ自身の角丸半径以上にする必要があります。小さすぎると光漏れし、大きすぎるとウィンドウ隅が薄暗くなります。macOS 26「Tahoe」ではより大きな値が必要になります。 |
| -2 | カットアウトとウィindow 間のエッジシール。 ※負値(-2)はウィンドウをわずかに重ねて光漏れを防ぎます。正値にするとネイティブのドロップシャドウが表示されます。 |
| | バックドロップの色。 ※アルファ値 (0.0–1.0) を上げて薄暗くするか、下げれば真っ黒になります。 |
| 0.3 | 中央への滑り移動にかかる秒数(即時スナップには 0)。 |
| 0.3 | 全面の高さまでの拡大・縮小にかかる秒数(即時スナップには 0)。 |
ホットキーの変更: 別のホットキーを使用したい場合は、以下のカッコ内を編集してください。
hs.hotkey.bind({"alt", "cmd"}, "z", ...)
備考と制限事項
- アクセシビリティ権限について: 許可がない場合や無効化された場合(macOS が誤って有効として報告する場合など)は、アラートが表示されるか設定ウィンドウが開いてしまいます。解決策: アクセシビリティリストから Hammerspoon を削除(–ボタン)し、再度追加してください。
- OS 互換性: macOS 26「Tahoe」でテスト済みです。古いバージョンでも動作する可能性がありますが、
のデフォルト値は Tahoe 用に調整されているため、古い macOS では約cornerRadius
に変更することをお勧めします。10 - リサイズ不能なウィンドウ: 一部のユーティリティや設定ウィンドウではサイズが維持されますが、中央に配置されます。カットアウトは実際の動作に適応します。
- ネイティブフルスクリーン: 反応しません。まず退出する必要があります。禅モード中にスペースを変換することは未検証です。
- グローバルアニメーション:
が設定されるため、スクリプト以外のウィンドウアニメーションも無効になります(禅モード自体は独自のアニメーションを実行)。hs.window.animationDuration = 0 - Esc キーの扱い: 禅モード有効中は Esc がキャプチャされます。Vim などで Esc に依存する場合、ホットキーを使用するか、Esc フックを再マッピングしてください。
- マルチモニター: オーバーレイはフォーカスされたウィンドウが表示されている画面のみをカバーします。
- 単一ウィンドウ限定: 一度に 1 つのウィンドウのみを対象とします。禅モード中に別のキーを押すと退出し、再度押して新しいウィンドウを設定します。
デザインノート(技術的詳細)
本スクリプトは以下の UX デティールを重視しています:
- 滑らかなアニメーション: 標準のアニメーションは無効化され、独自の 60 Hz アニメーションクロックを実行します。ウィンドウ枠とバックドロップのアルファ値を単一のタイムラインから同時にイージングさせます。
- 移動してからリサイズ: ウィンドウ移動は低コストですが、リサイズは再レイアウトを強制するため、2 フェーズに振付されています(移動後 → 黒くフェードアウト → リサイズ)。
- ウィンドウエッジの処理: カットアウトをウィンドウより進めると背景が漏れる可能性があるため、各フレーム変更後に実際のフレームを読み込み、カットアウトを適合させます。また、
で暗闇と重複させ、隙間を作らないようにしています。padding = -2 - ウィンドウ隅の処理: カットアウトの角丸半径は、ウィンドウ自身の角丸半径より大きく設定されています(対角線の明かり漏れ防止)。macOS 26「Tahoe」ではデフォルト値 (24) で十分です。
- メニューバーとドックの隠蔽: キャンバスがカーソルウィンドウレベルに昇格するため、システム UI を覆うことで真正面から画面を黒く塗ることができます。
- バックドロップの暗さ: ホログラフィック効果は不可能(プライベート API)であり、ボkeh は非推奨です。代わりに半透明な暗い充填を使用し、コスト無料でライブ動作を実現しています。
今後の予定 (TODO)
- 優雅な Cmd+Tab アプリ切り替え
- 現状: アプレチェンジ時にオーバーレイが元のウィンドウの周りに残る。
- 理想: アプリ切替をインターセプトし、新しいフォーカス窓へ処理を渡し、古い窓を元位置にアニメーション化して戻す。バックドロップも維持したい。
- 現状の判断: スクリプトのサイズと可読性を優先するため、この範囲外としています。
著者・ライセンス
- 著者: Ryan Cabeen
- ライセンス: MIT