         else
           throw error
 
-    unless @peekTop().isComplete()
+    if @peekTop().isComplete()
+      @inspect()
+      debug '-> @pop()'
+      op = @pop()
+      debug " -> <#{op.getKind()}>.execute()"
+      op.execute()
+
+      @vimState.recordOperation(op) if op.isRecordable()
+      @finish()
+      debug "#=== Finish at #{new Date().toISOString()}\n"
+    else
       if @vimState.isMode('normal') and @peekTop().isOperator?()
         @inspect()
         debug '-> @process(): activating: operator-pending-mode'


    # Use implicit Select operator as operator.
    if @vimState.isMode('visual') and _.isFunction(op.select)
      debug "push IMPLICIT Operator.Select"
      @stack.push(new Select(@vimState))

    debug "pushing <#{op.getKind()}>"
    @stack.push op

    # Operate on implicit CurrentSelection TextObject.
    if @vimState.isMode('visual') and op.isOperator()
      debug "push IMPLICIT Motion.CurrentSelection"
      @stack.push(new CurrentSelection(@vimState))

    @withLock =>
      @process()

  withLock: (fn) ->
    try
      @processing = true
      fn()
    finally
      @processing = false



  inspect: ->
    @vimState.developer?.inspectOperationStack()

module.exports = OperationStack
