Commit ecc4e072 authored by Terry Jan Reedy's avatar Terry Jan Reedy

Merge with 3.3

parents fbba73eb 1c70dddc
"Implement Idle Shell history mechanism with History class"
from idlelib.configHandler import idleConf from idlelib.configHandler import idleConf
class History: class 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, output_sep = "\n"): def __init__(self, text, output_sep = "\n"):
'''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 = text self.text = text
self.history = [] self.history = []
self.history_prefix = None self.prefix = None
self.history_pointer = None self.pointer = None
self.output_sep = output_sep self.output_sep = output_sep
self.cyclic = idleConf.GetOption("main", "History", "cyclic", 1, "bool") self.cyclic = idleConf.GetOption("main", "History", "cyclic", 1, "bool")
text.bind("<<history-previous>>", self.history_prev) text.bind("<<history-previous>>", self.history_prev)
text.bind("<<history-next>>", self.history_next) text.bind("<<history-next>>", self.history_next)
def history_next(self, event): def history_next(self, event):
self.history_do(0) "Fetch later statement; start with ealiest if cyclic."
self.fetch(reverse=False)
return "break" return "break"
def history_prev(self, event): def history_prev(self, event):
self.history_do(1) "Fetch earlier statement; start with most recent."
self.fetch(reverse=True)
return "break" return "break"
def _get_source(self, start, end): def _get_source(self, start, end):
...@@ -30,10 +48,11 @@ class History: ...@@ -30,10 +48,11 @@ class History:
output = self.output_sep.join(source.split("\n")) output = self.output_sep.join(source.split("\n"))
self.text.insert(where, output) self.text.insert(where, output)
def history_do(self, reverse): def fetch(self, reverse):
"Fetch statememt and enter into text at cursor."
nhist = len(self.history) nhist = len(self.history)
pointer = self.history_pointer pointer = self.pointer
prefix = self.history_prefix prefix = self.prefix
if pointer is not None and prefix is not None: if pointer is not None and prefix is not None:
if self.text.compare("insert", "!=", "end-1c") or \ if self.text.compare("insert", "!=", "end-1c") or \
self._get_source("iomark", "end-1c") != self.history[pointer]: self._get_source("iomark", "end-1c") != self.history[pointer]:
...@@ -41,10 +60,10 @@ class History: ...@@ -41,10 +60,10 @@ class History:
if pointer is None or prefix is None: if pointer is None or prefix is None:
prefix = self._get_source("iomark", "end-1c") prefix = self._get_source("iomark", "end-1c")
if reverse: if reverse:
pointer = nhist pointer = nhist # will be decremented
else: else:
if self.cyclic: if self.cyclic:
pointer = -1 pointer = -1 # will be incremented
else: else:
self.text.bell() self.text.bell()
return return
...@@ -72,10 +91,11 @@ class History: ...@@ -72,10 +91,11 @@ class History:
self.text.mark_set("insert", "end-1c") self.text.mark_set("insert", "end-1c")
self.text.see("insert") self.text.see("insert")
self.text.tag_remove("sel", "1.0", "end") self.text.tag_remove("sel", "1.0", "end")
self.history_pointer = pointer self.pointer = pointer
self.history_prefix = prefix self.prefix = prefix
def history_store(self, source): def store(self, source):
"Store Shell input statement into history list."
source = source.strip() source = source.strip()
if len(source) > 2: if len(source) > 2:
# avoid duplicates # avoid duplicates
...@@ -84,5 +104,5 @@ class History: ...@@ -84,5 +104,5 @@ class History:
except ValueError: except ValueError:
pass pass
self.history.append(source) self.history.append(source)
self.history_pointer = None self.pointer = None
self.history_prefix = None self.prefix = None
...@@ -1264,7 +1264,7 @@ class PyShell(OutputWindow): ...@@ -1264,7 +1264,7 @@ class PyShell(OutputWindow):
def resetoutput(self): def resetoutput(self):
source = self.text.get("iomark", "end-1c") source = self.text.get("iomark", "end-1c")
if self.history: if self.history:
self.history.history_store(source) self.history.store(source)
if self.text.get("end-2c") != "\n": if self.text.get("end-2c") != "\n":
self.text.insert("end-1c", "\n") self.text.insert("end-1c", "\n")
self.text.mark_set("iomark", "end-1c") self.text.mark_set("iomark", "end-1c")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment