public void StartMode()
        {
            foreach (TextLink link in links)
            {
                if (!link.PrimaryLink.IsInvalid)
                {
                    link.CurrentText = Editor.Document.GetTextAt(link.PrimaryLink.Offset + baseOffset, link.PrimaryLink.Length);
                }
                foreach (TextSegment segment in link.Links)
                {
                    Editor.Document.EnsureOffsetIsUnfolded(baseOffset + segment.Offset);
                    DocumentLine line = Editor.Document.GetLineByOffset(baseOffset + segment.Offset);
                    if (line.GetMarker(typeof(TextLinkMarker)) != null)
                    {
                        continue;
                    }
                    TextLinkMarker marker = (TextLinkMarker)line.GetMarker(typeof(TextLinkMarker));
                    if (marker == null)
                    {
                        marker            = new TextLinkMarker(this);
                        marker.BaseOffset = baseOffset;
                        Editor.Document.AddMarker(line, marker);
                        textLinkMarkers.Add(marker);
                    }
                }
            }

            editor.Document.BeforeUndoOperation += HandleEditorDocumentBeginUndo;
            Editor.Document.TextReplaced        += UpdateLinksOnTextReplace;
            this.Editor.Caret.PositionChanged   += HandlePositionChanged;
            this.UpdateTextLinks();
            this.HandlePositionChanged(null, null);
            TextLink firstLink = links.First(l => l.IsEditable);

            if (SelectPrimaryLink)
            {
                Setlink(firstLink);
            }
            Editor.Document.CommitUpdateAll();
            editor.Document.OptimizeTypedUndo();
            this.undoDepth = Editor.Document.GetCurrentUndoDepth();
            ShowHelpWindow();
        }