Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Lib/idlelib/IdleHistory.py

    r2 r391  
    1 from configHandler import idleConf
     1"Implement Idle Shell history mechanism with History class"
     2
     3from idlelib.configHandler import idleConf
    24
    35class History:
     6    ''' Implement Idle Shell history mechanism.
    47
    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        '''
    622        self.text = text
    723        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
    1126        self.cyclic = idleConf.GetOption("main", "History", "cyclic", 1, "bool")
    1227        text.bind("<<history-previous>>", self.history_prev)
     
    1429
    1530    def history_next(self, event):
    16         self.history_do(0)
     31        "Fetch later statement; start with ealiest if cyclic."
     32        self.fetch(reverse=False)
    1733        return "break"
    1834
    1935    def history_prev(self, event):
    20         self.history_do(1)
     36        "Fetch earlier statement; start with most recent."
     37        self.fetch(reverse=True)
    2138        return "break"
    2239
    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.
    2842
    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        '''
    3448        nhist = len(self.history)
    35         pointer = self.history_pointer
    36         prefix = self.history_prefix
     49        pointer = self.pointer
     50        prefix = self.prefix
    3751        if pointer is not None and prefix is not None:
    3852            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]:
    4054                pointer = prefix = None
     55                self.text.mark_set("insert", "end-1c")  # != after cursor move
    4156        if pointer is None or prefix is None:
    42             prefix = self._get_source("iomark", "end-1c")
     57            prefix = self.text.get("iomark", "end-1c")
    4358            if reverse:
    44                 pointer = nhist
     59                pointer = nhist  # will be decremented
    4560            else:
    4661                if self.cyclic:
    47                     pointer = -1
    48                 else:
     62                    pointer = -1  # will be incremented
     63                else:  # abort history_next
    4964                    self.text.bell()
    5065                    return
    5166        nprefix = len(prefix)
    5267        while 1:
    53             if reverse:
    54                 pointer = pointer - 1
    55             else:
    56                 pointer = pointer + 1
     68            pointer += -1 if reverse else 1
    5769            if pointer < 0 or pointer >= nhist:
    5870                self.text.bell()
    59                 if not self.cyclic and pointer < 0:
     71                if not self.cyclic and pointer < 0:  # abort history_prev
    6072                    return
    6173                else:
    62                     if self._get_source("iomark", "end-1c") != prefix:
     74                    if self.text.get("iomark", "end-1c") != prefix:
    6375                        self.text.delete("iomark", "end-1c")
    64                         self._put_source("iomark", prefix)
     76                        self.text.insert("iomark", prefix)
    6577                    pointer = prefix = None
    6678                break
     
    6880            if item[:nprefix] == prefix and len(item) > nprefix:
    6981                self.text.delete("iomark", "end-1c")
    70                 self._put_source("iomark", item)
     82                self.text.insert("iomark", item)
    7183                break
    72         self.text.mark_set("insert", "end-1c")
    7384        self.text.see("insert")
    7485        self.text.tag_remove("sel", "1.0", "end")
    75         self.history_pointer = pointer
    76         self.history_prefix = prefix
     86        self.pointer = pointer
     87        self.prefix = prefix
    7788
    78     def history_store(self, source):
     89    def store(self, source):
     90        "Store Shell input statement into history list."
    7991        source = source.strip()
    8092        if len(source) > 2:
     
    8597                pass
    8698            self.history.append(source)
    87         self.history_pointer = None
    88         self.history_prefix = None
     99        self.pointer = None
     100        self.prefix = None
     101
     102if __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.