File tree Expand file tree Collapse file tree 3 files changed +31
-1
lines changed Expand file tree Collapse file tree 3 files changed +31
-1
lines changed Original file line number Diff line number Diff line change 107
107
REPLACED_KEYS ,
108
108
_character_to_key ,
109
109
_get_unicode_name_from_key ,
110
+ _normalize_key_list ,
110
111
format_key ,
111
112
)
112
113
from textual .messages import CallbackType , Prune
@@ -3709,7 +3710,10 @@ def set_keymap(self, keymap: Keymap) -> None:
3709
3710
Args:
3710
3711
keymap: A mapping of binding IDs to key strings.
3711
3712
"""
3712
- self ._keymap = keymap
3713
+
3714
+ self ._keymap = {
3715
+ binding_id : _normalize_key_list (keys ) for binding_id , keys in keymap .items ()
3716
+ }
3713
3717
self .refresh_bindings ()
3714
3718
3715
3719
def update_keymap (self , keymap : Keymap ) -> None :
@@ -3721,6 +3725,9 @@ def update_keymap(self, keymap: Keymap) -> None:
3721
3725
Args:
3722
3726
keymap: A mapping of binding IDs to key strings.
3723
3727
"""
3728
+ keymap = {
3729
+ binding_id : _normalize_key_list (keys ) for binding_id , keys in keymap .items ()
3730
+ }
3724
3731
self ._keymap = {** self ._keymap , ** keymap }
3725
3732
self .refresh_bindings ()
3726
3733
Original file line number Diff line number Diff line change @@ -354,3 +354,16 @@ def _character_to_key(character: str) -> str:
354
354
key = character
355
355
key = KEY_NAME_REPLACEMENTS .get (key , key )
356
356
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
+ )
Original file line number Diff line number Diff line change @@ -127,3 +127,13 @@ def signal_bindings_updated(screen: Screen) -> None:
127
127
app .set_keymap ({"quit" : "f1" })
128
128
await pilot .pause ()
129
129
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" }
You can’t perform that action at this time.
0 commit comments