URI: 
       tAdd key mappings for other languages - ledit - Text editor (WIP)
  HTML git clone git://lumidify.org/ledit.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 89c0c124f4a4097292b1e5baa5e158cdfb6a81f7
   DIR parent e822581bc43838987d8830b54c5e2103056a1b18
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Thu, 23 Dec 2021 21:40:48 +0100
       
       Add key mappings for other languages
       
       Diffstat:
         D BUG                                 |       9 ---------
         M keys_basic_config.h                 |     249 +++++++++++++++++++++++++++++++
         M keys_command_config.h               |     115 ++++++++++++++++++++++++++++++-
         M ledit.c                             |      11 +++++++++--
       
       4 files changed, 371 insertions(+), 13 deletions(-)
       ---
   DIR diff --git a/BUG b/BUG
       t@@ -1,9 +0,0 @@
       -Random bugs noted down so I remember them; you are not expected to understand this
       -deleting two lines in middle: leaves stray empty line without cursor; undo not right order;
       -#0  0x00000d017890ccef in memcpy (dst0=0xd01adb5cf00, src0=0xd01c90a610b, length=18446744073709551566) at /usr/src/lib/libc/string/memcpy.c:97
       -#1  0x00000cff1763be78 in ledit_insert_text_base (buffer=0xd01adb67300, line_index=6, index=0, text=0xd01c90a610b "\001\r", len=-50) at buffer.c:322
       -#2  0x00000cff1763c516 in ledit_insert_text_with_newlines_base (buffer=0xd01adb67300, line_index=4, index=0,
       -    text=0xd01c90a6080 "اسجد\233ا\204کسجدا\233س\204کجاس\233\204دکاج\233د\204کسادجا\233سداکج\204د\233ا\n", len=89, end_line_ret=0x0,
       -    end_char_ret=0x0) at buffer.c:391
       -#3  0x00000cff17640058 in ledit_undo (buffer=0xd01adb67300) at undo.c:172
       -#4  0x00000cff17639d8a in undo () at ledit.c:1774
   DIR diff --git a/keys_basic_config.h b/keys_basic_config.h
       t@@ -194,14 +194,263 @@ static struct key keys_en[] = {
        };
        
        static struct key keys_de[] = {
       +        {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &backspace},
       +        {NULL, 0, XK_Left, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {NULL, 0, XK_Right, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {NULL, 0, XK_Up, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {NULL, XK_ANY_MOD, XK_Return, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &return_key},
       +        {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &delete_key},
       +        {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &escape_key},
       +        {"i",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_insert},
       +        {"h",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"l",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"j",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"k",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"h",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"t",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &toggle_hard_line_based},
       +        {NULL,  0, XK_space, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"j",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"n",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"p",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_beginning},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &push_0},
       +        {"1",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_1},
       +        {"2",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_2},
       +        {"3",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_3},
       +        {"4",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_4},
       +        {"5",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_5},
       +        {"6",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_6},
       +        {"7",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_7},
       +        {"8",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_8},
       +        {"9",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_9},
       +        {"x",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_forwards},
       +        {"X",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_backwards},
       +        {"d",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &delete},
       +        {"z",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &yank},
       +        {"Z",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &yank_lines},
       +        {"c",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &change},
       +        {"v",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_visual},
       +        {"o",  0, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &switch_selection_end},
       +        {"c",  ControlMask, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clipcopy},
       +        {"v",  ControlMask, 0, INSERT, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clippaste},
       +        {"g",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &show_line},
       +        {"Ö",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &enter_commandedit},
       +        {"_",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_backward},
       +        {"-",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_forward},
       +        {"n",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_next},
       +        {"N",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_prev},
       +        {"u",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"U",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &redo},
       +        {".",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &repeat_command},
       +        {"y",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"z",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &redo},
       +        {"b",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_up},
       +        {"f",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_down},
       +        {"e",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_down},
       +        {"z",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_up},
       +        {"d",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_down},
       +        {"u",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_up},
       +        {"$",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_eol},
       +        {"w",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word},
       +        {"e",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word_end},
       +        {"W",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword},
       +        {"E",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword_end},
       +        {"b",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_word},
       +        {"B",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_bigword},
       +        {"G",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_line},
       +        {"J",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &join_lines},
       +        {"I",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &insert_at_beginning},
       +        {"p",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal},
       +        {"P",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal_backwards},
       +        {"A",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_eol},
       +        {"a",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_cursor},
       +        {"O",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_above},
       +        {"o",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_below},
       +        {"m",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &mark_line},
       +        {"ä",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &jump_to_mark},
       +        {"C",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &change_to_eol},
       +        {"D",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &delete_to_eol},
       +        {"r",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &replace},
       +        {"&",  0, 0, NORMAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_first_non_ws},
       +        {"t",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_forwards},
       +        {"T",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_backwards},
       +        {"f",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_forwards},
       +        {"F",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_backwards},
                {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_insert_text}
        };
        
        static struct key keys_ur[] = {
       +        {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &backspace},
       +        {NULL, 0, XK_Left, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {NULL, 0, XK_Right, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {NULL, 0, XK_Up, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {NULL, XK_ANY_MOD, XK_Return, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &return_key},
       +        {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &delete_key},
       +        {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &escape_key},
       +        {"ی",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_insert},
       +        {"ح",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"ل",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"ج",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"ک",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"ح",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"ت",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &toggle_hard_line_based},
       +        {NULL,  0, XK_space, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"ج",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"ن",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"پ",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_beginning},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &push_0},
       +        {"1",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_1},
       +        {"2",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_2},
       +        {"3",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_3},
       +        {"4",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_4},
       +        {"5",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_5},
       +        {"6",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_6},
       +        {"7",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_7},
       +        {"8",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_8},
       +        {"9",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_9},
       +        {"ش",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_forwards},
       +        {"ژ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_backwards},
       +        {"د",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &delete},
       +        {"ے",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &yank},
       +        {"َ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &yank_lines},
       +        {"چ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &change},
       +        {"ط",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_visual},
       +        {"ہ",  0, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &switch_selection_end},
       +        {"چ",  ControlMask, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clipcopy},
       +        {"ط",  ControlMask, 0, INSERT, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clippaste},
       +        {"گ",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &show_line},
       +        {":",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &enter_commandedit},
       +        {"؟",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_backward},
       +        {"/",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_forward},
       +        {"ن",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_next},
       +        {"ں",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_prev},
       +        {"ء",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"ئ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &redo},
       +        {"۔",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &repeat_command},
       +        {"ز",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"َ",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &redo},
       +        {"ب",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_up},
       +        {"ف",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_down},
       +        {"ع",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_down},
       +        {"ے",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_up},
       +        {"د",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_down},
       +        {"ء",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_up},
       +        {"$",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_eol},
       +        {"و",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word},
       +        {"ع",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word_end},
       +        {"ؤ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword},
       +        {"ٰ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword_end},
       +        {"ب",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_word},
       +        {".",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_bigword},
       +        {"غ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_line},
       +        {"ض",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &join_lines},
       +        {"ِ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &insert_at_beginning},
       +        {"پ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal},
       +        {"ُ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal_backwards},
       +        {"آ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_eol},
       +        {"ا",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_cursor},
       +        {"ۃ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_above},
       +        {"ہ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_below},
       +        {"م",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &mark_line},
       +        {"'",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &jump_to_mark},
       +        {"ث",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &change_to_eol},
       +        {"ڈ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &delete_to_eol},
       +        {"ر",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &replace},
       +        {"^",  0, 0, NORMAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_first_non_ws},
       +        {"ت",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_forwards},
       +        {"ٹ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_backwards},
       +        {"ف",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_forwards},
       +        {"ّ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_backwards},
                {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_insert_text}
        };
        
        static struct key keys_hi[] = {
       +        {NULL, 0, XK_BackSpace, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &backspace},
       +        {NULL, 0, XK_Left, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {NULL, 0, XK_Right, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {NULL, 0, XK_Up, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {NULL, 0, XK_Down, VISUAL|INSERT|NORMAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {NULL, XK_ANY_MOD, XK_Return, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &return_key},
       +        {NULL, 0, XK_Delete, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &delete_key},
       +        {NULL, 0, XK_Escape, NORMAL|VISUAL|INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &escape_key},
       +        {"ि",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_insert},
       +        {"ह",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"ल",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"ज",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"क",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"ह",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_left},
       +        {"त",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &toggle_hard_line_based},
       +        {NULL,  0, XK_space, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_right},
       +        {"ज",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"न",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_down},
       +        {"प",  ControlMask, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &cursor_up},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_beginning},
       +        {"0",  0, 0, NORMAL|VISUAL, KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &push_0},
       +        {"1",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_1},
       +        {"2",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_2},
       +        {"3",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_3},
       +        {"4",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_4},
       +        {"5",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_5},
       +        {"6",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_6},
       +        {"7",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_7},
       +        {"8",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_8},
       +        {"9",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_NUMBERALLOWED, KEY_ENSURE_CURSOR_SHOWN, &push_9},
       +        {"्",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_forwards},
       +        {"ॉ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &delete_chars_backwards},
       +        {"द",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &delete},
       +        {"य",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &yank},
       +        {"ञ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &yank_lines},
       +        {"च",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &change},
       +        {"ड",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &enter_visual},
       +        {"ो",  0, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &switch_selection_end},
       +        {"च",  ControlMask, 0, VISUAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clipcopy},
       +        {"ड",  ControlMask, 0, INSERT, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &clippaste},
       +        {"ग",  ControlMask, 0, NORMAL|VISUAL, KEY_ANY, KEY_NONE, &show_line},
       +        {":",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &enter_commandedit},
       +        {"?",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_backward},
       +        {"/",  0, 0, NORMAL, KEY_NONE, KEY_NONE, &enter_searchedit_forward},
       +        {"न",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_next},
       +        {"ण",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &key_search_prev},
       +        {"ु",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"ू",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &redo},
       +        {".",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &repeat_command}, /* FIXME: only allow after finished key sequence */
       +        {"श",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &undo},
       +        {"य",  ControlMask, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &redo}, /* FIXME: this is confusing with ctrl+y in normal mode */
       +        {"ब",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_up},
       +        {"ट",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &screen_down},
       +        {"े",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_down},
       +        {"य",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_with_cursor_up},
       +        {"द",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_down},
       +        {"ु",  ControlMask, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &scroll_lines_up},
       +        {"$",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_eol},
       +        {"व",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word},
       +        {"े",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_word_end},
       +        {"ॐ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword},
       +        {"ै",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &next_bigword_end},
       +        {"ब",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_word},
       +        {"भ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &prev_bigword},
       +        {"घ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &move_to_line},
       +        {"झ",  0, 0, NORMAL, KEY_NONE|KEY_NUMBER, KEY_ENSURE_CURSOR_SHOWN, &join_lines},
       +        {"ी",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &insert_at_beginning},
       +        {"प",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal},
       +        {"फ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &paste_normal_backwards},
       +        {"आ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_eol},
       +        {"ा",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_after_cursor},
       +        {"ौ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_above},
       +        {"ो",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &append_line_below},
       +        {"म",  0, 0, NORMAL|VISUAL, KEY_NONE, KEY_NONE, &mark_line},
       +        {"'",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &jump_to_mark},
       +        {"छ",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &change_to_eol},
       +        {"ध",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &delete_to_eol},
       +        {"र",  0, 0, NORMAL, KEY_NONE, KEY_ENSURE_CURSOR_SHOWN, &replace},
       +        {"^",  0, 0, NORMAL, KEY_NONE|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &cursor_to_first_non_ws},
       +        {"त",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_forwards},
       +        {"थ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_next_char_backwards},
       +        {"ट",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_forwards},
       +        {"ठ",  0, 0, NORMAL|VISUAL, KEY_NONE|KEY_NUMBER|KEY_MOTIONALLOWED, KEY_ENSURE_CURSOR_SHOWN, &find_char_backwards},
                {"", 0, 0, INSERT, KEY_ANY, KEY_ENSURE_CURSOR_SHOWN, &insert_mode_insert_text}
        };
        
   DIR diff --git a/keys_command_config.h b/keys_command_config.h
       t@@ -74,12 +74,123 @@ static struct key keys_en[] = {
        };
        
        static struct key keys_de[] = {
       +        {"z", 0, 0, CMD_SUBSTITUTE, &substitute_yes},
       +        {"Z", 0, 0, CMD_SUBSTITUTE, &substitute_yes_all},
       +        {"n", 0, 0, CMD_SUBSTITUTE, &substitute_no},
       +        {"N", 0, 0, CMD_SUBSTITUTE, &substitute_no_all},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDIT, &edit_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCH, &editsearch_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCHB, &editsearchb_submit},
       +        {NULL, 0, XK_Left, CMD_EDIT, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCH, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCHB, &edit_cursor_left},
       +        {NULL, 0, XK_Right, CMD_EDIT, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCH, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCHB, &edit_cursor_right},
       +        {NULL, 0, XK_Up, CMD_EDIT, &edit_prevcommand},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCH, &edit_prevsearch},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCHB, &edit_prevsearch},
       +        {NULL, 0, XK_Down, CMD_EDIT, &edit_nextcommand},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCH, &edit_nextsearch},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCHB, &edit_nextsearch},
       +        {NULL, 0, XK_BackSpace, CMD_EDIT, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCH, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCHB, &edit_backspace},
       +        {NULL, 0, XK_Delete, CMD_EDIT, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCH, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCHB, &edit_delete},
       +        {NULL, 0, XK_End, CMD_EDIT, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCH, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCHB, &edit_cursor_to_end},
       +        {NULL, 0, XK_Home, CMD_EDIT, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCH, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCHB, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Escape, CMD_EDIT, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCH, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCHB, &edit_discard},
       +        {"", 0, 0, CMD_EDIT, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCH, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCHB, &edit_insert_text}
        };
        
       -static struct key keys_hi[] = {
       +static struct key keys_ur[] = {
       +        {"ے", 0, 0, CMD_SUBSTITUTE, &substitute_yes},
       +        {"َ", 0, 0, CMD_SUBSTITUTE, &substitute_yes_all},
       +        {"ن", 0, 0, CMD_SUBSTITUTE, &substitute_no},
       +        {"ں", 0, 0, CMD_SUBSTITUTE, &substitute_no_all},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDIT, &edit_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCH, &editsearch_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCHB, &editsearchb_submit},
       +        {NULL, 0, XK_Left, CMD_EDIT, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCH, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCHB, &edit_cursor_left},
       +        {NULL, 0, XK_Right, CMD_EDIT, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCH, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCHB, &edit_cursor_right},
       +        {NULL, 0, XK_Up, CMD_EDIT, &edit_prevcommand},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCH, &edit_prevsearch},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCHB, &edit_prevsearch},
       +        {NULL, 0, XK_Down, CMD_EDIT, &edit_nextcommand},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCH, &edit_nextsearch},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCHB, &edit_nextsearch},
       +        {NULL, 0, XK_BackSpace, CMD_EDIT, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCH, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCHB, &edit_backspace},
       +        {NULL, 0, XK_Delete, CMD_EDIT, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCH, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCHB, &edit_delete},
       +        {NULL, 0, XK_End, CMD_EDIT, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCH, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCHB, &edit_cursor_to_end},
       +        {NULL, 0, XK_Home, CMD_EDIT, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCH, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCHB, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Escape, CMD_EDIT, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCH, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCHB, &edit_discard},
       +        {"", 0, 0, CMD_EDIT, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCH, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCHB, &edit_insert_text}
        };
        
       -static struct key keys_ur[] = {
       +static struct key keys_hi[] = {
       +        {"य", 0, 0, CMD_SUBSTITUTE, &substitute_yes},
       +        {"ञ", 0, 0, CMD_SUBSTITUTE, &substitute_yes_all},
       +        {"न", 0, 0, CMD_SUBSTITUTE, &substitute_no},
       +        {"ण", 0, 0, CMD_SUBSTITUTE, &substitute_no_all},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDIT, &edit_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCH, &editsearch_submit},
       +        {NULL, XK_ANY_MOD, XK_Return, CMD_EDITSEARCHB, &editsearchb_submit},
       +        {NULL, 0, XK_Left, CMD_EDIT, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCH, &edit_cursor_left},
       +        {NULL, 0, XK_Left, CMD_EDITSEARCHB, &edit_cursor_left},
       +        {NULL, 0, XK_Right, CMD_EDIT, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCH, &edit_cursor_right},
       +        {NULL, 0, XK_Right, CMD_EDITSEARCHB, &edit_cursor_right},
       +        {NULL, 0, XK_Up, CMD_EDIT, &edit_prevcommand},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCH, &edit_prevsearch},
       +        {NULL, 0, XK_Up, CMD_EDITSEARCHB, &edit_prevsearch},
       +        {NULL, 0, XK_Down, CMD_EDIT, &edit_nextcommand},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCH, &edit_nextsearch},
       +        {NULL, 0, XK_Down, CMD_EDITSEARCHB, &edit_nextsearch},
       +        {NULL, 0, XK_BackSpace, CMD_EDIT, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCH, &edit_backspace},
       +        {NULL, 0, XK_BackSpace, CMD_EDITSEARCHB, &edit_backspace},
       +        {NULL, 0, XK_Delete, CMD_EDIT, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCH, &edit_delete},
       +        {NULL, 0, XK_Delete, CMD_EDITSEARCHB, &edit_delete},
       +        {NULL, 0, XK_End, CMD_EDIT, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCH, &edit_cursor_to_end},
       +        {NULL, 0, XK_End, CMD_EDITSEARCHB, &edit_cursor_to_end},
       +        {NULL, 0, XK_Home, CMD_EDIT, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCH, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Home, CMD_EDITSEARCHB, &edit_cursor_to_beginning},
       +        {NULL, 0, XK_Escape, CMD_EDIT, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCH, &edit_discard},
       +        {NULL, 0, XK_Escape, CMD_EDITSEARCHB, &edit_discard},
       +        {"", 0, 0, CMD_EDIT, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCH, &edit_insert_text},
       +        {"", 0, 0, CMD_EDITSEARCHB, &edit_insert_text}
        };
        
        GEN_KEY_ARRAY(struct key, keys_en, keys_de, keys_hi, keys_ur);
   DIR diff --git a/ledit.c b/ledit.c
       t@@ -346,10 +346,17 @@ redraw(void) {
        
        static void
        change_keyboard(char *lang) {
       -        printf("%s\n", lang);
                cur_lang = get_language_index(lang);
       -        if (cur_lang < 0)
       +        if (cur_lang < 0) {
       +                for (size_t i = 0; i < buffer->views_num; i++) {
       +                        window_show_message_fmt(
       +                            buffer->views[i]->window,
       +                            "No mapping for language \"%s\", using default mapping",
       +                            lang
       +                        );
       +                }
                        cur_lang = 0;
       +        }
        }
        
        static void