Show More
@@ -279,7 +279,8 b' AUTO_SUGGEST_BINDINGS = [' | |||||
279 | ["right"], |
|
279 | ["right"], | |
280 | "is_cursor_at_the_end_of_line" |
|
280 | "is_cursor_at_the_end_of_line" | |
281 | " & default_buffer_focused" |
|
281 | " & default_buffer_focused" | |
282 |
" & emacs_like_insert_mode" |
|
282 | " & emacs_like_insert_mode" | |
|
283 | " & pass_through", | |||
283 | ), |
|
284 | ), | |
284 | ] |
|
285 | ] | |
285 |
|
286 |
@@ -20,6 +20,8 b' from prompt_toolkit.layout.processors import (' | |||||
20 | from IPython.core.getipython import get_ipython |
|
20 | from IPython.core.getipython import get_ipython | |
21 | from IPython.utils.tokenutil import generate_tokens |
|
21 | from IPython.utils.tokenutil import generate_tokens | |
22 |
|
22 | |||
|
23 | from .filters import pass_through | |||
|
24 | ||||
23 |
|
25 | |||
24 | def _get_query(document: Document): |
|
26 | def _get_query(document: Document): | |
25 | return document.lines[document.cursor_position_row] |
|
27 | return document.lines[document.cursor_position_row] | |
@@ -267,7 +269,10 b' def backspace_and_resume_hint(event: KeyPressEvent):' | |||||
267 |
|
269 | |||
268 | def resume_hinting(event: KeyPressEvent): |
|
270 | def resume_hinting(event: KeyPressEvent): | |
269 | """Resume autosuggestions""" |
|
271 | """Resume autosuggestions""" | |
270 | return _update_hint(event.current_buffer) |
|
272 | pass_through.reply(event) | |
|
273 | # Order matters: if update happened first and event reply second, the | |||
|
274 | # suggestion would be auto-accepted if both actions are bound to same key. | |||
|
275 | _update_hint(event.current_buffer) | |||
271 |
|
276 | |||
272 |
|
277 | |||
273 | def up_and_update_hint(event: KeyPressEvent): |
|
278 | def up_and_update_hint(event: KeyPressEvent): |
@@ -13,7 +13,8 b' from typing import Callable, Dict, Union' | |||||
13 |
|
13 | |||
14 | from prompt_toolkit.application.current import get_app |
|
14 | from prompt_toolkit.application.current import get_app | |
15 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER |
|
15 | from prompt_toolkit.enums import DEFAULT_BUFFER, SEARCH_BUFFER | |
16 | from prompt_toolkit.filters import Condition, emacs_insert_mode, has_completions |
|
16 | from prompt_toolkit.key_binding import KeyPressEvent | |
|
17 | from prompt_toolkit.filters import Condition, Filter, emacs_insert_mode, has_completions | |||
17 | from prompt_toolkit.filters import has_focus as has_focus_impl |
|
18 | from prompt_toolkit.filters import has_focus as has_focus_impl | |
18 | from prompt_toolkit.filters import ( |
|
19 | from prompt_toolkit.filters import ( | |
19 | Always, |
|
20 | Always, | |
@@ -175,6 +176,36 b' def is_windows_os():' | |||||
175 | return sys.platform == "win32" |
|
176 | return sys.platform == "win32" | |
176 |
|
177 | |||
177 |
|
178 | |||
|
179 | class PassThrough(Filter): | |||
|
180 | """A filter allowing to implement pass-through behaviour of keybindings. | |||
|
181 | ||||
|
182 | Prompt toolkit key processor dispatches only one event per binding match, | |||
|
183 | which means that adding a new shortcut will suppress the old shortcut | |||
|
184 | if the keybindings are the same (unless one is filtered out). | |||
|
185 | ||||
|
186 | To stop a shortcut binding from suppressing other shortcuts: | |||
|
187 | - add the `pass_through` filter to list of filter, and | |||
|
188 | - call `pass_through.reply(event)` in the shortcut handler. | |||
|
189 | """ | |||
|
190 | ||||
|
191 | def __init__(self): | |||
|
192 | self._is_replying = False | |||
|
193 | ||||
|
194 | def reply(self, event: KeyPressEvent): | |||
|
195 | self._is_replying = True | |||
|
196 | try: | |||
|
197 | event.key_processor.reset() | |||
|
198 | event.key_processor.feed_multiple(event.key_sequence) | |||
|
199 | event.key_processor.process_keys() | |||
|
200 | finally: | |||
|
201 | self._is_replying = False | |||
|
202 | ||||
|
203 | def __call__(self): | |||
|
204 | return not self._is_replying | |||
|
205 | ||||
|
206 | ||||
|
207 | pass_through = PassThrough() | |||
|
208 | ||||
178 | # these one is callable and re-used multiple times hence needs to be |
|
209 | # these one is callable and re-used multiple times hence needs to be | |
179 | # only defined once beforhand so that transforming back to human-readable |
|
210 | # only defined once beforhand so that transforming back to human-readable | |
180 | # names works well in the documentation. |
|
211 | # names works well in the documentation. | |
@@ -248,6 +279,7 b' KEYBINDING_FILTERS = {' | |||||
248 | "followed_by_single_quote": following_text("^'"), |
|
279 | "followed_by_single_quote": following_text("^'"), | |
249 | "navigable_suggestions": navigable_suggestions, |
|
280 | "navigable_suggestions": navigable_suggestions, | |
250 | "cursor_in_leading_ws": cursor_in_leading_ws, |
|
281 | "cursor_in_leading_ws": cursor_in_leading_ws, | |
|
282 | "pass_through": pass_through, | |||
251 | } |
|
283 | } | |
252 |
|
284 | |||
253 |
|
285 |
General Comments 0
You need to be logged in to leave comments.
Login now