Skip to content

Commit df74f06

Browse files
authored
Merge pull request #1912 from puneetdixit200/fix-alt-keybindings-completion
Fix completion escape eagerness
2 parents 994417a + 96c5fe5 commit df74f06

4 files changed

Lines changed: 24 additions & 3 deletions

File tree

changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
Upcoming (TBD)
22
==============
33

4+
Bug Fixes
5+
---------
6+
* Keep completion-menu Escape cancellation eager only in Vi mode so Emacs Alt-key bindings keep working while completions are open.
7+
8+
49
Internal
510
---------
611
* Factor `main.py` into several files using mixins.

mycli/AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ Contributors:
116116
* Abhay Kumar
117117
* yurenchen000
118118
* Linuxdazhao
119+
* Puneet Dixit
119120

120121

121122
Created by:

mycli/key_bindings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
completion_is_selected,
1111
control_is_searchable,
1212
emacs_mode,
13+
vi_mode,
1314
)
1415
from prompt_toolkit.key_binding import KeyBindings
1516
from prompt_toolkit.key_binding.bindings.named_commands import register as ptoolkit_register
@@ -161,7 +162,7 @@ def _(event: KeyPressEvent) -> None:
161162
elif 'summon' in behaviors:
162163
b.start_completion(select_first=False)
163164

164-
@kb.add("escape", eager=True, filter=in_completion)
165+
@kb.add("escape", eager=vi_mode, filter=in_completion)
165166
def _(event: KeyPressEvent) -> None:
166167
"""Cancel completion menu.
167168

test/pytests/test_key_bindings.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ def binding(kb: prompt_toolkit.key_binding.KeyBindings, *keys: str | Keys) -> An
158158

159159
def patch_filter_app(monkeypatch, app: DummyApp) -> None:
160160
monkeypatch.setitem(key_bindings.emacs_mode.func.__globals__, 'get_app', lambda: app)
161+
monkeypatch.setitem(key_bindings.vi_mode.func.__globals__, 'get_app', lambda: app)
161162
monkeypatch.setitem(key_bindings.completion_is_selected.func.__globals__, 'get_app', lambda: app)
162163
monkeypatch.setitem(key_bindings.control_is_searchable.func.__globals__, 'get_app', lambda: app)
163164

@@ -330,13 +331,26 @@ def test_tab_binding_supports_configured_behaviors(
330331
assert event.app.current_buffer.cancel_completion_calls == expected_cancel
331332

332333

333-
def test_escape_binding_cancels_completion_menu(monkeypatch) -> None:
334+
@pytest.mark.parametrize(
335+
('editing_mode', 'expected_eager'),
336+
(
337+
(EditingMode.VI, True),
338+
(EditingMode.EMACS, False),
339+
),
340+
)
341+
def test_escape_binding_cancels_completion_menu(
342+
monkeypatch,
343+
editing_mode: EditingMode,
344+
expected_eager: bool,
345+
) -> None:
334346
mycli = DummyMyCli(DummyKeysConfig())
335347
kb = key_bindings.mycli_bindings(mycli)
336348
event = make_event(DummyBuffer(complete_state=object()))
349+
event.app.editing_mode = editing_mode
337350
monkeypatch.setattr(key_bindings, 'get_app', lambda: event.app)
351+
patch_filter_app(monkeypatch, event.app)
338352

339-
assert binding(kb, Keys.Escape).eager() is True
353+
assert binding(kb, Keys.Escape).eager() is expected_eager
340354
assert binding_filter(kb, Keys.Escape)() is True
341355

342356
inactive_event = make_event(DummyBuffer(complete_state=None))

0 commit comments

Comments
 (0)