[code.view]

[top] / python / PyMOTW / readline / readline_buffer.py

     #!/usr/bin/env python
     # encoding: utf-8
     #
     # Copyright (c) 2008 Doug Hellmann All rights reserved.
     #
     """
     """
     
     __version__ = "$Id$"
     #end_pymotw_header
     
     import readline
     import logging
     
     LOG_FILENAME = '/tmp/completer.log'
     logging.basicConfig(filename=LOG_FILENAME,
                         level=logging.DEBUG,
                         )
     
     class BufferAwareCompleter(object):
         
         def __init__(self, options):
             self.options = options
             self.current_candidates = []
             return
     
         def complete(self, text, state):
             response = None
             if state == 0:
                 # This is the first time for this text, so build a match list.
                 
                 origline = readline.get_line_buffer()
                 begin = readline.get_begidx()
                 end = readline.get_endidx()
                 being_completed = origline[begin:end]
                 words = origline.split()
     
                 logging.debug('origline=%s', repr(origline))
                 logging.debug('begin=%s', begin)
                 logging.debug('end=%s', end)
                 logging.debug('being_completed=%s', being_completed)
                 logging.debug('words=%s', words)
                 
                 if not words:
                     self.current_candidates = sorted(self.options.keys())
                 else:
                     try:
                         if begin == 0:
                             # first word
                             candidates = self.options.keys()
                         else:
                             # later word
                             first = words[0]
                             candidates = self.options[first]
                         
                         if being_completed:
                             # match options with portion of input
                             # being completed
                             self.current_candidates = [ w for w in candidates
                                                         if w.startswith(being_completed) ]
                         else:
                             # matching empty string so use all candidates
                             self.current_candidates = candidates
     
                         logging.debug('candidates=%s', self.current_candidates)
                         
                     except (KeyError, IndexError), err:
                         logging.error('completion error: %s', err)
                         self.current_candidates = []
             
             try:
                 response = self.current_candidates[state]
             except IndexError:
                 response = None
             logging.debug('complete(%s, %s) => %s', repr(text), state, response)
             return response
                 
     
     def input_loop():
         line = ''
         while line != 'stop':
             line = raw_input('Prompt ("stop" to quit): ')
             print 'Dispatch %s' % line
     
     # Register our completer function
     readline.set_completer(BufferAwareCompleter(
         {'list':['files', 'directories'],
          'print':['byname', 'bysize'],
          'stop':[],
         }).complete)
     
     # Use the tab key for completion
     readline.parse_and_bind('tab: complete')
     
     # Prompt the user for text
     input_loop()
     

[top] / python / PyMOTW / readline / readline_buffer.py

contact | logmethods.com