Created
September 23, 2016 15:41
-
-
Save NeoCat/d7233e3130110c0fe6122d32610e4d50 to your computer and use it in GitHub Desktop.
keyhacを使ってNICOLA配列(ローマ字入力設定用)にするためのconfig例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import os | |
import datetime | |
import subprocess | |
import re | |
import time | |
from keyhac import * | |
class NICOLA: | |
SHIFT_KEY = ["Space", "104"] | |
SHIFT_MS = 40 | |
SHIFT_DURATION = datetime.timedelta(milliseconds=40) | |
TABLE = { | |
# Normal/SHIFT1/SHIFT2 | |
"Q": '"Period"/XA/WYI', | |
"W": 'KA/E/GA', | |
"E": 'TA/RI/DA', | |
"R": 'KO/XYA/GO', | |
"T": 'SA/RE/ZA', | |
"Y": 'RA/PA/YO', | |
"U": 'TI/DI/NI', | |
"I": 'KU/GU/RU', | |
"O": 'TU/DU/MA', | |
"P": '"LAlt-Comma"/PI/XE', | |
"OpenBracket": '"Comma"/"LShift-2"/"LShift-7"', | |
"[": None, | |
"A": 'U/WO/VU', | |
"S": 'SI/A/JI', | |
"D": 'TE/NA/DE', | |
"F": 'KE/XYU/GE', | |
"G": 'SE/MO/ZE', | |
"H": 'HA/BA/MI', | |
"J": 'TO/DO/O', | |
"K": 'KI/GI/NO', | |
"L": 'I/PO/XYO', | |
"Semicolon": 'NN/"LShift-Semicolon"/XTU', | |
"Quote": '"Quote"/"Semicolon"/"LShift-Quote"', | |
"]": None, | |
"Z": '"LAlt-Period"/XU/WYE', | |
"X": 'HI/"Minus"/BI', | |
"C": 'SU/RO/ZU', | |
"V": 'HU/YA/BU', | |
"B": 'HE/XI/BE', | |
"N": 'ME/PU/NU', | |
"M": 'SO/ZO/YU', | |
"Comma": 'NE/PE/MU', | |
"Period": 'HO/BO/WA', | |
"Slash": '"Slash"/XWA/XO', | |
"94": '"93"/"LShift-94"/"94"', | |
"1": '1/"LShift-Slash"/"LShift-1"', | |
"2": '2/"Slash"/"LShift-2"', | |
"3": '3/"LShift-Plus"/"LShift-3"', | |
"4": '4/"CloseBracket"/"LShift-4"', | |
"5": '5/"BackSlash"/"LShift-5"', | |
"6": '6/"LShift-6"/"LAlt-CloseBracket"', | |
"7": '7/"LShift-7"/"LAlt-BackSlash"', | |
"8": '8/"LShift-8"/"LShift-Comma"', | |
"9": '9/"LShift-9"/"LShift-Period"', | |
"0": '0/"LShift-0"/"LShift-CloseBracket"', | |
"Minus": '"Minus"/"LShift-Minus"/"LShift-BackSlash"', | |
} | |
def __init__(self, keymap): | |
self.ime = False | |
self.shift_time = [None, None] | |
self.suppress_oneshot = [False, False] | |
self.last_key_time = None | |
self.deferred_action = None | |
el = re.compile(r'"(.*?)"|(.)') | |
ex = re.compile(r'((?:".*?"|.)+?)(?:/|$)') | |
first_val = lambda i: [j for j in i if j][0] | |
self.table = {key:[[first_val(i) for i in el.findall(v)] | |
for v in ex.findall(val)] | |
for (key,val) in self.TABLE.items() if val} | |
print(self.table) | |
self._setup(keymap) | |
def _setup(self, keymap): | |
self.keymap = keymap | |
keymap_global = keymap.defineWindowKeymap() | |
keymap_global["D-" + self.SHIFT_KEY[0]] = lambda: self.shift_start(0) | |
keymap_global["U-" + self.SHIFT_KEY[0]] = lambda: self.shift_stop(0) | |
keymap_global["O-" + self.SHIFT_KEY[0]] = lambda: self.oneshot(0) | |
keymap_global["D-" + self.SHIFT_KEY[1]] = lambda: self.shift_start(1) | |
keymap_global["U-" + self.SHIFT_KEY[1]] = lambda: self.shift_stop(1) | |
keymap_global["O-" + self.SHIFT_KEY[1]] = lambda: self.oneshot(1) | |
if self.SHIFT_KEY[0] != "102" and self.SHIFT_KEY[1] != "102": | |
keymap_global["D-102"] = lambda: self.ime_off() | |
if self.SHIFT_KEY[0] != "104" and self.SHIFT_KEY[1] != "104": | |
keymap_global["D-104"] = lambda: self.ime_on() | |
for key in self.table.keys(): | |
keymap_global["D-" + key] = self.key_down(key) | |
keymap_global["U-" + key] = self.key_up(key) | |
def invoke_timer(self): | |
if self.deferred_action: | |
self.deferred_action[0]() | |
def _key_down_shift(self, keys): | |
if (self.shift_time[0] and | |
self.last_key_time - self.shift_time[0] < self.SHIFT_DURATION): | |
self.keymap.InputKeyCommand(*keys[1])() | |
self.last_key_time = None | |
self.shift_time[0] = None | |
return True | |
if (self.shift_time[1] and | |
self.last_key_time - self.shift_time[1] < self.SHIFT_DURATION): | |
self.keymap.InputKeyCommand(*keys[2])() | |
self.last_key_time = None | |
self.shift_time[1] = None | |
return True | |
return False | |
def key_down(self, key): | |
keys = self.table[key] | |
def _key_down(): | |
self.invoke_timer() | |
if not self.ime: | |
return self.keymap.InputKeyCommand("D-" + key)() | |
self.last_key_time = datetime.datetime.now() | |
self.suppress_oneshot = [True, True] | |
if not self._key_down_shift(keys): | |
def _key_down_deferred(): | |
# print("遅延処理: %s" % key) | |
if not self._key_down_shift(keys): | |
self.keymap.InputKeyCommand(*keys[0])() | |
# rewrite deferred_action referenced in lambda | |
if self.deferred_action: | |
self.deferred_action[0] = None | |
self.deferred_action = None | |
self.last_key_time = None | |
deferred_action = [_key_down_deferred] | |
deferred = lambda: deferred_action[0] and deferred_action[0]() | |
self.keymap.delayedCall(deferred, self.SHIFT_MS) | |
self.deferred_action = deferred_action | |
# print("Timer開始: %s" % key) | |
return _key_down | |
def key_up(self, key): | |
def _key_up(): | |
if not self.ime: | |
return self.keymap.InputKeyCommand("U-" + key)() | |
self.invoke_timer() | |
self.last_key_time = None | |
return _key_up | |
def ime_on(self): | |
if not self.ime: | |
print("NICOLA有効化") | |
self.ime = True | |
if "104" not in self.SHIFT_KEY: | |
self.keymap.InputKeyCommand("104")() | |
def ime_off(self): | |
if self.ime: | |
print("NICOLA無効化") | |
self.ime = False | |
if "102" not in self.SHIFT_KEY: | |
self.keymap.InputKeyCommand("102")() | |
def shift_start(self, i): | |
self.suppress_oneshot[i] = False | |
if self.ime: | |
if self.shift_time[i]: # key repeat | |
self.suppress_oneshot[i] = True | |
self.keymap.InputKeyCommand("D-" + self.SHIFT_KEY[i])() | |
else: | |
self.shift_time[i] = datetime.datetime.now() | |
if (self.ime and self.last_key_time and | |
datetime.datetime.now() - self.last_key_time < self.SHIFT_DURATION): | |
self.invoke_timer() | |
self.suppress_oneshot[i] = True | |
if not self.ime: | |
self.suppress_oneshot[i] = True | |
self.keymap.InputKeyCommand("D-" + self.SHIFT_KEY[i])() | |
if self.SHIFT_KEY[i] == "104": | |
self.ime_on() | |
def shift_stop(self, i): | |
if self.ime and self.shift_time[i]: | |
if self.SHIFT_KEY[i] == "102": | |
self.keymap.InputKeyCommand("D-102")() | |
self.ime_off() | |
if self.shift_time[i]: | |
self.shift_time[i] = None | |
self.keymap.InputKeyCommand("U-" + self.SHIFT_KEY[i])() | |
def oneshot(self, i): | |
if self.ime and not self.suppress_oneshot[i]: | |
self.keymap.InputKeyCommand(self.SHIFT_KEY[i])() | |
def configure(keymap): | |
# ... | |
# NICOLA | |
if 1: | |
NICOLA(keymap) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment