Print out current shortcuts

I had an idea and I was wondering if it would fly.
A simple addon script that prints out all the current shortcuts.
This should be pretty easy to do and it would allow people to maintain a current list.
Has this been done already??
Thanks!
Greg

You can view the shortcuts under user preferences, right? There is an export key configuration button as well.

That is correct but that just writes out the python to change any you have different to the default

I was thinking of using getattr to get the current ones and save that to a text file/csv /image etc.

A vanilla blender just gives this.


import bpy
import os

def kmi_props_setattr(kmi_props, attr, value):
    try:
        setattr(kmi_props, attr, value)
    except AttributeError:
        print("Warning: property '%s' not found in keymap item '%s'" %
              (attr, kmi_props.__class__.__name__))
    except Exception as e:
        print("Warning: %r" % e)

wm = bpy.context.window_manager
kc = wm.keyconfigs.new(os.path.splitext(os.path.basename(__file__))[0])


Something like this but actually for all keys and contexts with their relevant properties



import bpy
local_window_manager = bpy.context.window_manager
for local_key_map in local_window_manager.keyconfigs.user.keymaps:
    print(local_key_map.name)
    for local_key_map_item in local_key_map.keymap_items:
        hotkey = []
        if local_key_map_item.ctrl: hotkey.append("Ctrl")
        if local_key_map_item.shift: hotkey.append("Shift")
        if local_key_map_item.alt: hotkey.append("Alt")
        hotkey.append("%s (%s)" % (local_key_map_item.type, local_key_map_item.value))
        print("%s    %s"  % (local_key_map.name, " + ".join(hotkey)))

 

OK I got this far(see below).

My current problem is simply how to get the tool tip info (or the description) of each command.
Any ideas??
Thanks

save a blend file (the file will be written into the .blend directory)
then paste the code in the console and run it.
outputs html which will cut and paste into a spreadsheet or other doc for your own formating

OK I’ve cleaned up the code a bit
It now prints tables per context and names and keys.

However it would be good to get the tooltips when they are set.
Any ideas would be greatly appreciated



import bpy
import os
import string

filename = os.path.join(os.path.dirname(bpy.data.filepath), "key_codes.html")
header = "<html><head></head><body><table>
"
try:
    outfile = open(filename, 'w')
    outfile.write(header)
    local_window_manager = bpy.context.window_manager
    for local_key_map in local_window_manager.keyconfigs.user.keymaps:
        outfile.write("</table><h3><font color=\"green\">%s</font></h3><table border=1>
" % local_key_map.name)
        for local_key_map_item in local_key_map.keymap_items:
            hotkey = []            
            if local_key_map_item.oskey: hotkey.append("OS Key")
            if local_key_map_item.shift: hotkey.append("Shift")
            if local_key_map_item.ctrl: hotkey.append("Ctrl")
            if local_key_map_item.alt: hotkey.append("Alt")
            hotkey.append("%s</font></td><td>%s" % ( string.capwords(local_key_map_item.type,"_"), string.capwords(local_key_map_item.value)))
            outfile.write("<tr><td><b>%s</b></td><td><font color=\"blue\">%s</td></tr>
"  % (local_key_map_item.name," + ".join(hotkey)))
    outfile.write("</table></body></html>
")
    outfile.close()
    print("File written as %s" % filename) 
except Exception as e:
    print("Warning writing file %s caused this error: %r" % (filename,e))
else:
    if outfile: outfile.close()



Ok here’s a pretty version.

It still needs more info like tooltips and context - any ideas ??

Please try it and let me know.

Instructions (shortcut these as you like)

Start a new blend file and save it somewhere

Open the console window (the one with the screen icon)

copy the code below into the console and press enter a couple of times to ensure that the code executes

error message or file name should be returned at the end

copy and paste the filename into your browser

in the browser copy the tables your interested in and paste them straight into a spread sheat or document to make them how you like them.



import bpy
import os
import string

filename = os.path.join(os.path.dirname(bpy.data.filepath), "key_codes.html")
header = "<html><head></head><body><table>
"
try:
    outfile = open(filename, 'w')
    outfile.write(header)
    wm = bpy.context.window_manager
    for local_key_map in wm.keyconfigs.user.keymaps:
        outfile.write("""</table><h3 style=\"color: #FF0000;\">%s</h3><table border=1>
        <thead><tr>
          <th>Name</th>
          <th style=\"color: #0000FF;\">Keys</th>
          <th>Action</th>
          <th>Description</th>
        </tr></thead>
""" % local_key_map.name)
        for key_map_item in local_key_map.keymap_items:
            hotkey = []            
            if key_map_item.shift: hotkey.append("Shift")
            if key_map_item.oskey: hotkey.append("OS Key")
            if key_map_item.ctrl: hotkey.append("Ctrl")
            if key_map_item.alt: hotkey.append("Alt")
            hotkey.append("%s</td><td>%s" % ( string.capwords(key_map_item.type.replace("MOUSE","_MOUSE").replace("TRACKPAD","TRACKPAD_"),"_").replace("_"," ").replace("Ndof","NDOF "), string.capwords(key_map_item.value)))
            idname = key_map_item.idname
            description = ""
            if idname:
                mod, opname = idname.split(".")
                idname_c = "%s_OT_%s" % (mod.upper(), opname)
                idtype = getattr(bpy.types, idname_c)
                description = idtype.bl_rna.description
            outfile.write("<tr><td><b>%s</b></td><td style=\"color: #0000FF;\">%s</td><td>%s</td></tr>
"  % (key_map_item.name," + ".join(hotkey),description))
    outfile.write("</table></body></html>
")
    outfile.close()
    print("File written as %s" % filename) 
except Exception as e:
    print("Warning writing file %s caused this error: %r" % (filename,e))
else:
    if outfile: outfile.close()


#   -----8<-----------

Here’s an example regarding the tooltips:

idname = "view3d.viewnumpad"

mod, opname = idname.split(".")
idname_c = "%s_OT_%s" % (mod.upper(), opname)
idtype = getattr(bpy.types, idname_c)

print(idtype.bl_rna.description)

# For this operator, you would get the text of the enum entry 'BACK' like:
print(idtype.bl_rna.properties['type'].enum_items['BACK'].description)

Thanks CoDEmanX
I have been hoping you would check this out.
You definitely are the Code MAN X
What would we do without you.

Thanks again again

I will finish this and stick it in the released scripts.
I’m not sure where in the UI to put this though it would only need to be run once or twice.

It should probably have a save file popup.

BTW are there any other things that would be useful to add in the output tables

I have updated post #4 this now works with basic descriptions.
If anyone is interested let me know and I will improve it.

I will one day add the extra details available by the second part of CoDEmanX’s code but for now I’d rather be blending than coding.
This will do me for now.