UPDATED to VERSION 1.1
All right, so, doing this is non-obvious (and it struck my interest), so… here’s an add-on that makes the Tab key cycle through Object → Pose → Edit → Object modes when the active object is an armature.
(You can still use Ctrl+Tab to get back to Object mode without passing through Edit mode.)
First, save the following script somewhere convenient:
tab-3.py
# SPDX-License-Identifier: BSL-1.0
# 2026 Michael Thomas Greer
bl_info = {
"name" : "Tab-3",
"description" : "Tab through Object, Pose, and Edit Modes",
"author" : "Michael Thomas Greer (Dúthomhas)",
"version" : (1, 1),
"blender" : (3, 0, 0),
"location" : "Preferences > Add-Ons > Tab-3",
"warning" : '',
"doc_url" : '',
"support" : "COMMUNITY",
"category" : "Interface", # IDK, would "Object" be more apropos?
}
import bpy
# This add-on overrides the default Blender key binding:
#
# 3D View > Object Non-modal > Set Object Mode
#
# with one that notices if the active object is an Armature and cycles through:
#
# Object Mode --> Pose Mode --> Edit Mode --> Object Mode
#
# If the object is not an Armature, the default toggle Edit mode operator
# is invoked instead.
#
#
# Observe that Shift-Tab is NOT modified -- that is the shortcut for Snap mode!
keymaps = []
class INTERFACE_OT_tab3(bpy.types.Operator):
bl_idname = "interface.tab3"
bl_label = bl_info["name"]
bl_options = {'REGISTER', 'UNDO', 'INTERNAL'}
def execute(self, context):
try:
if context.active_object.type == 'ARMATURE':
try:
modes = ('POSE', 'EDIT', 'OBJECT')
n = modes.index(bpy.context.object.mode)
return bpy.ops.object.mode_set(mode=modes[(n+1)%3])
except (ValueError, RuntimeError):
return bpy.ops.object.mode_set(mode='OBJECT')
return bpy.ops.object.editmode_toggle()
except (AttributeError, RuntimeError):
return {'FINISHED'}
def register():
bpy.utils.register_class(INTERFACE_OT_tab3)
wm = bpy.context.window_manager
km = wm.keyconfigs.addon.keymaps.new(name='Object Non-modal', space_type='EMPTY') # huh, not 'VIEW_3D'
kmi = km.keymap_items.new(INTERFACE_OT_tab3.bl_idname, 'TAB', 'PRESS')
keymaps.append((km, kmi))
def unregister():
for km, kmi in keymaps:
km.keymap_items.remove(kmi)
keymaps.clear()
bpy.utils.unregister_class(INTERFACE_OT_tab3)
if __name__ == "__main__":
register()
Then install it the usual way you install add-ons in Blender: Edit > Preferences > Add-ons. (These days you also have to click the little ⌄ button to get the “Install from disk” menu option.) Navigate to wherever you saved “tab-3.py” and select it.
The add-on should install and activate automatically.
Disabling and uninstalling also works the usual way.
I made no effort to disable Blender’s default Tab keybinding — there shouldn’t be any need to do that (add-on keybindings should override default bindings), but let me know if I’m mistaken. (I only tested on 3.0 and 4.5. IDR whether I tested against 5+, but it should not differ from 4.5.)
Update: version 1.1
Sorry, I guess this is the consequence of just throwing something together and letting everyone else do the testing.
I repented and spent some time trying to trip this new version up, but I am sure that I couldn’t possibly have thought of everything someone may try to do to it, so if you manage to get it to barf, let me know.
Known Behaviors:
- Linked armature assets with a library override are supposed to complain if you try to switch to Edit mode. You will continue to see the following error message in the console if you try:
Error: Unable to execute 'Edit Mode', error changing modes
The popup error message is suppressed, though. It is unclear to me whether or not I should let it appear, as the behavior of Tab-3 is meant to simply cycle through acceptable modes.
(You can still explicitly select Edit mode using the drop down menu in the header bar to produce the popup.)
The message in the console cannot be eliminated just by trapping exceptions, but it can be elimated, if desired.
My current thought is that if Edit mode is not available then in this instance the user does not want to get a popup message, but that there should at least be an explanation in the console for why it didn’t switch to Edit mode.
Let me know if you think I am incorrect in either assessment. Otherwise I’ll call this behavior as “close enough”.