completer.py
44 lines
| 1.4 KiB
| text/x-python
|
PythonLexer
Omar Andres Zapata Mesa
|
r5584 | # -*- coding: utf-8 -*- | ||
import readline | ||||
Thomas Kluyver
|
r5596 | from Queue import Empty | ||
Thomas Kluyver
|
r5595 | |||
MinRK
|
r5600 | class ZMQCompleter(object): | ||
Omar Andres Zapata Mesa
|
r5584 | """Client-side completion machinery. | ||
How it works: self.complete will be called multiple times, with | ||||
state=0,1,2,... When state=0 it should compute ALL the completion matches, | ||||
and then return them for each value of state.""" | ||||
MinRK
|
r5600 | def __init__(self, shell, km): | ||
self.shell = shell | ||||
Omar Andres Zapata Mesa
|
r5584 | self.km = km | ||
self.matches = [] | ||||
def complete_request(self,text): | ||||
Omar Andres Zapata Mesa
|
r5585 | line = readline.get_line_buffer() | ||
Thomas Kluyver
|
r5597 | cursor_pos = readline.get_endidx() | ||
Omar Andres Zapata Mesa
|
r5585 | # send completion request to kernel | ||
# Give the kernel up to 0.5s to respond | ||||
MinRK
|
r5600 | msg_id = self.km.shell_channel.complete(text=text, line=line, | ||
Thomas Kluyver
|
r5597 | cursor_pos=cursor_pos) | ||
MinRK
|
r5600 | msg = self.km.shell_channel.get_msg(timeout=0.5) | ||
if msg['parent_header']['msg_id'] == msg_id: | ||||
return msg["content"]["matches"] | ||||
Thomas Kluyver
|
r5596 | return [] | ||
Omar Andres Zapata Mesa
|
r5584 | |||
MinRK
|
r5600 | def rlcomplete(self, text, state): | ||
Thomas Kluyver
|
r5595 | if state == 0: | ||
try: | ||||
self.matches = self.complete_request(text) | ||||
Thomas Kluyver
|
r5596 | except Empty: | ||
Thomas Kluyver
|
r5595 | print('WARNING: Kernel timeout on tab completion.') | ||
Thomas Kluyver
|
r5591 | try: | ||
return self.matches[state] | ||||
except IndexError: | ||||
return None | ||||
MinRK
|
r5600 | |||
def complete(self, text, line, cursor_pos=None): | ||||
return self.rlcomplete(text, 0) | ||||