internal override void Execute(EmacsCommandContext context) { ITextSelection selection = context.TextView.Selection; ClipboardRing ring = context.Manager.ClipboardRing; if (!ring.IsEmpty) { ITrackingSpan preInsertionSelectionSpan = null; if (!selection.IsEmpty) { // Currently only support stream selection if (selection.Mode == TextSelectionMode.Stream) { preInsertionSelectionSpan = context.TextView.TextSnapshot.CreateTrackingSpan(selection.StreamSelectionSpan.SnapshotSpan, SpanTrackingMode.EdgeInclusive); } else { selection.Clear(); } } else { preInsertionSelectionSpan = context.TextView.TextSnapshot.CreateTrackingSpan(new Span(selection.AnchorPoint.Position, 0), SpanTrackingMode.EdgeInclusive); } context.EditorOperations.ReplaceSelection(ring.GetNext()); // Select newly inserted text SnapshotSpan newSelectionRange = preInsertionSelectionSpan.GetSpan(context.TextView.TextSnapshot); context.EditorOperations.SelectAndMoveCaret(new VirtualSnapshotPoint(newSelectionRange.Start), new VirtualSnapshotPoint(newSelectionRange.End)); } }
internal void OnTextCopied(TextEventArgs e) { // [DIGITALRUNE] Add text to clipboard ring. ClipboardRing.Add(e.Text); if (TextCopied != null) { TextCopied(this, e); } }
public void Execute(ITextView view, IEmacsCommandMetadata metadata, bool evaluateUniversalArgument = true) { try { changes = new StringBuilder(); view.TextBuffer.Changed += OnTextBufferChanged; EmacsCommand command = CreateCommand(metadata); EmacsCommand emacsCommand = null; IEmacsCommandMetadata metadata1 = null; var context = new EmacsCommandContext(this, TextStructureNavigatorSelectorService, EditorOperationsFactoryService.GetEditorOperations(view), view, CommandRouterProvider.GetCommandRouter(view)); if (ClipboardRing.Count == 0 || ClipboardRing.Last() != Clipboard.GetText()) { ClipboardRing.Add(Clipboard.GetText()); } if (command == null) { return; } ITextUndoHistory history = TextUndoHistoryRegistry.GetHistory(context.TextBuffer); using (ITextUndoTransaction transaction = CreateTransaction(metadata, history)) { int num = 1; bool flag = false; if (evaluateUniversalArgument) { flag = GetUniversalArgumentOrDefault(0) < 0; if (flag) { metadata1 = GetCommandMetadata(metadata.InverseCommand); emacsCommand = CreateCommand(metadata1); } if (metadata.CanBeRepeated) { num = Math.Abs(GetUniversalArgumentOrDefault(1)); } } for (; num > 0; --num) { if (flag) { if (emacsCommand != null) { emacsCommand.Execute(context); } else { command.ExecuteInverse(context); } } else { command.Execute(context); } } if (transaction != null) { transaction.Complete(); } if (context.Clipboard.Length > 0) { ClipboardRing.Add(context.Clipboard.ToString()); Clipboard.SetText(context.Clipboard.ToString()); } else if (changes.Length > 0 && metadata.CopyDeletedTextToTheClipboard) { ClipboardRing.Add(changes.ToString()); Clipboard.SetText(changes.ToString()); } LastExecutedCommand = flag ? metadata1 : metadata; } } catch (NoOperationException ex) { } finally { view.TextBuffer.Changed -= OnTextBufferChanged; } }