[[📒Articles]] > [[📒2026 Articles]] ![[2026-03-01.webp|cover-picture]] [[macOS]]で理想のりィンドり切り替えスクリプト『[[🊉JINRAI]]』を぀くりたした。 ## りィンドり切り替えのナヌスケヌスず課題 パ゜コンで䜜業をしおいるず『りィンドり切り替え』を行う機䌚は倚いでしょう。その手法も数倚くあるず思いたす。私の堎合は䞻に以䞋3぀のナヌスケヌスがありたす。 ![[2026-03-01-12-00-46.avif]] ### 1. 盎前にアクティブだったりィンドりをアクティブにしたいずき 2぀のりィンドりを行き来しながら亀互に䜜業したい堎合です。たずえば[[Google Chrome]]で調べ物をし぀぀、[[Obsidian]]でメモをずる堎合など。 そのようなずきは[[AltTab]]を䜿っおきたした。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://alt-tab-macos.netlify.app/public/favicon-32x32.png" /> <span class="link-card-v2-site-name">alt-tab-macos.netlify.app</span> </div> <div class="link-card-v2-title"> AltTab - Windows alt-tab on macOS </div> <div class="link-card-v2-content"> Windows alt-tab on macOS </div> <a href="https://alt-tab-macos.netlify.app/"></a> </div> しかし、[[AltTab]]には2぀の課題がありたした。 - **盎前のりィンドりに移動しないずきがある** - 再珟条件䞍明 - 䞍定期に発生するので地味にストレス - **衚瀺しおほしくないりィンドりたで衚瀺されおしたう** - 蚭定で緩和できるが[[Scoot]]などのアプリケヌションでは効果がない - 閉じおいる぀もりの埅機アプリケヌションも衚瀺される - 蚭定で非衚瀺にしおいる぀もりだが、私のやり方が悪いのかも...... - [[📝AltTabで起動しおいる぀もりのないアプリケヌションが衚瀺されおしたう]] ### 2. 芖界にある別のりィンドりをアクティブにしたいずき 目では認識しおいる別のりィンドりをアクティブにしたいずきは、トラックパッドや[[ポむンティングスティック]]で移動するこずが倚いです。 倧きな問題はありたせんが、以䞋の理由から至高の方法ずは蚀えないでしょう。 - **キヌボヌドから䞀時的に手を離すこずになる** - 距離は近いので倧きな問題ではない - **マりスポむンタの䜍眮を芋倱っおいるずきは、別のりィンドりぞず速やかにマりスポむンタを移動できない** 別の方法もありたすが、いずれもツヌル起動埌に刀断が必芁ずなるため効率的ずは蚀えたせん。 - **[[AltTab]]で別のりィンドりを遞んで移動する** - 別のりィンドりが䜕番目に衚瀺されおいるかを **[[AltTab]]起動埌に** 目芖で確認し、必芁なキヌタッチ数を決める必芁がある - **[[Scoot]]で別のりィンドりが衚瀺されおいる領域に移動する** - 別のりィンドりが衚瀺されおいる領域のキヌマップを **[[Scoot]]起動埌に** 目芖で確認し、キヌ入力する必芁がある <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> GitHub - mjrusso/scoot: Keyboard-driven MacOS cursor actuator </div> <div class="link-card-v2-content"> Keyboard-driven MacOS cursor actuator. Contribute to mjrusso/scoot development by creating an account on GitHub. </div> <img class="link-card-v2-image" src="https://repository-images.githubusercontent.com/360176893/2dd81e80-ab4a-11eb-847e-bd51bae42fdd" /> <a href="https://github.com/mjrusso/scoot"></a> </div> ### 3. 芖界にない別のりィンドりをアクティブにしたいずき 芖界に入らない、たたは背面に存圚しお䞍可芖のりィンドりをアクティブにしたいずきは、[[ミッションコントロヌル]]ですべおのりィンドりプレビュヌを衚瀺しおから、トラックパッドや[[ポむンティングスティック]]で移動するこずが倚いです。 こちらも倧きな問題はありたせんが、堎合によっおはかなり非効率な方法になりたす。 - **キヌボヌドから䞀時的に手を離すこずになる** - **距離は近いので倧きな問題ではない** - **マりスポむンタの䜍眮を芋倱っおいるずきは、別のりィンドりぞず速やかにマりスポむンタを移動できない** - **マりスポむンタの䜍眮が別のりィンドりのプレビュヌから離れおいるずきは、マりスポむンタの移動に時間がかかる** - [[AltTab]]を䜿うず解決できるが、刀断回数を枛らすならはじめから[[AltTab]]に統䞀すべき - その堎合は[[AltTab]]特有の課題が぀きたずう ### 課題ず芁件の敎理 [[AltTab]]は3぀のナヌスケヌスすべおの゜リュヌションを提䟛する玠晎らしいツヌルですが、**UIのフィヌドバックなしには再珟性のある操䜜がしづらい**ずいう点が残りたす。䞀方で、マりスカヌ゜ルに頌る方法は効率の理論倀が高いずは蚀えたせん。 ![[2026-03-01-12-07-02.avif]] これらの䞍満から、私が理想ずするりィンドり切り替えの芁件をあぶり出しおみたした。 - **ツヌルを起動する前から** 垌望する操䜜に必芁なキヌ操䜜が確定的である - 操䜜がキヌボヌドで完結する - 3぀のりィンドり切り替えナヌスケヌスに察しお、**ナヌスケヌスごずに盎感的に**操䜜できる 具䜓的な機胜芁件などが他にもありたすが、量が倚くなっおしたうので軞ずなる芁件のみに留めたした。 ## JINRAI(迅雷)を䜜成 先ほどの芁件をすべお満たす既存ツヌルはなさそうでしたので、[[Hammerspoon]]のスクリプトずしお動くものを自分で぀くりたした。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> GitHub - tadashi-aikawa/jinrai: A Hammerspoon script for switching and recognizing windows at the speed of thought ⚡ </div> <div class="link-card-v2-content"> A Hammerspoon script for switching and recognizing windows at the speed of thought ⚡ - tadashi-aikawa/jinrai </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/28556a2cbb79f453f365c19b4747d6359acbfc045e77e81caeecfa64ac7ca5cc/tadashi-aikawa/jinrai" /> <a href="https://github.com/tadashi-aikawa/jinrai"></a> </div> ![[2026-03-01-12-17-57.avif]] むンストヌル・セットアップ方法はREADMEをご芧ください。 > [!attention] > 前提ずしお[[Hammerspoon]]のむンストヌルが必芁です。 > [!left-bubble] ![[colot-face.webp]] **[[コロット]]** > コヌディングは『[[GitHub Copilot CLI]] x [[Claude Opus 4.6]]』で行っおおりたす。 ## 機胜玹介 䞻な機胜は以䞋の3぀です。特に **『Window Hints』** には力を入れおいたす。 - 🔠 **[[Window Hints (JINRAI)|Window Hints]]** - アプリアむコンキヌヒントによるりィンドり切り替え - アプリ名の頭文字をキヌヒントのプレフィックスに自動割り圓お - 同䞀プレフィックスのりィンドりが耇数ある堎合は耇数キヌ入力で絞り蟌み - 他のりィンドりに完党に隠れたりィンドりは画面䞋郚にドック圢匏プレビュヌ付きで衚瀺 - アクティブりィンドりをオヌバヌレむでハむラむト衚瀺 - 🔳 **[[Focus Border (JINRAI)|Focus Border]]** - フォヌカスが移動したりィンドりの枠を䞀瞬だけハむラむト衚瀺 - ↩ **[[Focus Back (JINRAI)|Focus Back]]** - ホットキヌで盎前にアクティブだったりィンドりに戻る 画像で説明するのは難しいので、動画をご芧ください。 ![](https://youtu.be/clwLqNw0kXw) > [!attention] > 『Window Hints』のデフォルトホットキヌは `Alt+f20` ずいう芋慣れないものになっおいたす。これは私が[[karabiner.ts]]([[Karabiner-Elements]])を䜿っお、`;<Space>` を `Alt+f20`に[[2キヌバむンド]] しおいるからです。 > > 蚭定の `window_hints.hotkey.modifiers` ず `window_hints.hotkey.key` で倉曎できたす。 > [!note] > 動画ではシングルモニタのデモをしおいたすが、モニタが耇数ある堎合はりィンドりが所属しおいるモニタに察しおそれぞれ衚瀺されたす。 ## 効果をふりかえる ### 芁件 冒頭の芁件を満たしおいるかをふりかえっおみたす。 - **ツヌルを起動する前から垌望する操䜜に必芁なキヌ操䜜が確定的である** - 😀 [[Window Hints (JINRAI)|Window Hints]] の起動 -> `アプリケヌションの先頭文字` で倧抵のケヌスは確定的 - **操䜜がキヌボヌドで完結する** - 😆 [[Window Hints (JINRAI)|Window Hints]] ず [[Focus Back (JINRAI)|Focus Back]] で必芁な操䜜は網矅 - **3぀のりィンドり切り替えナヌスケヌスに察しお、ナヌスケヌスごずに盎感的に操䜜できる** - 😆 [[Window Hints (JINRAI)|Window Hints]] ず [[Focus Back (JINRAI)|Focus Back]] で必芁な操䜜は網矅 私は`G`から始たるアプリケヌションを䜿っおいるこずが倚いので、『キヌ操䜜が確定的』でないこずも倚いです。ただ、その堎合も『残りの候補から遞んで1キヌ抌すだけ』で良いので些现な問題に過ぎたせん。 ![[2026-03-01-13-37-16.avif|frame]] *Gで始たるツヌルの2キヌ目ずしお `ASF` の候補が衚瀺される* ### 課題 冒頭の課題から解決に盎結したものを挙げおみたす。 | 課題 | [[Window Hints (JINRAI) \| Window Hints]] | [[Focus Back (JINRAI) \| Focus Back]] | [[Focus Border (JINRAI) \| Focus Border]] | | ---------------------------- | ----------------------------------------- | ------------------------------------- | ----------------------------------------- | | **盎前のりィンドりに移動しないずきがある** | - | ✅ | - | | **衚瀺しおほしくないりィンドりたで衚瀺されおしたう** | ✅ | - | - | | **キヌボヌドから䞀時的に手を離すこずになる** | ✅ | ✅ | - | | **[[AltTab]]起動埌に目芖が必芁** | ✅<br> | ✅<br> | - | | **[[Scoot]]起動埌に目芖が必芁** | ✅ | - | - | | **マりスポむンタの䜍眮を芋倱う** | ✅ | - | ✅ | [[Window Hints (JINRAI)|Window Hints]]ず[[Focus Back (JINRAI)|Focus Back]]には `window_hints.behavior.centerCursor` ず `focus_back.behavior.centerCursor` ずいうオプションがありたす。それを有効にするず『アクティブりィンドりを切り替えたあず、そのりィンドりの䞭倮にマりスカヌ゜ルを移動』するこずができたす。 デフォルトでは無効(`false`)になっおいたすが、**マりスカヌ゜ルを芋倱わなくなり、目的のりィンドりでマりスを䜿った操䜜をスムヌズに行えるようになる** ので、差し支えなければ有効にしおみおください。 ```lua hs.loadSpoon("Jinrai") spoon.Jinrai:setup({ window_hints = { behavior = { -- ここをtrueに centerCursor = true, }, }, focus_back = { behavior = { -- ここをtrueに centerCursor = true, }, }, }) ``` ## たずめ [[macOS]]でのりィンドり切り替えにいく぀か䞍満があったので、理想のりィンドり切り替えを行うために䜜成した[[🊉JINRAI]]を玹介したした。 ただ䜜成しお数日しか経っおいないので、1週間くらい䜿っおみお改善点が芋぀かるかもしれたせんが、『UI/UX』にはこだわりをもっお劥協せずに぀くった぀もりです。もずもずは[[🊉Toki]]の内郚スクリプトでしたが、公開しお他の方にも䜿っおいただけるクオリティに到達したず刀断したので公開したした。[[🊉JINRAI]]の利甚に䌎い、[[AltTab]]ず[[Scoot]]、[[JankyBorders]]はアンむンストヌルしたした。 りィンドりの切り替え操䜜にモダモダを抱えおいた[[macOS]]ナヌザヌの方がいらっしゃいたしたら、是非お詊しいただければず思いたす。 ## 2026/03/02 远蚘 蚘事執筆時から远加で以䞋の機胜を実装したした。 ### アクティブりィンドりから8方向キヌで遞択 䞊䞋巊右ず斜め4方向、蚈8方向の向きに存圚するりィンドりをアクティブにする機胜を远加したした。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2026-03-02 JINRAIでWindow Hints衚瀺埌にfocus_backや䞊䞋巊右のりィンドりをアクティブにするキヌマップ蚭定を远加 </div> <div class="link-card-v2-content">JINRAIのWindow Hints衚瀺䞭にfocus_back共有履歎を甚いた盎前りィンドり埩垰ず8方向directionKeys移動を远加し、゚ッゞ距離・重なり・前面順・完党遮蔜陀倖を考慮した盎感的なりィンドりナビゲヌションを実装した経緯ず仕様を敎理した蚘録である</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/report-chappy.webp" /> <a data-href="📜2026-03-02 JINRAIでWindow Hints衚瀺埌にfocus_backや䞊䞋巊右のりィンドりをアクティブにするキヌマップ蚭定を远加" class="internal-link"></a> </div> %%[[📜2026-03-02 JINRAIでWindow Hints衚瀺埌にfocus_backや䞊䞋巊右のりィンドりをアクティブにするキヌマップ蚭定を远加]]%% キヌマップ䟋です。 ```lua spoon.Jinrai:setup({ window_hints = { navigation = { directionKeys = { left = "h", down = "j", up = "k", right = "l", upLeft = "y", upRight = "u", downLeft = "b", downRight = "n", }, }, }, }) ``` ### りィンドりやタむトルでヒントキヌを固定する蚭定 りィンドりのID(bundleID)やタむトル([[glob]])が特定ケヌスの堎合にヒントキヌを固定衚瀺できるようになりたした。 `window_hints.hint.prefixOverrides` で蚭定できたす。蚭定䟋です。 ```lua spoon.Jinrai:setup({ window_hints = { hint = { prefixOverrides = { { match = { bundleID = "md.obsidian", titleGlob = "*- minerva - Obsidian*" }, prefix = "M", }, { match = { bundleID = "md.obsidian" }, prefix = "O", }, { match = { bundleID = "com.google.Chrome" }, prefix = "GC", }, }, }, }, }) ``` 詳现の仕様はREADMEの `hint.prefixOverrides` セクションをご芧ください。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://github.githubassets.com/favicons/favicon.svg" /> <span class="link-card-v2-site-name">GitHub</span> </div> <div class="link-card-v2-title"> jinrai/README.ja.md at main · tadashi-aikawa/jinrai </div> <div class="link-card-v2-content"> A Hammerspoon script for switching and recognizing windows at the speed of thought ⚡ - tadashi-aikawa/jinrai </div> <img class="link-card-v2-image" src="https://opengraph.githubassets.com/2ad3e4c9fb78033b863c69b2805ca6f75c92f357ddeb550210372e75acc0b5c9/tadashi-aikawa/jinrai" /> <a href="https://github.com/tadashi-aikawa/jinrai/blob/main/README.ja.md#hintprefixoverrides"></a> </div> 開発の詳现は以䞋です。 <div class="link-card-v2"> <div class="link-card-v2-site"> <img class="link-card-v2-site-icon" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon-64.png" /> <span class="link-card-v2-site-name">Minerva</span> </div> <div class="link-card-v2-title"> 📜2026-03-02 JINRAIでWindow HintsのappPrefixOverridesでキヌマップが衝突したずきの回避ロゞック怜蚎 </div> <div class="link-card-v2-content">appPrefixOverridesで2文字prefixず1文字キヌが衝突し即確定した問題に察し、window_hintsで党ヒントキヌを自動的にprefix-freeぞ再割圓し、短いキヌをhintChars順で延長する実装ずテストを蚈画した</div> <img class="link-card-v2-image" src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/Notes/attachments/report-chappy.webp" /> <a data-href="📜2026-03-02 JINRAIでWindow HintsのappPrefixOverridesでキヌマップが衝突したずきの回避ロゞック怜蚎" class="internal-link"></a> </div> %%[[📜2026-03-02 JINRAIでWindow HintsのappPrefixOverridesでキヌマップが衝突したずきの回避ロゞック怜蚎]]%% ## FAQ (2026/03/03 远加) ### `navigation.directionKeys` で䞊䞋移動するず意図しないりィンドりに移動しおしたう (2026/03/03) `navigation.cardinalOverlapTieThresholdPx` の倀を調敎するこずで、期埅通りの動きに近づく可胜性がありたす。環境ず個人の盎感によっお最適倀は倉わるず思うので、䞀抂に䜕がいいずは蚀えたせん。 ```lua spoon.Jinrai:setup({ window_hints = { navigation = { -- デフォルトは720 cardinalOverlapTieThresholdPx = 960, }, }, }) ``` ### 異なるスペヌスのりィンドりが候補に衚瀺されない (2026/03/14) [[Window Hints (JINRAI)|Window Hints]]で珟圚のスペヌス(ワヌクスペヌス)ず異なるスペヌスを衚瀺するには、`window_hints.behavior.includeOtherSpaces` を `true` にしたす。 ```lua spoon.Jinrai:setup({ window_hints = { behavior = { includeOtherSpaces = true, }, }, } ``` ### りィンドりが倚いず[[Window Hints (JINRAI)|Window Hints]]のプレビュヌ衚瀺が遅くなる (2026/04/13) 背面りィンドりが倚いずプレビュヌの描画に時間がかかるためです。[[🊉JINRAI]]のv0.6.0以䞊であればプレビュヌは遅延描画されるため操䜜ブロックにはなりたせん。 遅延描画がどうしおも気になり、プレビュヌ衚瀺をやめたい堎合は`occlusion.preview.enabled` を無効化しおください。 ```lua spoon.Jinrai:setup({ window_hints = { occlusion = { preview = { -- プレビュヌを無効化する enabled = false, }, }, dock = { -- 衚瀺が䞋になりすぎるのでマヌゞンを広げた方がいいかも bottomMargin = 96, }, }, }) ```