Index: release/scripts/startup/bl_ui/space_console.py =================================================================== --- release/scripts/startup/bl_ui/space_console.py (revision 47194) +++ release/scripts/startup/bl_ui/space_console.py (working copy) @@ -41,8 +41,16 @@ def draw(self, context): layout = self.layout + layout.operator("console.indent") + layout.operator("console.unindent") + + layout.separator() + layout.operator("console.clear") layout.operator("console.clear_line") + + layout.separator() + layout.operator("console.copy") layout.operator("console.paste") layout.menu("CONSOLE_MT_language") Index: source/blender/editors/space_console/console_intern.h =================================================================== --- source/blender/editors/space_console/console_intern.h (revision 47194) +++ source/blender/editors/space_console/console_intern.h (working copy) @@ -54,6 +54,9 @@ void CONSOLE_OT_delete(struct wmOperatorType *ot); void CONSOLE_OT_insert(struct wmOperatorType *ot); +void CONSOLE_OT_indent(struct wmOperatorType *ot); +void CONSOLE_OT_unindent(struct wmOperatorType *ot); + void CONSOLE_OT_history_append(struct wmOperatorType *ot); void CONSOLE_OT_scrollback_append(struct wmOperatorType *ot); Index: source/blender/editors/space_console/console_ops.c =================================================================== --- source/blender/editors/space_console/console_ops.c (revision 47194) +++ source/blender/editors/space_console/console_ops.c (working copy) @@ -364,9 +364,8 @@ char *str = RNA_string_get_alloc(op->ptr, "text", NULL, 0); int len; - // XXX, alligned tab key hack if (str[0] == '\t' && str[1] == '\0') { - len = TAB_LENGTH - (ci->cursor % TAB_LENGTH); + len = TAB_LENGTH; MEM_freeN(str); str = MEM_mallocN(len + 1, "insert_exec"); memset(str, ' ', len); @@ -430,7 +429,96 @@ RNA_def_property_flag(prop, PROP_SKIP_SAVE); } +static int console_indent_exec(bContext *C, wmOperator *op) +{ + SpaceConsole *sc = CTX_wm_space_console(C); + ARegion *ar = CTX_wm_region(C); + ConsoleLine *ci = console_history_verify(C); + int spaces; + int len; + + for (spaces = 0; spaces < ci->len; spaces++) { + if (ci->line[spaces] != ' ') + break; + } + + len = TAB_LENGTH - spaces % TAB_LENGTH; + + console_line_verify_length(ci, ci->len + len); + memmove(ci->line + len, ci->line, ci->len); + memset(ci->line, ' ', len); + ci->len += len; + console_line_cursor_set(ci, ci->cursor + len); + + console_textview_update_rect(sc, ar); + ED_area_tag_redraw(CTX_wm_area(C)); + + console_scroll_bottom(ar); + + return OPERATOR_FINISHED; +} + +void CONSOLE_OT_indent(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Indent"; + ot->description = "Add 4 spaces at line beginning"; + ot->idname = "CONSOLE_OT_indent"; + + /* api callbacks */ + ot->exec = console_indent_exec; + ot->poll = ED_operator_console_active; +} + +static int console_unindent_exec(bContext *C, wmOperator *op) +{ + SpaceConsole *sc = CTX_wm_space_console(C); + ARegion *ar = CTX_wm_region(C); + ConsoleLine *ci = console_history_verify(C); + int spaces; + int len; + + for (spaces = 0; spaces < ci->len; spaces++) { + if (ci->line[spaces] != ' ') + break; + } + + if (spaces == 0) + return OPERATOR_CANCELLED; + + len = spaces % TAB_LENGTH; + if (len == 0) + len = TAB_LENGTH; + + console_line_verify_length(ci, ci->len - len); + + memmove(ci->line, ci->line + len, ci->len - len); + ci->len -= len; + console_line_cursor_set(ci, ci->cursor - len); + + //console_select_offset(sc, -4); + + console_textview_update_rect(sc, ar); + ED_area_tag_redraw(CTX_wm_area(C)); + + console_scroll_bottom(ar); + + return OPERATOR_FINISHED; +} + +void CONSOLE_OT_unindent(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Unindent"; + ot->description = "Delete 4 spaces from line beginning"; + ot->idname = "CONSOLE_OT_unindent"; + + /* api callbacks */ + ot->exec = console_unindent_exec; + ot->poll = ED_operator_console_active; +} + static EnumPropertyItem console_delete_type_items[] = { {DEL_NEXT_CHAR, "NEXT_CHARACTER", 0, "Next Character", ""}, {DEL_PREV_CHAR, "PREVIOUS_CHARACTER", 0, "Previous Character", ""}, Index: source/blender/editors/space_console/space_console.c =================================================================== --- source/blender/editors/space_console/space_console.c (revision 47194) +++ source/blender/editors/space_console/space_console.c (working copy) @@ -246,6 +246,9 @@ WM_operatortype_append(CONSOLE_OT_move); WM_operatortype_append(CONSOLE_OT_delete); WM_operatortype_append(CONSOLE_OT_insert); + + WM_operatortype_append(CONSOLE_OT_indent); + WM_operatortype_append(CONSOLE_OT_unindent); /* for use by python only */ WM_operatortype_append(CONSOLE_OT_history_append); @@ -332,7 +335,11 @@ WM_keymap_add_item(keymap, "CONSOLE_OT_select_set", LEFTMOUSE, KM_PRESS, 0, 0); - RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, 0, 0)->ptr, "text", "\t"); /* fake tabs */ + RNA_string_set(WM_keymap_add_item(keymap, "CONSOLE_OT_insert", TABKEY, KM_PRESS, KM_CTRL, 0)->ptr, "text", "\t"); /* fake tabs */ + + WM_keymap_add_item(keymap, "CONSOLE_OT_indent", TABKEY, KM_PRESS, 0, 0); + WM_keymap_add_item(keymap, "CONSOLE_OT_unindent", TABKEY, KM_PRESS, KM_SHIFT, 0); + WM_keymap_add_item(keymap, "CONSOLE_OT_insert", KM_TEXTINPUT, KM_ANY, KM_ANY, 0); // last! }