スパイダープラス Tech Blog

建設SaaS「スパイダープラス」のエンジニアとデザイナーのブログ

WindowsからMacに移行するとき、本当に必要だったのは「自分の軸」の言語化だった

はじめに

こんにちは、インフラ移行チームの宮囿です。

諸事情によりWindowsからMacに移行することになりました。
移行直後、「Windowsにはあったアレがない」「このショートカットが効かない」と不満を漏らしていたら、
ターミナル環境を100倍楽しくする本田さんに一言、「Macの流儀に慣れろ」と言われました。

それもそうだな、と思い、しばらくMacの流儀に沿って使ってみることにしました。

「これだけあれば仕事になりそう」と感じた4つの軸

Macをしばらく使ってみて、「これが揃っていればPC操作のストレスは一旦なくなるな」と思えた軸が4つ浮かんできました。

  1. sshが利用できること
  2. Chromeが使えること
  3. ホームポジションを守ること
  4. キーボードでウィンドウ操作ができること

sshはMac標準のターミナルやiTerm2で全く問題なし。Chromeもそのまま使える。
この2つは元から「sshとブラウザさえあればだいたいどうにかなる」という確信があったので、迷いはありませんでした。

ここでは、「ホームポジションを守ること」「キーボードでウィンドウ操作ができること」でこだわったことを説明します。

ホームポジションを守ること

Windows時代はAutoHotkey(AHK)で40%キーボード相当のレイヤーを組み、指はホームポジションから上下左右1キーしか動かないようにしていました。変換キーを押しながらQWERTY行で数字、ASDF行でカーソル操作、といった具合です。AHKはWindows専用なのでMacでは使えませんが、Macでのキーリマップの定番であるKarabiner-Elementsには以前から目をつけていました。

※ 40%キーボード:数字行やファンクションキーを持たず、アルファベットと最低限の修飾キーのみで構成された超コンパクトなキーボード。レイヤー切り替えで全キーをカバーする。

参考画像
Epomaker TH40 + Kailh Deep Sea Silent Pro Box Switch + MDA Future Suzuri (会社用)
GoForty v2 Ortho + Proケース + Lofree Specter + Lofree Flowのキャップ (家用)

ただ、Karabiner-Elementsの設定はJSONで書く必要があり、レイヤーを実現しようとすると可読性が壊滅します。
そこで
karabiner.tsの出番です。
これは、TypeScriptでKarabiner-Elementsの設定を記述できるライブラリで、JSONの地獄から解放してくれます。
これも移行前から知っていたので、ツール選定で迷うことはありませんでした。

もう一つ、Macで個人的にどうしても受け入れられなかったのがCommandキーの物理的な位置です。
WindowsのCtrl+CCtrl+Vは(Capslockの入れ替えをしていれば)小指で自然に届きますが、MacのCmd+C/Cmd+Vは親指を折り込む動きになります。
これが私には耐えられませんでした。そこで、
スペースキーの長押しをCommandキーにする設定をkarabiner.tsで入れました。SandS(Space and Shift)のCommand版です。単押しすればスペース、長押しすればCommand。Cmd+CCmd+Vも親指一つでホームポジションから届くようになりました。

