@@ -1090,6 +1090,18 @@ int editor_force_redraw(editor_t *editor) {
1090
1090
return MLE_OK ;
1091
1091
}
1092
1092
1093
+ // Return a key name given a kinput. `keyname` must be allocated to at least
1094
+ // `MLE_MAX_KEYNAME_LEN + 1`. Return `MLE_ERR` if `input` doesn't represent a
1095
+ // valid input.
1096
+ int editor_input_to_key (kinput_t * input , char * keyname ) {
1097
+ struct tb_event ev ;
1098
+ memset (& ev , 0 , sizeof (ev ));
1099
+ ev .mod = input -> mod ;
1100
+ ev .ch = input -> ch ;
1101
+ ev .key = input -> key ;
1102
+ return _editor_event_to_key (& ev , keyname );
1103
+ }
1104
+
1093
1105
// If input == editor->macro_toggle_key, toggle macro mode and return 1. Else
1094
1106
// return 0.
1095
1107
static int _editor_maybe_toggle_macro (editor_t * editor , kinput_t * input ) {
@@ -1595,34 +1607,34 @@ static int _editor_key_to_input(char *key, kinput_t *ret_input) {
1595
1607
// Return a key name given a key event
1596
1608
static int _editor_event_to_key (struct tb_event * ev , char * ret_keyname ) {
1597
1609
char key [MLE_MAX_KEYNAME_LEN + 1 ];
1610
+ memset (key , 0 , sizeof (key ));
1611
+
1598
1612
#define MLE_KEY_DEF (pkname , pmodmin , pmodadd , pch , pkey ) \
1599
1613
} else if ( \
1600
1614
(((pch) && ev->ch == (pch)) \
1601
1615
|| (!(pch) && ev->key == (pkey))) \
1602
1616
&& (((pmodmin) & ev->mod) == (pmodmin)) \
1603
1617
) { \
1604
- if ((pmodadd)) ev->mod &= ~(pmodadd); \
1605
- sprintf(key, (pkname));
1618
+ snprintf(key, sizeof(key), (pkname));
1606
1619
if (0 ) {
1607
1620
return MLE_ERR ;
1608
1621
#include "keys.h"
1609
- } else {
1610
- memset ( key , 0 , sizeof ( key ));
1622
+ } else if ( ev -> ch <= 0x10ffff && !( ev -> ch >= 0xd800 && ev -> ch <= 0xdfff )) {
1623
+ if ( ev -> ch == 0 ) return MLE_ERR ; // TODO: Support null-char input?
1611
1624
tb_utf8_unicode_to_char (key , ev -> ch );
1625
+ } else {
1626
+ return MLE_ERR ; // No match for key and ch is not a valid codepoint
1612
1627
}
1613
1628
#undef MLE_KEY_DEF
1614
- if (ev -> mod & TB_MOD_CTRL ) {
1615
- * ret_keyname ++ = 'C' ;
1616
- }
1617
- if (ev -> mod & TB_MOD_ALT ) {
1618
- * ret_keyname ++ = 'M' ;
1619
- }
1620
- if (ev -> mod & TB_MOD_SHIFT ) {
1621
- * ret_keyname ++ = 'S' ;
1622
- }
1623
- if (ev -> mod & TB_MOD_CTRL || ev -> mod & TB_MOD_ALT || ev -> mod & TB_MOD_SHIFT ) {
1629
+
1630
+ if (ev -> mod & TB_MOD_CTRL ) * ret_keyname ++ = 'C' ;
1631
+ if (ev -> mod & TB_MOD_ALT ) * ret_keyname ++ = 'M' ;
1632
+ if (ev -> mod & TB_MOD_SHIFT ) * ret_keyname ++ = 'S' ;
1633
+
1634
+ if (ev -> mod & (TB_MOD_CTRL | TB_MOD_ALT | TB_MOD_SHIFT )) {
1624
1635
* ret_keyname ++ = '-' ;
1625
1636
}
1637
+
1626
1638
sprintf (ret_keyname , "%s" , key );
1627
1639
return MLE_OK ;
1628
1640
}
@@ -1736,15 +1748,16 @@ static void _editor_register_cmds(editor_t *editor) {
1736
1748
_editor_register_cmd_fn (editor , "cmd_perl" , cmd_perl );
1737
1749
_editor_register_cmd_fn (editor , "cmd_pop_kmap" , cmd_pop_kmap );
1738
1750
_editor_register_cmd_fn (editor , "cmd_prev" , cmd_prev );
1751
+ _editor_register_cmd_fn (editor , "cmd_print_macro" , cmd_print_macro );
1739
1752
_editor_register_cmd_fn (editor , "cmd_push_kmap" , cmd_push_kmap );
1740
1753
_editor_register_cmd_fn (editor , "cmd_quit" , cmd_quit );
1741
1754
_editor_register_cmd_fn (editor , "cmd_quit_without_saving" , cmd_quit_without_saving );
1742
1755
_editor_register_cmd_fn (editor , "cmd_redo" , cmd_redo );
1743
1756
_editor_register_cmd_fn (editor , "cmd_redraw" , cmd_redraw );
1744
1757
_editor_register_cmd_fn (editor , "cmd_remove_extra_cursors" , cmd_remove_extra_cursors );
1745
1758
_editor_register_cmd_fn (editor , "cmd_repeat" , cmd_repeat );
1746
- _editor_register_cmd_fn (editor , "cmd_replace" , cmd_replace );
1747
1759
_editor_register_cmd_fn (editor , "cmd_replace_all" , cmd_replace_all );
1760
+ _editor_register_cmd_fn (editor , "cmd_replace" , cmd_replace );
1748
1761
_editor_register_cmd_fn (editor , "cmd_rfind_word" , cmd_rfind_word );
1749
1762
_editor_register_cmd_fn (editor , "cmd_rsearch" , cmd_rsearch );
1750
1763
_editor_register_cmd_fn (editor , "cmd_save_as" , cmd_save_as );
@@ -1896,6 +1909,7 @@ static void _editor_init_kmaps(editor_t *editor) {
1896
1909
MLE_KBINDING_DEF ("cmd_apply_macro" , "M-Z" ),
1897
1910
MLE_KBINDING_DEF ("cmd_apply_macro_by" , "M-M **" ),
1898
1911
MLE_KBINDING_DEF ("cmd_apply_macro_last" , "f6" ),
1912
+ MLE_KBINDING_DEF ("cmd_print_macro" , "M-<" ),
1899
1913
MLE_KBINDING_DEF ("cmd_next" , "M-n" ),
1900
1914
MLE_KBINDING_DEF ("cmd_prev" , "M-p" ),
1901
1915
MLE_KBINDING_DEF ("cmd_last" , "M-0" ),
0 commit comments