##// END OF EJS Templates
Accepting suggestions with cursor in place and resume on backspace
krassowski -
Show More
@@ -357,6 +357,12 b' def create_ipython_shortcuts(shell, for_all_platforms: bool = False):'
357 kb.add("right", filter=has_suggestion & has_focus(DEFAULT_BUFFER))(
357 kb.add("right", filter=has_suggestion & has_focus(DEFAULT_BUFFER))(
358 auto_suggest.accept_character
358 auto_suggest.accept_character
359 )
359 )
360 kb.add("left", filter=has_suggestion & has_focus(DEFAULT_BUFFER))(
361 auto_suggest.accept_and_keep_cursor
362 )
363 kb.add("backspace", filter=has_suggestion & has_focus(DEFAULT_BUFFER))(
364 auto_suggest.backspace_and_resume_hint
365 )
360
366
361 # Simple Control keybindings
367 # Simple Control keybindings
362 key_cmd_dict = {
368 key_cmd_dict = {
@@ -37,6 +37,8 b' class NavigableAutoSuggestFromHistory(AutoSuggestFromHistory):'
37
37
38 def connect(self, pt_app: PromptSession):
38 def connect(self, pt_app: PromptSession):
39 self._connected_apps.append(pt_app)
39 self._connected_apps.append(pt_app)
40 # note: `on_text_changed` could be used for a bit different behaviour
41 # on character deletion (i.e. reseting history position on backspace)
40 pt_app.default_buffer.on_text_insert.add_handler(self.reset_history_position)
42 pt_app.default_buffer.on_text_insert.add_handler(self.reset_history_position)
41
43
42 def get_suggestion(
44 def get_suggestion(
@@ -113,35 +115,35 b' class NavigableAutoSuggestFromHistory(AutoSuggestFromHistory):'
113 # Needed for to accept autosuggestions in vi insert mode
115 # Needed for to accept autosuggestions in vi insert mode
114 def accept_in_vi_insert_mode(event: KeyPressEvent):
116 def accept_in_vi_insert_mode(event: KeyPressEvent):
115 """Apply autosuggestion if at end of line."""
117 """Apply autosuggestion if at end of line."""
116 b = event.current_buffer
118 buffer = event.current_buffer
117 d = b.document
119 d = buffer.document
118 after_cursor = d.text[d.cursor_position :]
120 after_cursor = d.text[d.cursor_position :]
119 lines = after_cursor.split("\n")
121 lines = after_cursor.split("\n")
120 end_of_current_line = lines[0].strip()
122 end_of_current_line = lines[0].strip()
121 suggestion = b.suggestion
123 suggestion = buffer.suggestion
122 if (suggestion is not None) and (suggestion.text) and (end_of_current_line == ""):
124 if (suggestion is not None) and (suggestion.text) and (end_of_current_line == ""):
123 b.insert_text(suggestion.text)
125 buffer.insert_text(suggestion.text)
124 else:
126 else:
125 nc.end_of_line(event)
127 nc.end_of_line(event)
126
128
127
129
128 def accept(event: KeyPressEvent):
130 def accept(event: KeyPressEvent):
129 """Accept autosuggestion"""
131 """Accept autosuggestion"""
130 b = event.current_buffer
132 buffer = event.current_buffer
131 suggestion = b.suggestion
133 suggestion = buffer.suggestion
132 if suggestion:
134 if suggestion:
133 b.insert_text(suggestion.text)
135 buffer.insert_text(suggestion.text)
134 else:
136 else:
135 nc.forward_char(event)
137 nc.forward_char(event)
136
138
137
139
138 def accept_word(event: KeyPressEvent):
140 def accept_word(event: KeyPressEvent):
139 """Fill partial autosuggestion by word"""
141 """Fill partial autosuggestion by word"""
140 b = event.current_buffer
142 buffer = event.current_buffer
141 suggestion = b.suggestion
143 suggestion = buffer.suggestion
142 if suggestion:
144 if suggestion:
143 t = re.split(r"(\S+\s+)", suggestion.text)
145 t = re.split(r"(\S+\s+)", suggestion.text)
144 b.insert_text(next((x for x in t if x), ""))
146 buffer.insert_text(next((x for x in t if x), ""))
145 else:
147 else:
146 nc.forward_word(event)
148 nc.forward_word(event)
147
149
@@ -154,6 +156,33 b' def accept_character(event: KeyPressEvent):'
154 b.insert_text(suggestion.text[0])
156 b.insert_text(suggestion.text[0])
155
157
156
158
159 def accept_and_keep_cursor(event: KeyPressEvent):
160 """Accept autosuggestion and keep cursor in place"""
161 buffer = event.current_buffer
162 old_position = buffer.cursor_position
163 suggestion = buffer.suggestion
164 if suggestion:
165 buffer.insert_text(suggestion.text)
166 buffer.cursor_position = old_position
167 else:
168 nc.backward_char(event)
169
170
171 def backspace_and_resume_hint(event: KeyPressEvent):
172 """Resume autosuggestions after deleting last character"""
173 current_buffer = event.current_buffer
174
175 def resume_hinting(buffer: Buffer):
176 if buffer.auto_suggest:
177 suggestion = buffer.auto_suggest.get_suggestion(buffer, buffer.document)
178 if suggestion:
179 buffer.suggestion = suggestion
180 current_buffer.on_text_changed.remove_handler(resume_hinting)
181
182 current_buffer.on_text_changed.add_handler(resume_hinting)
183 nc.backward_delete_char(event)
184
185
157 def accept_token(event: KeyPressEvent):
186 def accept_token(event: KeyPressEvent):
158 """Fill partial autosuggestion by token"""
187 """Fill partial autosuggestion by token"""
159 b = event.current_buffer
188 b = event.current_buffer
General Comments 0
You need to be logged in to leave comments. Login now