public override bool Apply(Interfaces.IVimHost host) { string reg_text = _register.GetText(host); if (reg_text == null) { return false; } if (_register.IsTextLines) { string text = reg_text; for (int i = 0; i < (this.Repeat - 1); i++) { text = text + host.LineBreak + reg_text; } host.OpenLineBelow(); host.InsertTextAtCurrentPosition(text); } else { string text = ""; for (int i = 0; i < this.Repeat; i++) { text = text + reg_text; } host.CaretRight(); host.InsertTextAtCurrentPosition(text); } if (host.IsCurrentPositionAtEndOfLine()) { host.MoveToEndOfLine(); host.CaretLeft(); } return true; }
public override VimPoint Move(Interfaces.IVimHost host) { for (int i = 0; i < (this.Repeat - 1); i++) { host.CaretDown(); } host.MoveToEndOfLine(); host.CaretLeft(); return host.CurrentPosition; }
public override bool Apply(Interfaces.IVimHost host) { if (VimGlobalInfo.LastEdition != null) { for (int i = 0; i < this.Repeat; i++) { if (!VimGlobalInfo.LastEdition.Redo(host)) { return false; } } } if (host.IsCurrentPositionAtEndOfLine()) { host.MoveToEndOfLine(); host.CaretLeft(); } return true; }
public override bool Apply(Interfaces.IVimHost host) { // in yank, we need not to move cursor to new moved position VimPoint bak = host.CurrentPosition; VimPoint from = bak; VimPoint to = null; for (int i = 0; i < this.Repeat; i++) { to = this.Motion.Move(host); } VimSpan span = null; if (from.CompareTo(to) > 0) { span = new VimSpan(to, from); } else { span = new VimSpan(from, to); if (this.Motion is Interfaces.IVimMotionNextWord) { // "dw" on the last word of the line deletes to the end of the line if (host.IsCurrentPositionAtStartOfLineText()) { host.CaretUp(); host.MoveToEndOfLine(); span = new VimSpan(from, host.CurrentPosition); } } else if (this.Motion is Interfaces.IVimMotionEndOfWord) { span = span.GetClosedEnd(); } else if (this.Motion is Interfaces.IVimMotionEndOfLine) { // '$' in range edition is a close end span while range edition operates on open end spans, // so a manual compensation is needed span = span.GetClosedEnd(); } else if (this.Motion is Interfaces.IVimMotionSearchCharInLine) { span = span.GetClosedEnd(); } } if (this.Motion is Interfaces.IVimMotionSearchCharInLine) { if (span.Start.CompareTo(span.End) == 0) { // may be search successfully, but most of time, it reflects a failure, so do nothing for simplification // TODO can find a better way to handle this class of motion failure? return false; } } host.MoveCursor(bak); if (this.Motion is Interfaces.IVimMotionBetweenLines) { from = new VimPoint(span.Start.X, 0); to = host.GetLineEndPosition(span.End.X); span = new VimSpan(from, to); _register.Remember(host.GetText(span), true, host); } else { _register.Remember(host.GetText(span), false, host); } return true; }
public override bool Apply(Interfaces.IVimHost host) { VimPoint from = host.CurrentPosition; VimPoint to = null; for (int i = 0; i < this.Repeat; i++) { to = this.Motion.Move(host); } VimSpan span = null; if (from.CompareTo(to) > 0) { span = new VimSpan(to, from); } else { span = new VimSpan(from, to); if (this.Motion is Interfaces.IVimMotionNextWord) { if (host.IsCurrentPositionAtStartOfLineText()) { if (from.X < host.CurrentPosition.X) { // "dw" on the last word of the line deletes to the end of the line host.CaretUp(); host.MoveToEndOfLine(); if (from.CompareTo(host.CurrentPosition) >= 0) { // delete action begins at the line end // adjust the cursor to one left char before the end of the line host.CaretLeft(); return true; } span = new VimSpan(from, host.CurrentPosition); } } } else if (this.Motion is Interfaces.IVimMotionEndOfWord) { span = span.GetClosedEnd(); } else if (this.Motion is Interfaces.IVimMotionEndOfLine) { // '$' in range edition is a close end span while range edition operates on open end spans, // so a manual compensation is needed span = span.GetClosedEnd(); } else if (this.Motion is Interfaces.IVimMotionSearchCharInLine) { span = span.GetClosedEnd(); } } if (this.Motion is Interfaces.IVimMotionSearchCharInLine) { if (span.Start.CompareTo(span.End) == 0) { // may be search successfully, but most of time, it reflects a failure, so do nothing for simplification // TODO can find a better way to handle this class of motion failure? return false; } } if (this.Motion is IVimMotionBetweenLines) { VimRegister.YankLineToDefaultRegister(host, span); host.DeleteLineRange(span); } else { VimRegister.YankRangeToDefaultRegister(host, span); host.DeleteRange(span); } if (host.IsCurrentPositionAtEndOfLine()) { // adjust the cursor to one left char before the end of the line host.CaretLeft(); } return true; }
protected override void OnBeforeInsert(Interfaces.IVimHost host) { host.MoveToEndOfLine(); }