def change_indent(cursor, direction): """Changes the indent in the desired direction (-1 for left and +1 for right). Returns True if the indent operation was applied. The cursor may contain a selection. """ # get some variables from the document indent_vars = indent_variables(cursor.document()) blocks = list(cursortools.blocks(cursor)) block = blocks[0] pos = cursor.selectionStart() - block.position() token = tokeniter.tokens(block)[0] if tokeniter.tokens(block) else None if cursor.hasSelection() or pos == 0 or (token and isinstance(token, ly.lex.Space) and token.end >= pos): # decrease the indent state = tokeniter.state(block) current_indent = get_indent(block) new_indent = current_indent + direction * indent_vars['indent-width'] if state.mode() in ('lilypond', 'scheme'): computed_indent = compute_indent(block) if cmp(computed_indent, new_indent) == direction: new_indent = computed_indent diff = new_indent - current_indent with cursortools.compress_undo(cursor): for block in blocks: set_indent(block, get_indent(block) + diff) return True
def re_indent(cursor): """Re-indents the selected region or the whole document.""" if cursor.hasSelection(): blocks = cursortools.blocks(cursor) else: blocks = cursortools.all_blocks(cursor.document()) with cursortools.compress_undo(cursor): for block in blocks: tokeniter.update(block) if tokeniter.state(block).mode() in ('lilypond', 'scheme'): indent = compute_indent(block) else: indent = get_indent(block) if set_indent(block, indent): tokeniter.update(block) # force token update if changed
def get_blocks(cursor): """Yields all or the selected blocks.""" if cursor.hasSelection(): return cursortools.blocks(cursor) else: return cursortools.all_blocks(cursor.document())