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