Skip to content

Commit 47c28a0

Browse files
committed
normalize keys
1 parent 748fc07 commit 47c28a0

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

src/textual/app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
REPLACED_KEYS,
108108
_character_to_key,
109109
_get_unicode_name_from_key,
110+
_normalize_key_list,
110111
format_key,
111112
)
112113
from textual.messages import CallbackType, Prune
@@ -3709,7 +3710,10 @@ def set_keymap(self, keymap: Keymap) -> None:
37093710
Args:
37103711
keymap: A mapping of binding IDs to key strings.
37113712
"""
3712-
self._keymap = keymap
3713+
3714+
self._keymap = {
3715+
binding_id: _normalize_key_list(keys) for binding_id, keys in keymap.items()
3716+
}
37133717
self.refresh_bindings()
37143718

37153719
def update_keymap(self, keymap: Keymap) -> None:
@@ -3721,6 +3725,9 @@ def update_keymap(self, keymap: Keymap) -> None:
37213725
Args:
37223726
keymap: A mapping of binding IDs to key strings.
37233727
"""
3728+
keymap = {
3729+
binding_id: _normalize_key_list(keys) for binding_id, keys in keymap.items()
3730+
}
37243731
self._keymap = {**self._keymap, **keymap}
37253732
self.refresh_bindings()
37263733

src/textual/keys.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,16 @@ def _character_to_key(character: str) -> str:
354354
key = character
355355
key = KEY_NAME_REPLACEMENTS.get(key, key)
356356
return key
357+
358+
359+
def _normalize_key_list(keys: str) -> str:
360+
"""Normalizes a comma separated list of keys.
361+
362+
Replaces single letter keys with full name.
363+
Sorts alphabetically.
364+
"""
365+
366+
keys_list = [key.strip() for key in keys.split(",")]
367+
return ",".join(
368+
_character_to_key(key) if len(key) == 1 else key for key in sorted(keys_list)
369+
)

tests/test_binding.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,13 @@ def signal_bindings_updated(screen: Screen) -> None:
127127
app.set_keymap({"quit": "f1"})
128128
await pilot.pause()
129129
assert bindings_updated == [app.screen, app.screen]
130+
131+
132+
async def test_keymap_key() -> None:
133+
app: App[None] = App()
134+
135+
async with app.run_test():
136+
app.set_keymap({"foo": "?,space"})
137+
assert app._keymap == {"foo": "question_mark,space"}
138+
app.update_keymap({"bar": "$"})
139+
assert app._keymap == {"bar": "dollar_sign", "foo": "question_mark,space"}

0 commit comments

Comments
 (0)