Changeset 391 for python/trunk/Lib/idlelib/IdleHistory.py
- Timestamp:
- Mar 19, 2014, 11:31:01 PM (11 years ago)
- Location:
- python/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
python/trunk
-
Property svn:mergeinfo
set to
/python/vendor/Python-2.7.6 merged eligible /python/vendor/current merged eligible
-
Property svn:mergeinfo
set to
-
python/trunk/Lib/idlelib/IdleHistory.py
r2 r391 1 from configHandler import idleConf 1 "Implement Idle Shell history mechanism with History class" 2 3 from idlelib.configHandler import idleConf 2 4 3 5 class History: 6 ''' Implement Idle Shell history mechanism. 4 7 5 def __init__(self, text, output_sep = "\n"): 8 store - Store source statement (called from PyShell.resetoutput). 9 fetch - Fetch stored statement matching prefix already entered. 10 history_next - Bound to <<history-next>> event (default Alt-N). 11 history_prev - Bound to <<history-prev>> event (default Alt-P). 12 ''' 13 def __init__(self, text): 14 '''Initialize data attributes and bind event methods. 15 16 .text - Idle wrapper of tk Text widget, with .bell(). 17 .history - source statements, possibly with multiple lines. 18 .prefix - source already entered at prompt; filters history list. 19 .pointer - index into history. 20 .cyclic - wrap around history list (or not). 21 ''' 6 22 self.text = text 7 23 self.history = [] 8 self.history_prefix = None 9 self.history_pointer = None 10 self.output_sep = output_sep 24 self.prefix = None 25 self.pointer = None 11 26 self.cyclic = idleConf.GetOption("main", "History", "cyclic", 1, "bool") 12 27 text.bind("<<history-previous>>", self.history_prev) … … 14 29 15 30 def history_next(self, event): 16 self.history_do(0) 31 "Fetch later statement; start with ealiest if cyclic." 32 self.fetch(reverse=False) 17 33 return "break" 18 34 19 35 def history_prev(self, event): 20 self.history_do(1) 36 "Fetch earlier statement; start with most recent." 37 self.fetch(reverse=True) 21 38 return "break" 22 39 23 def _get_source(self, start, end): 24 # Get source code from start index to end index. Lines in the 25 # text control may be separated by sys.ps2 . 26 lines = self.text.get(start, end).split(self.output_sep) 27 return "\n".join(lines) 40 def fetch(self, reverse): 41 '''Fetch statememt and replace current line in text widget. 28 42 29 def _put_source(self, where, source):30 output = self.output_sep.join(source.split("\n"))31 self.text.insert(where, output)32 33 def history_do(self, reverse):43 Set prefix and pointer as needed for successive fetches. 44 Reset them to None, None when returning to the start line. 45 Sound bell when return to start line or cannot leave a line 46 because cyclic is False. 47 ''' 34 48 nhist = len(self.history) 35 pointer = self. history_pointer36 prefix = self. history_prefix49 pointer = self.pointer 50 prefix = self.prefix 37 51 if pointer is not None and prefix is not None: 38 52 if self.text.compare("insert", "!=", "end-1c") or \ 39 self._get_source("iomark", "end-1c") != self.history[pointer]:53 self.text.get("iomark", "end-1c") != self.history[pointer]: 40 54 pointer = prefix = None 55 self.text.mark_set("insert", "end-1c") # != after cursor move 41 56 if pointer is None or prefix is None: 42 prefix = self. _get_source("iomark", "end-1c")57 prefix = self.text.get("iomark", "end-1c") 43 58 if reverse: 44 pointer = nhist 59 pointer = nhist # will be decremented 45 60 else: 46 61 if self.cyclic: 47 pointer = -1 48 else: 62 pointer = -1 # will be incremented 63 else: # abort history_next 49 64 self.text.bell() 50 65 return 51 66 nprefix = len(prefix) 52 67 while 1: 53 if reverse: 54 pointer = pointer - 1 55 else: 56 pointer = pointer + 1 68 pointer += -1 if reverse else 1 57 69 if pointer < 0 or pointer >= nhist: 58 70 self.text.bell() 59 if not self.cyclic and pointer < 0: 71 if not self.cyclic and pointer < 0: # abort history_prev 60 72 return 61 73 else: 62 if self. _get_source("iomark", "end-1c") != prefix:74 if self.text.get("iomark", "end-1c") != prefix: 63 75 self.text.delete("iomark", "end-1c") 64 self. _put_source("iomark", prefix)76 self.text.insert("iomark", prefix) 65 77 pointer = prefix = None 66 78 break … … 68 80 if item[:nprefix] == prefix and len(item) > nprefix: 69 81 self.text.delete("iomark", "end-1c") 70 self. _put_source("iomark", item)82 self.text.insert("iomark", item) 71 83 break 72 self.text.mark_set("insert", "end-1c")73 84 self.text.see("insert") 74 85 self.text.tag_remove("sel", "1.0", "end") 75 self. history_pointer = pointer76 self. history_prefix = prefix86 self.pointer = pointer 87 self.prefix = prefix 77 88 78 def history_store(self, source): 89 def store(self, source): 90 "Store Shell input statement into history list." 79 91 source = source.strip() 80 92 if len(source) > 2: … … 85 97 pass 86 98 self.history.append(source) 87 self.history_pointer = None 88 self.history_prefix = None 99 self.pointer = None 100 self.prefix = None 101 102 if __name__ == "__main__": 103 from test import test_support as support 104 support.use_resources = ['gui'] 105 from unittest import main 106 main('idlelib.idle_test.test_idlehistory', verbosity=2, exit=False)
Note:
See TracChangeset
for help on using the changeset viewer.