Example #1
0
    def readBinding(self, keys, local=None, block=True):
        """
        :type keys: pyjline.keymap.KeyMap
        :type local: pyjline.keymap.KeyMap
        :type block: bool
        """
        self.lastBinding = None
        
        o = None
        remaining = [0]

        while True:

            c  = self.readCharacter()
            if c == -1:
                return None
            self.opBuffer.appendCodePoint(c)

            if (not (local is None)):
                o = local.getBound(self.opBuffer, remaining)
            if ((o is None) and ((local is None) or (remaining[0] >= 0))):
                o = keys.getBound(self.opBuffer, remaining)

            if (not (o is None)):
                if (remaining[0] >= 0):
                    opblen = self.opBuffer.length() - remaining[0]
                    self.runMacro(self.opBuffer.substring(opblen))
                    self.opBuffer.setLength(opblen)
                else:
                    ambiguousTimeout = keys.getAmbigousTimeout()
                    if (ambiguousTimeout > 0 and self.peekCharacter(ambiguousTimeout) != NonBlockingReader.READ_EXPIRED):
                        o = None
                if (not (o is None)):
                    self.lastBinding = self.opBuffer.toString()
                    self.opBuffer.setLength(0)
                    return o
            elif (remaining[0] > 0):
                cp = self.opBuffer.codePointAt(0)
                rem = self.opBuffer.substring(Character.charCount(cp))
                self.lastBinding = self.opBuffer.substring(0, Character.charCount(cp))
                o = keys.getUnicode() if (cp >= KeyMap.KEYMAP_LENGTH) else keys.getNomatch()
                self.opBuffer.setLength(0)
                self.opBuffer.append(rem)
                if (not (o is None)):
                    return o

            if block:
                break