public void SwitchPreviousMode_EnterLeaveOrder() { var normal = CreateAndAddNormalMode(); var insert = CreateAndAddInsertMode(); normal.Setup(x => x.OnEnter(ModeArgument.None)).Verifiable(); _vimBuffer.SwitchMode(ModeKind.Normal, ModeArgument.None); normal.Verify(); normal.Setup(x => x.OnLeave()); insert.Setup(x => x.OnEnter(ModeArgument.None)); _vimBuffer.SwitchMode(ModeKind.Insert, ModeArgument.None); normal.Verify(); insert.Verify(); insert.Setup(x => x.OnLeave()).Verifiable(); var prev = _vimBuffer.SwitchPreviousMode(); Assert.AreSame(normal.Object, prev); insert.Verify(); // On tear down all IVimBuffer instances are closed as well as their active // IMode. Need a setup here insert.Setup(x => x.OnClose()); normal.Setup(x => x.OnClose()); }
public void SwitchPreviousMode_EnterLeaveOrder() { var normal = CreateAndAddNormalMode(); var insert = CreateAndAddInsertMode(); normal.Setup(x => x.OnEnter(ModeArgument.None)).Verifiable(); _buffer.SwitchMode(ModeKind.Normal, ModeArgument.None); normal.Verify(); normal.Setup(x => x.OnLeave()); insert.Setup(x => x.OnEnter(ModeArgument.None)); _buffer.SwitchMode(ModeKind.Insert, ModeArgument.None); normal.Verify(); insert.Verify(); insert.Setup(x => x.OnLeave()).Verifiable(); var prev = _buffer.SwitchPreviousMode(); Assert.AreSame(normal.Object, prev); insert.Verify(); }
/// <summary> /// Check and see if we should end an external edit operation. /// We are already in an external edit then we need to check all tags to determine /// if we should be leaving the external edit or not. Else we only check tags when /// we're in an external edit for markers, there are no tags and we bail out /// incorrectly /// </summary> private void CheckForExternalEditEnd() { Contract.Assert(_vimBuffer.ModeKind == ModeKind.ExternalEdit); Contract.Assert(_ignoredExternalEditSpans.Count == 0); // If the monitor didn't initiate the external edit then we don't control it. Back // off and let the owner deal with it if (!_controlExternalEdit) { return; } if (GetAnyExternalEditActive()) { return; } var externalEditSpans = GetExternalEditSpans(CheckKind.All); if (externalEditSpans.Count == 0) { // If we're in an external edit and all of the markers leave // then transition back to the previous mode. Make sure to // mark we are doing this so that we avoid double caching // certain values. _leavingExternalEdit = true; try { _vimBuffer.SwitchPreviousMode(); } finally { _leavingExternalEdit = false; } } }