whole_func_string: function(ev) {
          var handled;
          /*
          var handled = keyboardManager.processKeyEvent(ev, this, {
              isCommandLine: true, isKeyUp: true
          });
          */
  
          // RETURN does a special exec/highlight thing
          if (ev.keyCode === keys.RETURN) {
              var worst = this.cli.getWorstHint();
              // Deny RETURN unless the command might work
              if (worst.status === Status.VALID) {
                  this.cli.exec();
                  this.element.value = '';
              }
              else {
                  // If we've denied RETURN because the command was not VALID,
                  // select the part of the command line that is causing problems
                  // TODO: if there are 2 errors are we picking the right one?
                  dom.setSelectionStart(this.element, worst.start);
                  dom.setSelectionEnd(this.element, worst.end);
              }
          }
  
          this.update();
  
          // Special actions which delegate to the assignment
          var current = this.cli.getAssignmentAt(dom.getSelectionStart(this.element));
          if (current) {
              // TAB does a special complete thing
              if (ev.keyCode === keys.TAB) {
                  current.complete();
                  this.update();
              }
  
              // UP/DOWN look for some history
              if (ev.keyCode === keys.UP) {
                  current.increment();
                  this.update();
              }
              if (ev.keyCode === keys.DOWN) {
                  current.decrement();
                  this.update();
              }
          }
  
          return handled;
      }
func_code_string: function(ev) {
          var handled;
          /*
          var handled = keyboardManager.processKeyEvent(ev, this, {
              isCommandLine: true, isKeyUp: true
          });
          */
  
          // RETURN does a special exec/highlight thing
          if (ev.keyCode === keys.RETURN) {
              var worst = this.cli.getWorstHint();
              // Deny RETURN unless the command might work
              if (worst.status === Status.VALID) {
                  this.cli.exec();
                  this.element.value = '';
              }
              else {
                  // If we've denied RETURN because the command was not VALID,
                  // select the part of the command line that is causing problems
                  // TODO: if there are 2 errors are we picking the right one?
                  dom.setSelectionStart(this.element, worst.start);
                  dom.setSelectionEnd(this.element, worst.end);
              }
          }
  
          this.update();
  
          // Special actions which delegate to the assignment
          var current = this.cli.getAssignmentAt(dom.getSelectionStart(this.element));
          if (current) {
              // TAB does a special complete thing
              if (ev.keyCode === keys.TAB) {
                  current.complete();
                  this.update();
              }
  
              // UP/DOWN look for some history
              if (ev.keyCode === keys.UP) {
                  current.increment();
                  this.update();
              }
              if (ev.keyCode === keys.DOWN) {
                  current.decrement();
                  this.update();
              }
          }
  
          return handled;
      }
func_documentation_string: The main keyboard processing loop