Skip to content

Instantly share code, notes, and snippets.

@NeoCat
Created September 23, 2016 15:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save NeoCat/d7233e3130110c0fe6122d32610e4d50 to your computer and use it in GitHub Desktop.
Save NeoCat/d7233e3130110c0fe6122d32610e4d50 to your computer and use it in GitHub Desktop.
keyhacを使ってNICOLA配列(ローマ字入力設定用)にするためのconfig例
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