Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[PATCH] Bind quasi-default Home, End and Delete keys in built-in keymaps



Make Home, End and Delete keys work by default as expected by most users.
---
 Doc/Zsh/zle.yo       | 12 ++++++------
 Src/Zle/zle_keymap.c | 11 +++++++++--
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index d68365b94..4d2c8580c 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -1231,12 +1231,12 @@ item(tt(vi-backward-word-end) (unbound) (tt(ge)) (unbound))(
 Move to the end of the previous word, vi-style.
 )
 tindex(beginning-of-line)
-item(tt(beginning-of-line) (tt(^A)) (unbound) (unbound))(
+item(tt(beginning-of-line) (tt(^A) tt(ESC-[1~)) (unbound) (unbound))(
 Move to the beginning of the line.  If already at the beginning
 of the line, move to the beginning of the previous line, if any.
 )
 tindex(vi-beginning-of-line)
-item(tt(vi-beginning-of-line))(
+item(tt(vi-beginning-of-line) (unbound) (tt(ESC-[1~)) (tt(ESC-[1~)))(
 Move to the beginning of the line, without changing lines.
 )
 tindex(down-line)
@@ -1244,12 +1244,12 @@ item(tt(down-line) (unbound) (unbound) (unbound))(
 Move down a line in the buffer.
 )
 tindex(end-of-line)
-item(tt(end-of-line) (tt(^E)) (unbound) (unbound))(
+item(tt(end-of-line) (tt(^E) tt(ESC-[4~)) (unbound) (unbound))(
 Move to the end of the line.  If already at the end
 of the line, move to the end of the next line, if any.
 )
 tindex(vi-end-of-line)
-item(tt(vi-end-of-line) (unbound) (tt($)) (unbound))(
+item(tt(vi-end-of-line) (unbound) (tt($) tt(ESC-[4~)) (tt(ESC-[4~)))(
 Move to the end of the line.
 If an argument is given to this command, the cursor will be moved to
 the end of the line (argument - 1) lines down.
@@ -1778,11 +1778,11 @@ from the cursor position to the endpoint of the movement.
 If the command is tt(vi-delete), kill the current line.
 )
 tindex(delete-char)
-item(tt(delete-char))(
+item(tt(delete-char) (tt(ESC-[3~)) (unbound) (unbound))(
 Delete the character under the cursor.
 )
 tindex(vi-delete-char)
-item(tt(vi-delete-char) (unbound) (tt(x)) (unbound))(
+item(tt(vi-delete-char) (unbound) (tt(x) tt(ESC-[3~)) (tt(ESC-[3~)))(
 Delete the character under the cursor,
 without going past the end of the line.
 )
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index 04eb70675..cff044237 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1342,11 +1342,15 @@ default_bindings(void)
     vimaps[1] = amap;
     for (i = 0; i < 2; i++) {
 	kptr = vimaps[i];
-	/* vi command and insert modes: arrow keys */
+	/* vi command and insert modes: arrow keys,
+	 * home, end and delete */
 	add_cursor_key(kptr, TCUPCURSOR, t_uplineorhistory, 'A');
 	add_cursor_key(kptr, TCDOWNCURSOR, t_downlineorhistory, 'B');
 	add_cursor_key(kptr, TCLEFTCURSOR, t_vibackwardchar, 'D');
 	add_cursor_key(kptr, TCRIGHTCURSOR, t_viforwardchar, 'C');
+	bindkey(kptr, "\033[1~", refthingy(t_vibeginningofline), NULL);
+	bindkey(kptr, "\033[4~", refthingy(t_viendofline), NULL);
+	bindkey(kptr, "\033[3~", refthingy(t_videletechar), NULL);
     }
     vilmaps[0] = oppmap;
     vilmaps[1] = vismap;
@@ -1386,11 +1390,14 @@ default_bindings(void)
     bindkey(amap, "guu", NULL, "gugu");
     bindkey(amap, "gUU", NULL, "gUgU");
 
-    /* emacs mode: arrow keys */ 
+    /* emacs mode: arrow keys, home, end and delete */
     add_cursor_key(emap, TCUPCURSOR, t_uplineorhistory, 'A');
     add_cursor_key(emap, TCDOWNCURSOR, t_downlineorhistory, 'B');
     add_cursor_key(emap, TCLEFTCURSOR, t_backwardchar, 'D');
     add_cursor_key(emap, TCRIGHTCURSOR, t_forwardchar, 'C');
+    bindkey(emap, "\033[1~", refthingy(t_beginningofline), NULL);
+    bindkey(emap, "\033[4~", refthingy(t_endofline), NULL);
+    bindkey(emap, "\033[3~", refthingy(t_deletechar), NULL);
    
     /* emacs mode: ^X sequences */
     bindkey(emap, "\30*",   refthingy(t_expandword), NULL);
-- 
2.11.0



Messages sorted by: Reverse Date, Date, Thread, Author