# HG changeset patch # User Steve Losh # Date 1348769330 14400 # Node ID df78607a7a38abc31dfd94bd4b8f8bce64d5839d # Parent efc8b9162ff8a58f08bc53557342165824d752d6 Add keyremap script. diff -r efc8b9162ff8 -r df78607a7a38 keyremap4macbook/cadet.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/keyremap4macbook/cadet.py Thu Sep 27 14:08:50 2012 -0400 @@ -0,0 +1,131 @@ +# -*- coding: utf8 -*- +import string + +greek = [ + ('a', u'α' u'Α', u'', u''), + ('b', u'β' u'Β', u'', u''), + ('c', u'χ' u'Χ', u'', u''), + ('d', u'δ' u'Δ', u'', u''), + ('e', u'ε' u'Ε', u'', u''), + ('f', u'φ' u'Φ', u'', u''), + ('g', u'γ' u'Γ', u'', u''), + ('h', u'η' u'Η', u'', u''), + ('i', u'ι' u'Ι', u'', u''), + ('j', u'ϑ' u'Θ', u'', u''), + ('k', u'κ' u'Κ', u'', u''), + ('l', u'λ' u'Λ', u'', u''), + ('m', u'μ' u'Μ', u'', u''), + ('n', u'ν' u'Ν', u'', u''), + ('o', u'ο' u'Ο', u'', u''), + ('p', u'π' u'Π', u'', u''), + ('q', u'θ' u'Θ', u'', u''), + ('r', u'ρ' u'Ρ', u'', u''), + ('s', u'σ' u'Σ', u'', u''), + ('t', u'τ' u'Τ', u'', u''), + ('u', u'υ' u'Υ', u'', u''), + ('v', u'ς' u'Σ', u'', u''), + ('w', u'ω' u'Ω', u'', u''), + ('x', u'ξ' u'Ξ', u'', u''), + ('y', u'ψ' u'Ψ', u'', u''), + ('z', u'ζ' u'Ζ', u'', u''), +] + +math = [ + ('a', u'∧', u'ℵ', u'', u''), + ('c', u'∘', u'ℂ', u'', u''), + ('e', u'∈', u'∉', u'', u''), + ('f', u'∫', u'', u'', u''), + ('i', u'∩', u'∞', u'', u''), + ('n', u'' , u'ℕ', u'', u''), + ('o', u'∨', u'', u'', u''), + ('r', u'√', u'ℝ', u'', u''), + ('t', u'⊢', u'⊥', u'', u''), + ('u', u'∪', u'', u'', u''), + ('x', u'⊻', u'', u'', u''), + ('z', u'' , u'ℤ', u'', u''), + ('-', u'¬', u'', u'', u''), + ('=', u'≠', u'±', u'', u''), + ('/', u'÷', u'', u'', u''), + (',', u'' , u'≤', u'', u''), + ('.', u'·', u'≥', u'', u''), + ('0', u'∅', u'', u'', u''), + ('8', u'' , u'×', u'', u''), + ('`', u'' , u'≈', u'', u''), + ('[', u'⊂', u'⊄', u'⊆', u'⊈'), + (']', u'⊃', u'⊅', u'⊇', u'⊉'), + ('right', u'→', u'↛', u'⇒', u'⇏'), + ('left', u'←', u'↚', u'⇐', u'⇍'), + ('up', u'↔', u'↮', u'⇔', u'⇎'), + ('down', u'↔', u'↮', u'⇔', u'⇎'), +] + +def get_keycode(c): + if c in string.letters: + return c + elif c in string.digits: + return 'KEY_' + c + else: + return { + '-': 'MINUS', + '=': 'EQUAL', + '/': 'SLASH', + '\\': 'BACKSLASH', + '.': 'DOT', + ',': 'COMMA', + "'": 'QUOTE', + ';': 'SEMICOLON', + '[': 'BRACKET_LEFT', + ']': 'BRACKET_RIGHT', + '`': 'BACKQUOTE', + 'left': 'CURSOR_LEFT', + 'right': 'CURSOR_RIGHT', + 'down': 'CURSOR_DOWN', + 'up': 'CURSOR_UP', + }[c] + +def get_line(c): + line_template = r'''KeyCode::%s, ModifierFlag::OPTION_L,''' + key = get_keycode(c) + return line_template % key + +def get_codepoint(c): + r = repr(c) + if len(r) == 7: + return '00' + r[-3:-1].upper() + else: + return r[-5:-1].upper() + +def get_chunk(source_key, dest_char, mod, buckies): + modifier_chunks = ['ModifierFlag::EXTRA%d'% mod] + modifier_chunks.extend(buckies) + modifier = ' | '.join(modifier_chunks) + + codepoint = get_codepoint(dest_char) + lines = '\n'.join(get_line(c) for c in codepoint) + + return r''' + + --KeyToKey-- + KeyCode::%s, %s, + %s + + ''' % (source_key, modifier, lines) + +def for_map(m, modifier): + for k, bare, shift, ctrl, shiftctrl in m: + k = get_keycode(k).upper() + + if shiftctrl: + print get_chunk(k, shiftctrl, modifier, ['VK_CONTROL', 'VK_SHIFT']) + + if shift: + print get_chunk(k, shift, modifier, ['VK_SHIFT']) + + if ctrl: + print get_chunk(k, ctrl, modifier, ['VK_CONTROL']) + + if bare: + print get_chunk(k, bare, modifier, []) + +# for_map(greek, 4) +for_map(math, 3)