docs: def _process_keyevent(self, keyinfo):
          u"""return True when line is final
          """
          #Process exit keys. Only exit on empty line
          log(u"_process_keyevent <%s>"%keyinfo)
  
          def nop(e):
              pass
          if self.next_meta:
              self.next_meta = False
              keyinfo.meta = True
          keytuple = keyinfo.tuple()
  
          if self._insert_verbatim:
              self.insert_text(keyinfo)
              self._insert_verbatim = False
              self.argument = 0
              return False
  
          if keytuple in self.exit_dispatch:
              pars = (self.l_buffer, lineobj.EndOfLine(self.l_buffer))
              log(u"exit_dispatch:<%s, %s>"%pars)
              if lineobj.EndOfLine(self.l_buffer) == 0:
                  raise EOFError
          if keyinfo.keyname or keyinfo.control or keyinfo.meta:
              default = nop
          else:
              default = self.self_insert
          dispatch_func = self.key_dispatch.get(keytuple, default)
  
          log(u"readline from keyboard:<%s,%s>"%(keytuple, dispatch_func))
  
          r = None
          if dispatch_func:
              r = dispatch_func(keyinfo)
              self._keylog(dispatch_func, self.l_buffer)
              self.l_buffer.push_undo()
  
          self.previous_func = dispatch_func
          return r