blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

sticky shift を AutoHotkey_L で実装してみた

「AutoHotkey でセミコロンにスティッキーシフトの機能」を割り当てる手法 - blechmusik2の日記の続きである。
sticky shift を実現するスクリプトを書いてみた。本家 AutoHotkey 用スクリプトではなくて、AutoHotkey_L 用スクリプトだ。AutoHotkey_L を導入するには、以下のウェブページからプログラムを入手すること。

説明する必要がないであろうほど単純な実装方法を採用した。設定内容につき、少しだけ触れておこう。まず、Scan Code を使用してキーのフックを設定する。[;]を押すことにより、KeyMap を 1 とする。この状態で文字キーを押すと、[Shift] を押した状態で文字キーを押したことにする。そして KeyMap を 0 とする。実装内容はこれだけだ。
注意すべきことは、";" という記号そのものを出力できないことだ。どれかのキーでこの記号を出力するよう設定する必要があろう。

;;; sticky shift (AutoHotkey_L 用)
;;; AutoHotkey_L の入手先: http://www.autohotkey.net/~Lexikos/AutoHotkey_L/

;;; sticky-shift
;;; http://homepage1.nifty.com/blankspace/emacs/sticky.html

;;; 初期設定では、";" セミコロンを出力できない。設定を適宜変更する必要がある。

#NoEnv
#SingleInstance FORCE
#WinActivateForce
#UseHook
#persistent
#InstallKeybdHook

Process, Priority, , High

SetBatchLines, -1
SetControlDelay, 0
SetKeyDelay,-1,0

KeyMap := 0

#If (KeyMap = 0)
	sc027::
		KeyMap := 1
	return

#If (KeyMap)
	sc002::
	sc003::
	sc004::
	sc005::
	sc006::
	sc007::
	sc008::
	sc009::
	sc00A::
	sc00B::
	sc00C::
	sc00D::
	sc07D::
	sc010::
	sc011::
	sc012::
	sc013::
	sc014::
	sc015::
	sc016::
	sc017::
	sc018::
	sc019::
	sc01A::
	sc01B::
	sc01E::
	sc01F::
	sc020::
	sc021::
	sc022::
	sc023::
	sc024::
	sc025::
	sc026::
	sc027::
	sc028::
	sc02B::
	sc02C::
	sc02D::
	sc02E::
	sc02F::
	sc030::
	sc031::
	sc032::
	sc033::
	sc034::
	sc035::
	sc073::
		KeyMap := 0
		send,+{%A_ThisHotkey%}
	return
#If