public override VimPoint Move(Interfaces.IVimHost host) { if (host.IsCurrentPositionAtEndOfLine()) { return host.CurrentPosition; } VimPoint bak = host.CurrentPosition; for (int i = 0; i < this.Repeat; i++) { do { if (host.IsCurrentPositionAtEndOfLine()) { host.MoveCursor(bak); return host.CurrentPosition; } host.CaretRight(); char ch = host.GetCharAtCurrentPosition(); if (ch == _toSearch) { break; } } while (true); } return host.CurrentPosition; }
public override VimPoint Move(Interfaces.IVimHost host) { if (host.IsCurrentPositionAtStartOfDocument()) { return host.CurrentPosition; } VimPoint start_pos = host.CurrentPosition; VimPoint pos = null; for (int i = 0; i < this.Repeat; i++) { if (!host.FindLeftBrace(start_pos, out pos)) { return host.CurrentPosition; } start_pos = pos; } host.GotoLine(pos.X); host.MoveCursor(pos); return host.CurrentPosition; }
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; }