Example #1
0
        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());
        }
Example #2
0
        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();
        }
Example #3
0
        /// <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;
                }
            }
        }