Change:
There is a command called "cursorUndo" (name in command palette: "Soft Undo") that undo's cursor and selection movements. There should be a matching "cursorRedo" (name in command palette: "Soft Redo") to redo those movements after undoing with "cursorUndo". VSCode Version: 1.38.1 OS: Windows
(Experimental duplicate detection) Thanks for submitting this issue. Please also check if it is already covered by an existing one, like: <!-- score: 0.504 --<!-- potentialduplicatescomment --
This issue is different than the suggested duplicates.
I am working on this. PR will be submitted soon.
Apologies , wrong place, problem with late night Github with too many wrokspaces open :) Please ignore
Cool cool but what does it have to do with my cursor redo feature request? Did you mean to report a new issue?

Discussion:
} } <del> export class CursorUndoController extends Disposable implements IEditorContribution { </del> <ins> export class CursorUndoRedoController extends Disposable implements IEditorContribution { </ins> <del> public static readonly ID = 'editor.contrib.cursorUndoController'; </del> <ins> public static readonly ID = 'editor.contrib.cursorUndoRedoController'; </ins> <del> public static get(editor: ICodeEditor): CursorUndoController { return editor.getContribution<CursorUndoController>(CursorUndoController.ID); </del> <ins> public static get(editor: ICodeEditor): CursorUndoRedoController { return editor.getContribution<CursorUndoRedoController>(CursorUndoRedoController.ID); </ins> } private readonly _editor: ICodeEditor; <del> private _isCursorUndo: boolean; </del> <ins> private _isCursorUndoRedo: boolean; </ins> private _undoStack: CursorState[]; <ins> private _redoStack: CursorState[]; </ins> private _prevState: CursorState | null; constructor(editor: ICodeEditor) { super(); this._editor = editor; <del> this._isCursorUndo = false; </del> <ins> this._isCursorUndoRedo = false; </ins> this._undoStack = []; <del> this._prevState = this._readState(); </del> <ins> this._redoStack = []; this._prevState = null; </ins> this._register(editor.onDidChangeModel((e) => { this._undoStack = []; <ins> this._redoStack = []; </ins> this._prevState = null; })); this._register(editor.onDidChangeModelContent((e) => { this._undoStack = []; <ins> this._redoStack = []; </ins> this._prevState = null; })); this._register(editor.onDidChangeCursorSelection((e) => { <del> if (!this._isCursorUndo && this._prevState) { this._undoStack.push(this._prevState); if (this._undoStack.length > 50) { // keep the cursor undo stack bounded this._undoStack.shift(); </del> <ins> const newState = new CursorState(this._editor.getSelections()!); if (!this._isCursorUndoRedo && this._prevState) { const isEqualToLastUndoStack = (this._undoStack.length > 0 && this._undoStack[this._undoStack.length - 1].equals(this._prevState)); if (!isEqualToLastUndoStack) { this._undoStack.push(this._prevState); this._redoStack = []; if (this._undoStack.length > 50) { // keep the cursor undo stack bounded this._undoStack.shift(); } </ins> } } <del> this._prevState = this._readState(); </del> <ins> this._prevState = newState; </ins> })); } <del> private _readState(): CursorState | null { if (!this._editor.hasModel()) { // no model => no state return null; </del> <ins> public cursorUndo(): void { if (!this._editor.hasModel() || this._undoStack.length === 0) { return; </ins> } <del> return new CursorState(this._editor.getSelections()); </del> <ins> this._redoStack.push(new CursorState(this._editor.getSelections())); this._applyState(this._undoStack.pop()!); </ins> } <del> public cursorUndo(): void { if (!this._editor.hasModel()) { </del> <ins> public cursorRedo(): void { if (!this._editor.hasModel() || this._redoStack.length === 0) { </ins> return; } <del> const currState = new CursorState(this._editor.getSelections()); while (this._undoStack.length > 0) { const prevState = this._undoStack.pop()!; </del> <ins> this._undoStack.push(new CursorState(this._editor.getSelections())); this._applyState(this._redoStack.pop()!); } </ins> <del> if (!prevState.equals(currState)) { this._isCursorUndo = true; this._editor.setSelections(prevState.selections); this._editor.revealRangeInCenterIfOutsideViewport(prevState.selections[0], ScrollType.Smooth); this._isCursorUndo = false; return; } } </del> <ins> private _applyState(state: CursorState): void { this._isCursorUndoRedo = true; this._editor.setSelections(state.selections); this._editor.revealRangeInCenterIfOutsideViewport(state.selections[0], ScrollType.Smooth); this._isCursorUndoRedo = false; </ins> } }

} public run(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { <del> CursorUndoController.get(editor).cursorUndo(); </del> <ins> CursorUndoRedoController.get(editor).cursorUndo(); } } export class CursorRedo extends EditorAction { constructor() { super({ id: 'cursorRedo', label: nls.localize('cursor.redo', "Soft Redo"), alias: 'Soft Redo', precondition: undefined }); } public run(accessor: ServicesAccessor, editor: ICodeEditor, args: any): void { CursorUndoRedoController.get(editor).cursorRedo(); </ins> } } <del> registerEditorContribution(CursorUndoController.ID, CursorUndoController); </del> <ins> registerEditorContribution(CursorUndoRedoController.ID, CursorUndoRedoController); </ins> registerEditorAction(CursorUndo); <ins> registerEditorAction(CursorRedo); </ins>