##// END OF EJS Templates
Merge pull request #7502 from blink1073/console-cursor-end...
Min RK -
r20024:6857643d merge
parent child Browse files
Show More
@@ -1,69 +1,74 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Adapt readline completer interface to make ZMQ request."""
2 """Adapt readline completer interface to make ZMQ request."""
3
3
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7 try:
7 try:
8 from queue import Empty # Py 3
8 from queue import Empty # Py 3
9 except ImportError:
9 except ImportError:
10 from Queue import Empty # Py 2
10 from Queue import Empty # Py 2
11
11
12 from IPython.config import Configurable
12 from IPython.config import Configurable
13 from IPython.core.completer import IPCompleter
13 from IPython.core.completer import IPCompleter
14 from IPython.utils.traitlets import Float
14 from IPython.utils.traitlets import Float
15 import IPython.utils.rlineimpl as readline
15 import IPython.utils.rlineimpl as readline
16
16
17 class ZMQCompleter(IPCompleter):
17 class ZMQCompleter(IPCompleter):
18 """Client-side completion machinery.
18 """Client-side completion machinery.
19
19
20 How it works: self.complete will be called multiple times, with
20 How it works: self.complete will be called multiple times, with
21 state=0,1,2,... When state=0 it should compute ALL the completion matches,
21 state=0,1,2,... When state=0 it should compute ALL the completion matches,
22 and then return them for each value of state."""
22 and then return them for each value of state."""
23
23
24 timeout = Float(5.0, config=True, help='timeout before completion abort')
24 timeout = Float(5.0, config=True, help='timeout before completion abort')
25
25
26 def __init__(self, shell, client, config=None):
26 def __init__(self, shell, client, config=None):
27 super(ZMQCompleter,self).__init__(config=config)
27 super(ZMQCompleter,self).__init__(config=config)
28
28
29 self.shell = shell
29 self.shell = shell
30 self.client = client
30 self.client = client
31 self.matches = []
31 self.matches = []
32 # don't do any splitting client-side,
32 # don't do any splitting client-side,
33 # rely on the kernel for that
33 # rely on the kernel for that
34 self.splitter.delims = '\r\n'
34 self.splitter.delims = '\r\n'
35 if self.readline:
35 if self.readline:
36 self.readline.set_completer_delims('\r\n')
36 self.readline.set_completer_delims('\r\n')
37
37
38 def complete_request(self, text):
38 def complete_request(self, text):
39 line = readline.get_line_buffer()
39 line = readline.get_line_buffer()
40 cursor_pos = readline.get_endidx()
40 cursor_pos = readline.get_endidx()
41
41
42 # send completion request to kernel
42 # send completion request to kernel
43 # Give the kernel up to 5s to respond
43 # Give the kernel up to 5s to respond
44 msg_id = self.client.complete(
44 msg_id = self.client.complete(
45 code=line,
45 code=line,
46 cursor_pos=cursor_pos,
46 cursor_pos=cursor_pos,
47 )
47 )
48
48
49 msg = self.client.shell_channel.get_msg(timeout=self.timeout)
49 msg = self.client.shell_channel.get_msg(timeout=self.timeout)
50 if msg['parent_header']['msg_id'] == msg_id:
50 if msg['parent_header']['msg_id'] == msg_id:
51 cursor_start = msg['content']['cursor_start']
51 content = msg['content']
52 return [ line[:cursor_start] + m for m in msg['content']['matches'] ]
52 cursor_start = content['cursor_start']
53 matches = [ line[:cursor_start] + m for m in content['matches'] ]
54 if content["cursor_end"] < cursor_pos:
55 extra = line[content["cursor_end"]: cursor_pos]
56 matches = [m + extra for m in matches]
57 return matches
53 return []
58 return []
54
59
55 def rlcomplete(self, text, state):
60 def rlcomplete(self, text, state):
56 if state == 0:
61 if state == 0:
57 try:
62 try:
58 self.matches = self.complete_request(text)
63 self.matches = self.complete_request(text)
59 except Empty:
64 except Empty:
60 #print('WARNING: Kernel timeout on tab completion.')
65 #print('WARNING: Kernel timeout on tab completion.')
61 pass
66 pass
62
67
63 try:
68 try:
64 return self.matches[state]
69 return self.matches[state]
65 except IndexError:
70 except IndexError:
66 return None
71 return None
67
72
68 def complete(self, text, line, cursor_pos=None):
73 def complete(self, text, line, cursor_pos=None):
69 return self.rlcomplete(text, 0)
74 return self.rlcomplete(text, 0)
General Comments 0
You need to be logged in to leave comments. Login now