protected override void OnBeforeInsert(Interfaces.IVimHost host) { VimPoint from = host.CurrentPosition; // when cursor is at the end of line, nothing to delete if (from.Y == host.CurrentLineEndPosition.Y) { return; } VimPoint to = new VimPoint(from.X, Math.Min(from.Y + this.Repeat - 1, host.CurrentLineEndPosition.Y - 1)); VimSpan span = new VimSpan(from, to).GetClosedEnd(); VimRegister.YankRangeToDefaultRegister(host, span); host.DeleteRange(span); }
public override bool Apply(Interfaces.IVimHost host) { if (host.IsCurrentPositionAtEndOfLine()) { return true; } VimPoint from = host.CurrentPosition; VimPoint to = new VimPoint(from.X, Math.Min(from.Y + this.Repeat - 1, host.CurrentLineEndPosition.Y - 1)); VimSpan span = new VimSpan(from, to).GetClosedEnd(); VimRegister.YankRangeToDefaultRegister(host, span); host.DeleteRange(span); 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; }