作業環境のカスタムキーマップ

# 作業環境のカスタムキーマップ
AutoHotkeyとChangeKeyを用いて、作業環境のキーマップを変更している。  
備忘録として本記事を記載する。

## 環境
項目|内容・バージョン
---|---
OS|Windows10 Professional
AutoHotkey|v2.0.18
ChangeKey|v1.50

## CustomKeyMap

### ChangeKeyの設定
ChangeKeyで以下のキーを入れ替えている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2154976/7a797ce7-ad3f-0d08-cbb9-74442672aabc.png)

入力|出力
---|---
CapsLock|右Ctrl


### AutoHotkeyの設定
AutoHotkeyで以下のキーマップを設定している。  
（以下はChangeKeyで設定した内容も含んだ全てのキーマップ一覧）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2154976/afc27596-b5a0-bbd3-5acb-404b7b57b32f.png)

#### スクリプト
```CustomKeyMap.ahk
InstallKeybdHook
#UseHook

;[無変換]+[I] → [↑]
vk1D & i::Send "{Up}"

;[無変換]+[J] → [←]
vk1D & j::Send "{Left}"

;[無変換]+[K] → [↓]
vk1D & k::Send "{Down}"

;[無変換]+[L] → 	[→]
vk1D & l::Send "{Right}"

;[無変換]+[Space] → [Enter]
vk1D & Space::Send "{Enter}"

;[無変換]+[h] → [BackSpace]
vk1D & h::Send "{Backspace}"

;[無変換]+[M] → [Win]+[Shift]+[←]：ウインドウをモニター間移動
vk1D & m::Send "{RWin Down}{Shift Down}{left}{Shift Up}{RWin Up}"

;[無変換]+[変換] → [Win]+[Shift]+[S]：指定した領域を画面コピー
vk1D & vk1C::Send "{RWin Down}{Shift Down}{s Down}{RWin Up}{Shift Up}{s Up}"

;[無変換]+[U] → [Ctrl]+[Alt]+[Tab]：ウインドウの切り替え
vk1D & u::Send "{Ctrl Down}{Alt Down}{Tab Down}{Ctrl Up}{Alt Up}{Tab Up}"

;[無変換]+[1] → [F1]
vk1D & 1::Send "{F1}"

;[無変換]+[2] → [F2]
vk1D & 2::Send "{F2}"

;[無変換]+[3] → [F3]
vk1D & 3::Send "{F3}"

;[無変換]+[4] → [F4]
vk1D & 4::Send "{F4}"

;[無変換]+[5] → [F5]
vk1D & 5::Send "{F5}"

;[無変換]+[6] → [F6]
vk1D & 6::Send "{F6}"

;[無変換]+[7] → [F7]
vk1D & 7::Send "{F7}"

;[無変換]+[8] → [F8]
vk1D & 8::Send "{F8}"

;[無変換]+[9] → [F9]
vk1D & 9::Send "{F9}"

;[無変換]+[0] → [F10]
vk1D & 0::Send "{F10}"

;[無変換]+[-] → [F11]
vk1D & -::Send "{F11}"

;[無変換]+[^] → [F12]
vk1D & ^::Send "{F12}"

;タイムスタンプ機能
;[無変換]+[I] → タイムスタンプ(YYYYMMDD )を入力する
vk1D & d::
{
    TimeString := FormatTime(,"yyyyMMdd ")
    Send TimeString
}

;[変換] → IME On/Off
vk1C::Send "{vkF3}"

;[Ctrl]+[Space] → IME On/Off
Ctrl & Space::Send "{vkF3}"

;Sands機能
;  Spaceキーを押下した状態で他のキーを押下した場合、SpaceキーをShiftキーとして機能させる。
;  Spaceキー単体で押下した場合にはSpaceキーとして動作させる。
press := 0     ; スペースキーを押しているかどうか。
shifted := 0   ; スペースキー押下中に何かの印字可能文字を押したかどうか。
pressedAt := 0 ; スペースキーを押した時間（msec）。
timeout := 300 ; pressedAt からこの時間が経過したら、もはや離したときにもスペースを発射しない。

hook := InputHook() ; スペースキー押下中に何かの印字可能文字を押したかどうか捕捉するフック。

$*Space:: {
	global
	SendInput "{Shift Down}"
	if (press = 1) {
		return
	}
	shifted := 0
	press := 1
	pressedAt := A_TickCount

	; 何かのキーが押されたことを検知する
	; L1 はフックする文字数の上限を 1 にする
	; V はフックした入力をブロックしない
	; デフォルトで印字可能文字のみフックされる
	hook := InputHook("L1 V")

	; 一文字待機し、待機中にスペースを離したとき以外、
	; シフト済みにする
	hook.Start()
	if (hook.Wait() != "Stopped") {
		shifted := 1
	}
}

$*Space up:: {
	global
	SendInput "{Shift Up}"
	press := 0

	; 待機キャンセル
	hook.Stop()

	; 一定時間経過していたらスペースを発射しない
	if (A_TickCount - pressedAt > timeout) {
		return
	}

	; シフト済みでなければスペースを発射する
	; 先に押してあるモディファイアキーと組み合わせられるように {Blind} をつける
	if (shifted == 0) {
		SendInput "{Blind}{Space}"
	}
}

; スペース押しっぱなしが欲しいときのために RShift で代用する
$RShift::Space
```

## 【参考】ブラインドタッチ 早見表
![TouchTyping.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2154976/9ede5d6c-df76-6eef-35b8-ec3b13c4e5f4.jpeg)