// Space and COMMAND (ComanS)
	k.rule("Space and COMMAND (CommanS)").manipulators([
		// SPACE HOLD AFTER TAPPING → SPACE REPEAT
		k.map({ key_code: "spacebar", modifiers: { optional: ["caps_lock", "shift"] } })
		.condition(k.ifVar("SPACE REPEAT", 1))
		.to({ key_code: "spacebar" })
		.toAfterKeyUp([{ set_variable: { name: "SPACE REPEAT", value: 0 } }])
		.description(" SPACE HOLD AFTER TAPPING → SPACE REPEAT "),

		// SPACE HOLD → RIGHT COMMAND
		k.map({ key_code: "spacebar", modifiers: { optional: ["any"] } })
		.condition(k.ifVar("SPACE REPEAT", 0))
		.to({ key_code: "right_command" })
		.toIfAlone([
			{ set_variable: { name: "SPACE REPEAT", value: 1 } },
			{ key_code: "spacebar" }
		])
		.toDelayedAction(
			// 第一引数: to_if_invoked (アクションが発動したとき)
			[{ set_variable: { name: "SPACE REPEAT", value: 0 } }],
			// 第二引数: to_if_canceled (アクションがキャンセルされたとき)
			[{ set_variable: { name: "SPACE REPEAT", value: 0 } }]
		)
		.parameters({
			"basic.to_delayed_action_delay_milliseconds": 200,
			"basic.to_if_alone_timeout_milliseconds": 200
		})
		.description(" SPACE HOLD → RIGHT COMMAND "),

		// --- 追加部分: SPACE(Right Cmd) + Q 長押し設定 ---
		// cmd+Qをおしても2000ms以上押し続けないと反応しないようにする
		k.map({ key_code: "q", modifiers: { mandatory: ["right_command"], optional: ["any"] } })
			.toIfAlone({ key_code: "vk_none" }) // タップ(短押し)時は何もしない(誤爆防止)
			.toIfHeldDown({ key_code: "q", modifiers: ["right_command"] }) // 長押し時のみ Cmd+Q 発動
			.parameters({
				"basic.to_if_held_down_threshold_milliseconds": 2000 // 長押しの判定時間 (500ms)
			})
        .description("Space(Cmd) + Q Long Press -> Quit"),
		// ---------------------------------------------
	]),

AIに生成いただいたコード。コメントマシマシ。

また、WindowsでもSpaceを長押しでCtrlキーに変えることでWindowsとMacでほぼ同じ操作感を得られるようになりました。

キーボードでウィンドウ操作ができること

WindowsではFancyZones※ を利用してキーボードでウィンドウを上下左右に移動したりサイズ変更をして、Alt+Tabでフォーカス切り替えをしていました。

Mac側ではウィンドウマネージャーをいくつか試しました。Mac標準のウィンドウ管理、MagnetAmethystRectangle……。フォーカス切り替えはAltTabというそのままの名前のアプリで解決しましたが、ウィンドウ配置については結局、FancyZonesのようにキーボードショートカットでウィンドウを任意の位置にサッと配置する操作感に引き戻されました。最終的にRectangleに落ち着き、karabiner.tsと連携させることでFancyZonesと同じ操作体系をMacに持ち込みました。

色々試した上で元の操作感に戻ったということは、自分の中に「ウィンドウ操作はこうあるべき」という軸が既にあったんだと思います。

FancyZones:Microsoft PowerToysに同梱されているウィンドウマネージャー。ショートカットキーでウィンドウを画面の左半分・右上・全画面等に素早く配置できる。

実装はAIに任せた

karabiner.tsの実装(AHKのスクリプトをkarabiner.ts向けに変換する作業や、ウィンドウ操作の状態遷移ロジックの記述)は、AIに任せました。

これができたのは、自分が何を求めているかが言語化できていたからです。「変換キーを押している間、QWERTY行を数字にしたい」「HJKLでウィンドウの位置を状態遷移的に切り替えたい」。要件が明確なら、実装はAIに渡せます。AHK時代のスクリプトという既存の「仕様書」があったのも大きかった。

おわりに

結局、Macの流儀には慣れませんでした。Windowsっぽいのが好きでした。

でもそれが分かったこと自体に価値があったと思います。「自分はどう操作したいのか」という軸を言語化できたことで、OSが変わっても環境を再構築できたし、AIに実装を任せることもできました。結果的にMac上の設定はWindows時代と似た構成になり、Mac側で新しく組んだ設定もWindowsにAHKスクリプトとして逆輸入できる状態になっています。

環境移行時に大切なのは「自分にとって何が不可欠か」を抽象化して特定することだと思います。それさえ分かっていれば、実装手段をAIにある程度お任せできる時代になったと実感しました。

ところで、スパイダープラスでは仲間を募集中です。移行経験のある方もない方も、スパイダープラスに興味が出てきたなという方はお気軽にお声がけください。

最後までご覧くださり、ありがとうございます。