"Implement Idle Shell history mechanism with History class"from idlelib.config import idleConfclass History:''' Implement Idle Shell history mechanism.store - Store source statement (called from pyshell.resetoutput).fetch - Fetch stored statement matching prefix already entered.history_next - Bound to <<history-next>> event (default Alt-N).history_prev - Bound to <<history-prev>> event (default Alt-P).'''def __init__(self, text):'''Initialize data attributes and bind event methods..text - Idle wrapper of tk Text widget, with .bell()..history - source statements, possibly with multiple lines..prefix - source already entered at prompt; filters history list..pointer - index into history..cyclic - wrap around history list (or not).'''self.text = textself.history = []self.prefix = Noneself.pointer = Noneself.cyclic = idleConf.GetOption("main", "History", "cyclic", 1, "bool")text.bind("<<history-previous>>", self.history_prev)text.bind("<<history-next>>", self.history_next)def history_next(self, event):"Fetch later statement; start with ealiest if cyclic."self.fetch(reverse=False)return "break"def history_prev(self, event):"Fetch earlier statement; start with most recent."self.fetch(reverse=True)return "break"def fetch(self, reverse):'''Fetch statement and replace current line in text widget.Set prefix and pointer as needed for successive fetches.Reset them to None, None when returning to the start line.Sound bell when return to start line or cannot leave a linebecause cyclic is False.'''nhist = len(self.history)pointer = self.pointerprefix = self.prefixif pointer is not None and prefix is not None:if self.text.compare("insert", "!=", "end-1c") or \self.text.get("iomark", "end-1c") != self.history[pointer]:pointer = prefix = Noneself.text.mark_set("insert", "end-1c") # != after cursor moveif pointer is None or prefix is None:prefix = self.text.get("iomark", "end-1c")if reverse:pointer = nhist # will be decrementedelse:if self.cyclic:pointer = -1 # will be incrementedelse: # abort history_nextself.text.bell()returnnprefix = len(prefix)while 1:pointer += -1 if reverse else 1if pointer < 0 or pointer >= nhist:self.text.bell()if not self.cyclic and pointer < 0: # abort history_prevreturnelse:if self.text.get("iomark", "end-1c") != prefix:self.text.delete("iomark", "end-1c")self.text.insert("iomark", prefix)pointer = prefix = Nonebreakitem = self.history[pointer]if item[:nprefix] == prefix and len(item) > nprefix:self.text.delete("iomark", "end-1c")self.text.insert("iomark", item)breakself.text.see("insert")self.text.tag_remove("sel", "1.0", "end")self.pointer = pointerself.prefix = prefixdef store(self, source):"Store Shell input statement into history list."source = source.strip()if len(source) > 2:# avoid duplicatestry:self.history.remove(source)except ValueError:passself.history.append(source)self.pointer = Noneself.prefix = Noneif __name__ == "__main__":from unittest import mainmain('idlelib.idle_test.test_history', verbosity=2, exit=False)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。