Windowsのキー操作をMacライクにする

※ このポエムはUSキーボードを前提に書かれています。
※ 2019.10.25 Windowsでよく出てくる「F2で編集」を「Ctrl+Alt+Enter」に割り当てました。

# Windowsの気持ち悪いショートカット
Windowsというか、DOSシェルでもそうだったが、Windowsにはショートカットと言うには遠回りすぎるキーボードオペレーションがある。
Macだと身体が覚えてしまって快適になるはずのショートカットが、Windowsだとものすごい作業感溢れる操作になってしまう。
そこで、[AutoHotKey](https://autohotkey.com/)を使ってMac風に似せようと頑張ってみた。
このポエムは似せる努力について書くので、AutoHotKeyの使い方などは他をググってくだちい。

# と、その前に。
私が普段使っているUSキーボードなんですが、Windowsだと配置が気に入らない。
なので、[KeySwap](https://www.vector.co.jp/soft/winnt/util/se228667.html)というWindowsXPの頃に作られたツールでキーボードのリマップを行っています（一応Windows7までは動作確認してあるっぽい）。
このツールで、スペースバーの両サイドにあるAltキーをCtrlキーに、左Altキーの左にあるWinキーを左Altキーに、右Ctrlキーを右Winキーにしています。
そして、言語の切り替えを「Ctrl+スペース」に定義しています。こうすると、Macでの「cmd＋スペース」と同じオペレーションで言語の切り替えが出来るようになります（これはWindowsの言語設定にあるキーボードショートカットの設定で変更します）。
そういう前提でAutoHotKeyでショートカット定義しています。

# OSの操作
まずは、普通にWindowsを使っていてイラっとするところから。
アプリケーションの切り替えが「Alt＋Tab」なので、Macの「cmd＋Tab」と隣同士で紛らわしい。
というわけで、「Ctrl＋Tab」に設定してみる。

```
Ctrl & Tab::AltTab
Ctrl & SC029::ShiftAltTab
```
これで「Ctrl＋Tab」でアプリケーション切り替えメニューが出ます。「Ctrl＋バッククォート」でアプリ選択が戻ります。

次に、ウィンドウを閉じるオペレーションにアサインしてみます。
Windowsはアプリケーションの全てのウィンドウが閉じると同時にアプリケーションも終了するので、ウィンドウを閉じることと、アプリケーションの終了に明確な違いが無い場合が多いのですが、とりあえず「cmd＋w」に相当する「Ctrl＋w」に「Alt＋F4」を割り当てます。

```
Ctrl & w::WinClose,A
```
「Alt＋F4」と言っておきながら「WinClose」とか割り当ててますが、これはAutoHotKeyのコマンドらしいです。
最後の「,A」はアクティブウィンドウに対してコマンドを送るってことらしいです。

その次に、私が常用している「ウィンドウの最小化」です。これをキーボードショートカットで多用しています。
なので、アサインします。

```
^h::PostMessage, 274, 61472, 0, , A
```
最後の「A」の前の「, ,」は間違いではないです。
PostMessageはなんかWindowsのメッセージらしいです（よく知らない）。
最初は、「Alt＋スペース→n」を送ろうとしていたのですが、「Alt＋スペース」の後の「n」をオペレーションとして認識してくれなくて期待した動作をさせる事が出来なかったのですが、なんか他の方法がないかとググったらこの方法が出てきました（笑）

次に、これは私がMacでも設定してるんですが、全ての文字入力でvimっぽいキー操作でカーソル移動をさせる設定を、AutoHoKeyでもやっています。「Alt＋h, j, k, l」でカーソル移動です。

```
!h::Send,{Left}
!l::Send,{Right}
!j::Send,{Down}
!k::Send,{Up}
```
Vimmerはこれでかなり幸せになれます（笑）

# アプリケーション操作
アプリケーションを使っていても、Macと同じアプリなのにショートカットが違って気持ち悪いものがあります。
それは「Chromeでのタブの選択」です。
Macでは、「shift＋cmd＋[」と、「shift＋cmd＋]」で選択されているタブが左右に変えれたのですが、Windowsではなぜか「Ctrl＋Tab」、「Ctrl＋Shift＋Tab」という、ほんとに全く直感的じゃないキーアサインでした。
これをMac風にします。

```
<+<^]::Send,^{Tab}
<+<^[::Send,+^{Tab}
```
さらに、ページバック／ページフォワードも、Macだと「cmd＋[」「cmd＋]」で出来るので、「Ctrl＋[」「Ctrl＋]」に設定します。

```
^]::Send,!{Right}
^[::Send,!{Left}
```
そして、DeveloperToolを出すショートカットも違うのでMacに揃えておきます。

```
^!i::Send,+^{i}
```
これで幸せになれます。

## 日本語変換
Macでは日本語を入力した後に、文字種を変更するのに「Option」キーを使います。ここでの例で言うと「Alt」に変更したキーです。なので、このキーと、a、z、x、cで変換するオペレーションを定義します。

```
!a::Send,^t
!z::Send,^u
!x::Send,^i
!c::Send,^p
```
あと、私がよく使う「三点リーダー」を登録しておきます。

```
!;::Send,{…}
```
# 設定ファイル
最後に設定ファイルの内容すべてを貼っておきます。

```
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.
#SingleInstance force
#Include IMEcontrol.ahk
#Include Functionkey.ahk
#MaxHotkeysPerInterval 350

;【Shiftキー】
; Shift   ：+		Shift
; 左Shift ：<+	LShift
; 右Shift ：>+	RShift

;【Altキー】
; Alt     ：!		Alt
; 左Alt   ：<!	LAlt		SC038
; 右Alt   ：>!	RAlt		SC0E0 SC038

;【Ctrlキー】
; Ctrl	  ：^		Control		Ctrl
; 左Ctrl  ：<^	LControl	LCtrl
; 右Ctrl  ：>^	RControl	RCtrl

;【Winキー】
; Win		  ：#		Win
; 左Win   ：<#  LWin	SC15B
; 右Win   ：>#  RWin

;【Backspaceキー】
;	スキャンコード： SC00E

;【Backslashキー】
;	スキャンコード： SC02B

;【Backquoteキー】
;	スキャンコード： SC029

;【ESCキー】
;	スキャンコード： SC001

;【マウス右ボタン】
; LButton

;【マウス右ボタン】
;	RButton

;【マウス右ボタン】
;	MButton

;----------------------------------------------------------------------------
; エスケープ文字変更
;----------------------------------------------------------------------------
#EscapeChar \

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;
; キーマップ書き換え
;
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; マイクON/OFF
;----------------------------------------------------------------------------
;Ctrl & d::
;	MuteMic()
;	return

MuteMic() {
	local MM
	SoundSet, +1, MASTER:1, MUTE, 2
	SoundGet, MM, MASTER:1, MUTE, 2
	#Persistent
	ToolTip, % (MM == "On" ? "Microphone offline" : "Microphone online")
	SetTimer, RemoveMuteMicTooltip, 700
	return
}

RemoveMuteMicTooltip:
	SetTimer, RemoveMuteMicTooltip, Off
	ToolTip
	return

;#u::MuteMic()

;----------------------------------------------------------------------------
; Ctrl+hでBackspace
;----------------------------------------------------------------------------
;^h::Send,{Backspace}

;----------------------------------------------------------------------------
; WinキーとAltキーのトグルを抑制
;----------------------------------------------------------------------------
*~LWin::Send {Blind}{vk07}
*~RWin::Send {Blind}{vk07}
*~LAlt::Send {Blind}{vk07}
*~RAlt::Send {Blind}{vk07}

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; ウィンドウオペレーション
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; ウィンドウを閉じる
;----------------------------------------------------------------------------
+^w::WinClose,A
;^w::Send,^{w}

;----------------------------------------------------------------------------
; Ctrl+m（アクティブウィンドウ最小化）
;----------------------------------------------------------------------------
^m::WinMinimize, A

;----------------------------------------------------------------------------
; アプリ切り替え
;----------------------------------------------------------------------------
Ctrl & Tab::AltTab
Alt & Tab::Send,{Alt Down}r

;----------------------------------------------------------------------------
; アプリ切り替え（戻り）
;----------------------------------------------------------------------------
Ctrl & SC001::ShiftAltTab
Alt & SC001::Send,{Alt Down}e

;----------------------------------------------------------------------------
; vimっぽく移動／選択
;----------------------------------------------------------------------------
End & h::
	GetKeyState, stateShift, Shift
	GetKeyState, stateCtrl, Ctrl
	If (stateShift = "D")
		Send,+{Left}
	else If (stateCtrl = "D")
		Send,+^{Left}
	else
		Send,{Left}
return
End & j::
	GetKeyState, state, Shift
	If (state = "D")
		Send,+{Down}
	else
		Send,{Down}
return
End & k::
	GetKeyState, state, Shift
	If (state = "D")
		Send,+{Up}
	else
		Send,{Up}
return
End & l::
	GetKeyState, stateShift, Shift
	GetKeyState, stateCtrl, Ctrl
	If (stateShift = "D")
		Send,+{Right}
	else If (stateCtrl = "D")
		Send,+^{Right}
	else
		Send,{Right}
return

;----------------------------------------------------------------------------
; 編集モード
;----------------------------------------------------------------------------
;+^Enter::Send,{F2}

;----------------------------------------------------------------------------
; アプリケーション起動
;----------------------------------------------------------------------------
^Down::Send,{Enter}

;----------------------------------------------------------------------------
; Shift+Contrl+Enterを押したらウィンドウ最大化／最小化
;----------------------------------------------------------------------------
;+^Enter::
;	WinGet, maximized, MinMax, A
;	If maximized = 1
;		WinRestore, A
;	Else
;		WinMaximize, A
;	Return

;----------------------------------------------------------------------------
; Ctrl+pを無効化
;----------------------------------------------------------------------------
;^p::Send,{}

;----------------------------------------------------------------------------
; Dockerのシェルから抜ける
;----------------------------------------------------------------------------
;+^p::Send,^p^q

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; 日本語変換
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; 入力言語切り替え
;----------------------------------------------------------------------------
;^Space::Send,{F15}
;^Enter::Send,{Alt}{vkF3sc029}
^Space::Send,{Alt}{vkF3sc029}

;----------------------------------------------------------------------------
; Shift+SpaceでのIME切り替えを無効化
;----------------------------------------------------------------------------
+Space::Send,{}

;----------------------------------------------------------------------------
; Ctrl + Alt + vで履歴貼り付け
;----------------------------------------------------------------------------
^!v::Send,#v

;----------------------------------------------------------------------------
; Altキーで上部メニューがアクティブになるのを抑制
;----------------------------------------------------------------------------
; 右 Ctrl 空打ちで IME を OFF
;RCtrl up::
;	if (A_PriorHotkey == "*~RCtrl") {
;		IME_SET(0)
;	}
;	Return

; 左 Ctrl 空打ちで IME を ON
;LCtrl up::
;	if (A_PriorHotkey == "*~LCtrl") {
;		IME_SET(1)
;	}
;	Return

;----------------------------------------------------------------------------
; 入力してから変換
;----------------------------------------------------------------------------
!a::Send,^t
!z::Send,^u
!x::Send,^i
!c::Send,^p
!s::Send,^o

;----------------------------------------------------------------------------
; three dot reader
;----------------------------------------------------------------------------
!;::Send,{…}

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
; Chrome
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; ブラウザのタブ移動
;----------------------------------------------------------------------------
+^,::Send,+^{Tab}
+^.::Send,^{Tab}
;+^p::Send,+^{Tab}
;+^\::Send,^{Tab}

;----------------------------------------------------------------------------
; 戻る／進む
;----------------------------------------------------------------------------
^,::Send,!{Left}
^.::Send,!{Right}
;^p::Send,!{Left}
;^\::Send,!{Right}

;----------------------------------------------------------------------------
; Developer tool
;----------------------------------------------------------------------------
!^i::Send,+^{i}

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;
; アプリケーション
;
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;End & 1::Run calc
!^Enter::
  IfWinExist, Terminal
  {
    IfWinActive, Terminal
    {
      WinMinimize, Terminal
    } Else {
      WinActivate, Terminal
    }
  } Else {
    Run wt.exe
    WinActivate, Terminal
  }

  return

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;
; トラックボールオペレーション
;
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

RButton::Send,{Click, Middle}
RButton & LButton::Send,{Click, Right}

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;
; System setting
;
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;----------------------------------------------------------------------------
; AutoHotKey Reload
;----------------------------------------------------------------------------
^!r::Reload

#InstallKeybdHook
```