private void MoveCaretToNextTabStop() { while (CaretColumn % IndentSize != 0 && CaretCharIsASpace) { Caret.MoveToNextCaretPosition(); } Caret.EnsureVisible(); }
private void MoveCaretToPreviousTabStop() { Caret.MoveToPreviousCaretPosition(); while (CaretColumn % IndentSize != (IndentSize - 1) && CaretCharIsASpace) { Caret.MoveToPreviousCaretPosition(); } Caret.MoveToNextCaretPosition(); Caret.EnsureVisible(); }
private void MoveCaretToPreviousTabStop() { var caretStartingPosition = Caret.Position.VirtualBufferPosition; var caretStartingColumn = CaretColumn; Caret.MoveToPreviousCaretPosition(); var lastCaretColumn = -1; while (CaretColumn % IndentSize != (IndentSize - 1) && CaretCharIsASpace) { if (CaretColumn >= lastCaretColumn && lastCaretColumn != -1) { break; // Prevent infinite loop on first char of first line or in box selection } lastCaretColumn = CaretColumn; Caret.MoveToPreviousCaretPosition(); } if (Caret.Position.BufferPosition.Position != 0) { // Do this for all cases except the first char of the document Caret.MoveToNextCaretPosition(); } VirtualSnapshotPoint?caretNewPosition = Caret.Position.VirtualBufferPosition; int movedBy = caretStartingColumn - CaretColumn; if (movedBy % IndentSize != 0) { // We moved less than a full tab stop length. Only allow this if the cursor started in the middle of a full tab for (int i = 0; i < IndentSize; i++) { if (Caret.Position.BufferPosition.Add(i).GetChar() != ' ') { caretNewPosition = null; Caret.MoveTo(caretStartingPosition); // Do not align on non-exact tab stops break; } } if (caretNewPosition != null) { Caret.MoveTo(caretNewPosition.Value); // Go back to original new position } } Caret.EnsureVisible(); }
private void MoveCaretToNextTabStop() { var caretStartingPosition = Caret.Position.VirtualBufferPosition; var caretStartingColumn = CaretColumn; var lastCaretColumn = -1; while (CaretColumn % IndentSize != 0 && CaretCharIsASpace) { if (CaretColumn <= lastCaretColumn) { break; // Prevent infinite loop in box selection } lastCaretColumn = CaretColumn; Caret.MoveToNextCaretPosition(); } if (CaretColumn % IndentSize != 0) { Caret.MoveTo(caretStartingPosition); // Do not align on non-exact tab stops } Caret.EnsureVisible(); }
public override int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) { if (ConvertTabsToSpaces && TextView.Selection.IsEmpty && pguidCmdGroup == VSConstants.VSStd2K && !IsInAutomationFunction && !DisplayHelper.IsCompletionActive && !DisplayHelper.IsSignatureHelpActive ) { switch (nCmdID) { case ARROW_LEFT: case ARROW_RIGHT: if (CaretIsWithinCodeRange) { goto default; } break; case ARROW_UP: case ARROW_DOWN: Caret.PositionChanged -= CaretOnPositionChanged; if (!_savedCaretColumn.HasValue) { _savedCaretColumn = VirtualCaretColumn; } break; default: _savedCaretColumn = null; return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); } switch (nCmdID) { case ARROW_LEFT: Caret.MoveToPreviousCaretPosition(); if (CaretCharIsASpace) { MoveCaretToPreviousTabStop(); return(VSConstants.S_OK); } Caret.MoveToNextCaretPosition(); break; case ARROW_RIGHT: if (CaretCharIsASpace) { Caret.MoveToNextCaretPosition(); MoveCaretToNextTabStop(); return(VSConstants.S_OK); } break; case ARROW_UP: try { _snapshotLine = TextView.TextSnapshot.GetLineFromPosition( Caret.Position.BufferPosition.Subtract(CaretColumn + 1)); MoveCaretToNearestVirtualTabStop(); } catch (ArgumentOutOfRangeException) { } Caret.PositionChanged += CaretOnPositionChanged; return(VSConstants.S_OK); case ARROW_DOWN: try { _snapshotLine = FindNextLine(); MoveCaretToNearestVirtualTabStop(); } catch (ArgumentOutOfRangeException) { } Caret.PositionChanged += CaretOnPositionChanged; return(VSConstants.S_OK); } } return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); }
public override int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) { ThreadHelper.ThrowIfNotOnUIThread(); if (nCmdID < ARROW_LEFT || nCmdID > SHIFT_ARROW_DOWN || (!TextView.Selection.IsEmpty && TextView.Selection.Mode == TextSelectionMode.Box) || pguidCmdGroup != VSConstants.VSStd2K || IsInAutomationFunction || DisplayHelper.IsCompletionActive || DisplayHelper.IsSignatureHelpActive) { _savedCaretColumn = null; return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); } lock (_activeLock) { try { _isActive = true; switch (nCmdID) { case ARROW_LEFT: case ARROW_RIGHT: case SHIFT_ARROW_LEFT: case SHIFT_ARROW_RIGHT: if (CaretIsWithinCodeRange) { goto default; } break; case ARROW_UP: case ARROW_DOWN: case SHIFT_ARROW_UP: case SHIFT_ARROW_DOWN: _allowClearSavedCaretColumn = false; if (!_savedCaretColumn.HasValue) { _savedCaretColumn = VirtualCaretColumn; } break; default: _savedCaretColumn = null; ThreadHelper.ThrowIfNotOnUIThread(); return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); } var caretStartingPosition = Caret.Position.VirtualBufferPosition; var selectionAnchorPoint = TextView.Selection.IsEmpty ? caretStartingPosition : TextView.Selection.AnchorPoint; switch (nCmdID) { case ARROW_LEFT: case SHIFT_ARROW_LEFT: Caret.MoveToPreviousCaretPosition(); if (CaretCharIsASpace) { MoveCaretToPreviousTabStop(); AdjustTextSelection(nCmdID, selectionAnchorPoint); return(VSConstants.S_OK); } Caret.MoveToNextCaretPosition(); break; case ARROW_RIGHT: case SHIFT_ARROW_RIGHT: if (CaretCharIsASpace) { Caret.MoveToNextCaretPosition(); MoveCaretToNextTabStop(); AdjustTextSelection(nCmdID, selectionAnchorPoint); return(VSConstants.S_OK); } break; case ARROW_UP: case SHIFT_ARROW_UP: try { _snapshotLine = TextView.TextSnapshot.GetLineFromPosition( Caret.Position.BufferPosition.Subtract(CaretColumn + 1)); MoveCaretToNearestVirtualTabStop(); } catch (ArgumentOutOfRangeException) { } _allowClearSavedCaretColumn = true; AdjustTextSelection(nCmdID, selectionAnchorPoint); return(VSConstants.S_OK); case ARROW_DOWN: case SHIFT_ARROW_DOWN: try { _snapshotLine = FindNextLine(); MoveCaretToNearestVirtualTabStop(); } catch (ArgumentOutOfRangeException) { } _allowClearSavedCaretColumn = true; AdjustTextSelection(nCmdID, selectionAnchorPoint); return(VSConstants.S_OK); } return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); } finally { _isActive = false; } } }