Skip to content

Instantly share code, notes, and snippets.

@yahei
Created November 29, 2012 05:23
Show Gist options
  • Save yahei/4166988 to your computer and use it in GitHub Desktop.
Save yahei/4166988 to your computer and use it in GitHub Desktop.
keyhac用設定ファイル
from keyhac import *
from pyauto import *
import pyauto
#
# FかJを押しながら他のキーを押すと数字や記号が打てます。
#
# キーコード辞書(たぶんUS配列専用) '文字':キーコード (,で区切って並べる)
key_code = {
# 数字
'0':48,'1':49,'2':50,'3':51,'4':52,'5':53,'6':54,'7':55,'8':56,'9':57,
# アルファベット
'a':65,'b':66,'c':67,'d':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75,'l':76,'m':77,
'n':78,'o':79,'p':80,'q':81,'r':82,'s':83,'t':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,
# 記号4段分
'`':192,'-':189,'=':187,
'[':219,']':221,'\\':220,
';':186,'\'':222,
',':188,'.':190,'/':191,
# スペース
' ':32,
}
# シフト文字対応表(たぶんUS配列専用) '(普通の)シフトで打つ記号':'(普通の)シフトなしで出る記号'
shift_dic = {
'!':'1', '@':'2', '#':'3', '$':'4', '%':'5',
'^':'6', '&':'7', '*':'8', '(':'9', ')':'0',
'~':'`', '_':'-', '+':'=',
'{':'[', '}':']', '|':'\\',
':':';', '"':'\'',
'<':',', '>':'.', '?':'/',
}
# キーの置き換え表 よこシフト中、上の字が下の字に変わる
old_key = r"qwertyuiop[asdfghjkl;'zxcvbnm,./"
new_key = r"!@#$%^&*()|{}[]~_-+=`\1234567890"
# よこシフトに使うキー
YSKey = {key_code['f'], key_code['j']}
# 押した瞬間に入力されるよこシフト文字
quick_key = r"_-+$%!1234567890"
# [分かりづらいと思うので解説]
# 素早く「fox」などと打とうとすると、一時的にfとoが同時押し状態になることがある。
# これとよこシフト入力を区別するため、原則的には
# fが先に離されれば「f→o」と入力したものとみなし、
# oが先に離されれば「(」を入力したものとみなして処理している。
#
# 例外として、f→jの同時押しをを無条件で「-」の入力にしたいなどの場合は、
# ここに「-」の文字を入れておくことで、そのように設定できる。
# ------ 処理 ------
def configure(keymap):
keymap_global = keymap.defineWindowKeymap()
# <<<関数定義>>>
# ---ノーマル入力関数
def NormalInput(UD,x) :
# [モード遷移]
global ModKeys
global ModeFunc
if (ModKeys > 0) :
# @モディファイアモードへ
ModeFunc = ModInput
Input.send( [pyauto.KeyDown(x)] )
return
else :
for y in YSKey :
if (x==y) :
# @よこシフトホールドモードへ
if(UD == 'D') :
ModeFunc = YShiftHold(x)
return
# [キー入力]
if (UD == 'U') : Input.send( [pyauto.KeyUp (x)] )
else : Input.send( [pyauto.KeyDown(x)] )
# ---よこシフトキーホールド中関数
def YShiftHold(HKey) :
# 最後に押し下げられたキー
global YSPush
YSPush = -1
def temp(UD,x) :
# [モード遷移]
global ModKeys
global ModeFunc
global YSPush
if (ModKeys > 0) :
# @モディファイアモードへ
ModeFunc = ModInput
Input.send( [pyauto.KeyDown(HKey)] )
if (YSPush >= 0) : Input.send( [pyauto.KeyDown(YSPush)] )
Input.send( [pyauto.KeyDown(x)] )
return
elif(x == HKey) :
# @ノーマルモードへ
if(UD == 'U') :
ModeFunc = NormalInput
Input.send( [pyauto.KeyDown(HKey)] )
if (YSPush >= 0) : Input.send( [pyauto.KeyDown(YSPush)] )
# @リピートモードへ
else :
ModeFunc = RepeatInput(HKey)
Input.send( [pyauto.KeyDown(HKey)] )
return
elif(UD == 'U')and(x == YSPush) :
# @よこシフトモードへ
ModeFunc = YShiftInput(HKey)
YSInput(x)
elif(UD == 'D') :
if (YSPush >= 0)or(x in quick_code) :
# @よこシフトモードへ
ModeFunc = YShiftInput(HKey)
if (YSPush >= 0)and(YSPush != x) :
YSInput(YSPush)
YSInput(x)
else :
# 保留
YSPush = x
return temp
# ---リピート入力関数
def RepeatInput(RKey) :
def temp(UD,x):
# [モード遷移]
global ModKeys
global ModeFunc
if (ModKeys > 0) :
# @モディファイアモードへ
ModeFunc = ModInput
Input.send( [pyauto.KeyDown(x)] )
return
elif(x == RKey) :
# @ノーマルモードへ
if(UD == 'U') : ModeFunc = NormalInput
# リピート入力
else : Input.send( [pyauto.KeyDown(x)] )
elif (UD == 'D') :
for y in YSKey :
if (x==y) :
# @よこシフトホールドモードへ
ModeFunc = YShiftHold(x)
return temp
# ---よこシフト入力関数
def YShiftInput(YSKey) :
def temp(UD,x):
# [モード遷移]
global ModKeys
global ModeFunc
if (ModKeys > 0) :
# @モディファイアモードへ
ModeFunc = ModInput
Input.send( [pyauto.KeyDown(x)] )
return
elif(UD == 'U')and(x == YSKey) :
# @ノーマルモードへ
ModeFunc = NormalInput
return
# [キー入力]
elif (UD == 'D') : YSInput(x)
return temp
# ---よこシフトしたキーを入力
def YSInput(x) :
global YSKeys
if (x in YSKeys) :
if isinstance(YSKeys[x],str) :
Input.send([ pyauto.Char(YSKeys[x]) ])
elif(YSKeys[x]<255) :
Input.send( [pyauto.Key (YSKeys[x]) ])
else :
Input.send([ pyauto.KeyDown(16) ])
Input.send([ pyauto.Key(YSKeys[x]-256) ])
Input.send([ pyauto.KeyUp (16) ])
# ---モディファイア入力関数
def ModInput(UD,x) :
# [モード遷移]
global ModKeys
global ModeFunc
global stateList
if(ModKeys == 0) :
ModeFunc = NormalInput # ノーマルモードへ
# [キー入力]をスルー
if (UD == 'U') : Input.send( [pyauto.KeyUp (x)] )
else : Input.send( [pyauto.KeyDown(x)] )
# <<<初期化処理など>>>
# ---状態変数
global ModKeys
global ModeFunc
ModKeys = 0
ModeFunc = NormalInput
# ---押した瞬間入力されるキーを数値のリストに
global quick_code
quick_code = []
for x in quick_key : quick_code.append( key_code[ old_key[ new_key.find(x) ] ] )
# ---逆引き辞書生成
code_char = {}
for x in key_code : code_char[ key_code[x] ] = x
# ---よこシフトして入力する文字を一覧にしておく
global YSKeys
YSKeys = {}
for x in range(255) :
if (x in code_char) :
num = old_key.find( code_char[x] )
if (num < 0) :
YSKeys[x] = x
else :
c = new_key[num]
if (c in key_code ) : YSKeys[x] = key_code[c]
elif(c in shift_dic) : YSKeys[x] = key_code[shift_dic[c]] + 256
else : YSKeys[x] = c
else :
YSKeys[x] = x
# ---キー操作のイベントハンドラ
def InputKey(UD,x) :
def temp() :
global ModKeys
global Mode
# モディファイアキーの状態フラグを変更
if (160 <= x)and(x <= 165):
if (UD == 'U') : ModKeys ^= 1<<(x-160)
else : ModKeys |= 1<<(x-160)
# 現在のモードの関数を呼ぶ
ModeFunc(UD,x)
return temp
# ---イベントハンドラ登録
# キー単独押し下げ
for x in range(256) :
keymap_global[ 'D-'+str(x)] = InputKey('D',x)
keymap_global[ 'S-D-'+str(x)] = InputKey('D',x)
keymap_global[ 'C-D-'+str(x)] = InputKey('D',x)
keymap_global[ 'A-D-'+str(x)] = InputKey('D',x)
keymap_global[ 'C-A-D-'+str(x)] = InputKey('D',x)
keymap_global[ 'A-S-D-'+str(x)] = InputKey('D',x)
keymap_global[ 'S-C-D-'+str(x)] = InputKey('D',x)
keymap_global['S-C-A-D-'+str(x)] = InputKey('D',x)
# キー単独押し上げ
for x in range(256) :
keymap_global[ 'U-'+str(x)] = InputKey('U',x)
keymap_global[ 'S-U-'+str(x)] = InputKey('U',x)
keymap_global[ 'C-U-'+str(x)] = InputKey('U',x)
keymap_global[ 'A-U-'+str(x)] = InputKey('U',x)
keymap_global[ 'C-A-U-'+str(x)] = InputKey('U',x)
keymap_global[ 'A-S-U-'+str(x)] = InputKey('U',x)
keymap_global[ 'S-C-U-'+str(x)] = InputKey('U',x)
keymap_global['S-C-A-U-'+str(x)] = InputKey('U',x)
# ---キーバインド(このへんはお好みで)---
keymap_global['C-B'] = 'Left'
keymap_global['C-P'] = 'Up'
keymap_global['C-F'] = 'Right'
keymap_global['C-N'] = 'Down'
keymap_global['C-E'] = 'End'
keymap_global['C-H'] = 'Back'
keymap_global['C-D'] = 'Delete'
keymap_global['C-M'] = 'Return'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment