import { App, Editor, EditorChange, EditorTransaction, MarkdownFileInfo, MarkdownView } from 'obsidian' import BindThemPlugin from './main' import { Direction } from './Entities' import { selectionToRange } from './Utils' /** * DirectionalMove provides commands to move selection content left or right */ export class DirectionalMove { public app: App private plugin: BindThemPlugin constructor(app: App, plugin: BindThemPlugin) { this.app = app this.plugin = plugin } /** * Move the current selection(s) in the specified direction (left or right) */ public directionalMove( editor: Editor, view: MarkdownView | MarkdownFileInfo, direction: Direction.Left | Direction.Right ): void { const selections = editor.listSelections() const changes: Array = [] for (const selection of selections) { const range = selectionToRange(selection) let additionChange: EditorChange let deletionChange: EditorChange switch (direction) { case Direction.Left: { deletionChange = { from: { line: range.from.line, ch: range.from.ch - 1, }, to: range.from, text: '', } additionChange = { from: range.to, to: range.to, text: editor.getRange(deletionChange.from, deletionChange.to!), } break } case Direction.Right: { deletionChange = { from: range.to, to: { line: range.to.line, ch: range.to.ch + 1, }, text: '', } additionChange = { from: range.from, to: range.from, text: editor.getRange(deletionChange.from, deletionChange.to!), } break } } changes.push(deletionChange, additionChange) } const transaction: EditorTransaction = { changes: changes, } const origin = 'DirectionalMove_' + String(direction) editor.transaction(transaction, origin) } }