Skip to content

Instantly share code, notes, and snippets.

@EClaesson
Last active July 3, 2019 21:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save EClaesson/9f0e0ac6cedf2bfce5ffa7a978176664 to your computer and use it in GitHub Desktop.
Save EClaesson/9f0e0ac6cedf2bfce5ffa7a978176664 to your computer and use it in GitHub Desktop.
import bpy
#########################################
# Configuration #
#########################################
# If True, key modifiers will be skipped (always set to NONE).
IGNORE_KEY_MODIFIER = False
# If True, skips the os key in shortcuts.
IGNORE_OSKEY = True
# Ignores everything matching any string in the list.
IGNORE_PATTERNS = ['MOUSE', 'EVT', 'NDOF', 'TRACKPAD', 'TIMER', 'WINDOW', 'TEXTINPUT', 'MEDIA', 'LINE_FEED']
# Format for a line of output.
OUTPUT_FORMAT = '{shift:>6}{alt:>4}{ctrl:>5}{os:>3}{mod:>4}{key:>4}'
# Which keymap to test.
KEYMAP_NAME = 'Window'
#########################################
# Code #
#########################################
keymap = bpy.context.window_manager.keyconfigs.user.keymaps.get(KEYMAP_NAME)
keys = [
'LEFTMOUSE', 'MIDDLEMOUSE', 'RIGHTMOUSE', 'BUTTON4MOUSE', 'BUTTON5MOUSE', 'BUTTON6MOUSE',
'BUTTON7MOUSE', 'ACTIONMOUSE', 'SELECTMOUSE', 'MOUSEMOVE', 'INBETWEEN_MOUSEMOVE', 'TRACKPADPAN',
'TRACKPADZOOM', 'MOUSEROTATE', 'WHEELUPMOUSE', 'WHEELDOWNMOUSE', 'WHEELINMOUSE', 'WHEELOUTMOUSE',
'EVT_TWEAK_L', 'EVT_TWEAK_M', 'EVT_TWEAK_R', 'EVT_TWEAK_A', 'EVT_TWEAK_S', 'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z', 'ZERO', 'ONE', 'TWO', 'THREE', 'FOUR', 'FIVE', 'SIX', 'SEVEN', 'EIGHT', 'NINE', 'LEFT_CTRL',
'LEFT_ALT', 'LEFT_SHIFT', 'RIGHT_ALT', 'RIGHT_CTRL', 'RIGHT_SHIFT', 'OSKEY', 'GRLESS', 'ESC', 'TAB',
'RET', 'SPACE', 'LINE_FEED', 'BACK_SPACE', 'DEL', 'SEMI_COLON', 'PERIOD', 'COMMA', 'QUOTE',
'ACCENT_GRAVE', 'MINUS', 'SLASH', 'BACK_SLASH', 'EQUAL', 'LEFT_BRACKET', 'RIGHT_BRACKET', 'LEFT_ARROW',
'DOWN_ARROW', 'RIGHT_ARROW', 'UP_ARROW', 'NUMPAD_2', 'NUMPAD_4', 'NUMPAD_6', 'NUMPAD_8', 'NUMPAD_1',
'NUMPAD_3', 'NUMPAD_5', 'NUMPAD_7', 'NUMPAD_9', 'NUMPAD_PERIOD', 'NUMPAD_SLASH', 'NUMPAD_ASTERIX',
'NUMPAD_0', 'NUMPAD_MINUS', 'NUMPAD_ENTER', 'NUMPAD_PLUS', 'F1', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7',
'F8', 'F9', 'F10', 'F11', 'F12', 'F13', 'F14', 'F15', 'F16', 'F17', 'F18', 'F19', 'PAUSE', 'INSERT',
'HOME', 'PAGE_UP', 'PAGE_DOWN', 'END', 'MEDIA_PLAY', 'MEDIA_STOP', 'MEDIA_FIRST', 'MEDIA_LAST',
'TEXTINPUT', 'WINDOW_DEACTIVATE', 'TIMER', 'TIMER0', 'TIMER1', 'TIMER2', 'TIMER_JOBS', 'TIMER_AUTOSAVE',
'TIMER_REPORT', 'TIMERREGION', 'NDOF_MOTION', 'NDOF_BUTTON_MENU', 'NDOF_BUTTON_FIT', 'NDOF_BUTTON_TOP',
'NDOF_BUTTON_BOTTOM', 'NDOF_BUTTON_LEFT', 'NDOF_BUTTON_RIGHT', 'NDOF_BUTTON_FRONT', 'NDOF_BUTTON_BACK',
'NDOF_BUTTON_ISO1', 'NDOF_BUTTON_ISO2', 'NDOF_BUTTON_ROLL_CW', 'NDOF_BUTTON_ROLL_CCW', 'NDOF_BUTTON_SPIN_CW',
'NDOF_BUTTON_SPIN_CCW', 'NDOF_BUTTON_TILT_CW', 'NDOF_BUTTON_TILT_CCW', 'NDOF_BUTTON_ROTATE',
'NDOF_BUTTON_PANZOOM', 'NDOF_BUTTON_DOMINANT', 'NDOF_BUTTON_PLUS', 'NDOF_BUTTON_MINUS', 'NDOF_BUTTON_ESC',
'NDOF_BUTTON_ALT', 'NDOF_BUTTON_SHIFT', 'NDOF_BUTTON_CTRL', 'NDOF_BUTTON_1', 'NDOF_BUTTON_2', 'NDOF_BUTTON_3',
'NDOF_BUTTON_4', 'NDOF_BUTTON_5', 'NDOF_BUTTON_6', 'NDOF_BUTTON_7', 'NDOF_BUTTON_8', 'NDOF_BUTTON_9',
'NDOF_BUTTON_10', 'NDOF_BUTTON_A', 'NDOF_BUTTON_B', 'NDOF_BUTTON_C']
taken = []
for item in keymap.keymap_items:
taken.append({'type': item.type, 'shift': item.shift, 'alt': item.alt, 'ctrl': item.ctrl, 'oskey': item.oskey, 'key_modifier': item.key_modifier})
bpy.ops.text.new()
text = bpy.data.texts[-1]
text.name = 'Unused Shortcuts ({0})'.format(KEYMAP_NAME)
text.write('Unused Shortcuts For Keymap "{0}".\n\n'.format(KEYMAP_NAME))
text.write('===================================\n')
text.write('SHIFT|ALT|CTRL|OS|MOD|KEY\n')
text.write('===================================\n\n')
output = ''
tf = [True, False]
for key in keys:
for mod in (['NONE'] + keys) if not IGNORE_KEY_MODIFIER else ['NONE']:
for shift in tf:
for alt in tf:
for ctrl in tf:
for oskey in tf if not IGNORE_OSKEY else [False]:
if {'type': key, 'key_modifier': mod, 'shift': shift, 'alt': alt, 'ctrl': ctrl, 'oskey': oskey} not in taken:
ignore = False
for pattern in IGNORE_PATTERNS:
if pattern in key or pattern in mod:
ignore = True
break
if ignore:
break
output += OUTPUT_FORMAT.format(
shift='Shift ' if shift else '',
alt='Alt ' if alt else '',
ctrl='Ctrl ' if ctrl else '',
os='OS ' if oskey else '',
mod=mod + ' ' if mod != 'NONE' else '',
key=key
) + '\n'
text.write(output)
@peralmered
Copy link

It seems to just list ALL hotkeys, regardless of whether they're used or not? I get an output of 90700+ lines of shortcuts. Blender v2.78c, 2017-02-24 14:33

Or am I simply misunderstanding how to use it?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment