private void MovePrevious(bool extendSelection) { if (!extendSelection && !textView.Selection.IsEmpty) { textView.Selection.Select(textView.Selection.ActivePoint, textView.Selection.ActivePoint); } var caret = textView.Caret; if (caret.InVirtualSpace) { operations.MoveToEndOfLine(extendSelection); return; } var point = caret.Position.BufferPosition; if (point.Position == 0) { return; } if (point == caret.ContainingTextViewLine.Start) { operations.MoveLineUp(extendSelection); operations.MoveToLastNonWhiteSpaceCharacter(extendSelection); if (navigator.GetExtentOfWord(caret.Position.BufferPosition).IsSignificant) { operations.MoveToNextCharacter(extendSelection); } return; } var extent = navigator.GetExtentOfSubword(point - 1); if (extent == null) { return; } for (int i = point; i > extent.Value.Span.Start; i--) { operations.MoveToPreviousCharacter(extendSelection); } }