Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: default vi-mode key bindings
- X-seq: zsh-workers 33846
- From: Oliver Kiddle <okiddle@xxxxxxxxxxx>
- To: Zsh workers <zsh-workers@xxxxxxx>
- Subject: PATCH: default vi-mode key bindings
- Date: Thu, 04 Dec 2014 19:28:30 +0100
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.co.uk; s=s2048; t=1417717712; bh=PmAIC2DZKTNfBeEzW4FgLh2ERooI3aNxTj6eYDv2Y7c=; h=From:To:Subject:Date:From:Subject; b=NITqRhwJ7/W+TojIeYk4ClkbwldpaKbiLpKo5AqlFMN95OT0+3QBYvUzZXqsjxiyHKEWM08Jm+yXJzns+rSI8T9S5gY4cpbsgYdTYDu8W4dJMDVIDOzWg4CzvMR47tZvZWmVfwx+eBm7nAqRdsYax+E9BGsuGZ10mbkJJXuUIL5Qsip23Os+3m+MmW8kOse/dGeqPTwcZ+9ykRQjJmMvuARlbFZm+2P4f6TrcPKlDI66reMolACCodY836c2dmV+T8ClPbhmQ8dAPl0D2kbGPTiVdxclwbog1EfPFggk3U3NkC1FSu1Ci5n7Y3le1IMHOI+26ixEPwXuUJ18iqlqBg==
- Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=s2048; d=yahoo.co.uk; b=dqjfVSAIPBUEE9gaFwPWX8d9DQDG84NRljFd39K9mEPwuJBdPKmNFXHiH+96nC3Af/rX1gpwR9JoNPNHlfy9T3KRVjTC5s7lmTQr33MN5NpLgVEn1gghIz0LUOoderKKwexl2BeJNDOt81A++IaCOxjbwpiBwPLdbkeEciG6FXHRGAV5ynME9hEh4vhF+8gav/gdNIcKtQmfM5nRPpbeoW/gOOABiXSeipFW8DswwD24FMcVr7Rq0S6r/JZcrkITEqe1JqX/pKEWstgl5DfT9GfCz42ogI47mRAdrthfjF9je9tdSYUfujFbKEAPL7jq73l6J745XrlpuH0/4oK3jQ==;
- List-help: <mailto:zsh-workers-help@zsh.org>
- List-id: Zsh Workers List <zsh-workers.zsh.org>
- List-post: <mailto:zsh-workers@zsh.org>
- Mailing-list: contact zsh-workers-help@xxxxxxx; run by ezmlm
I would like to suggest the following changes to the default key
bindings in vi mode.
The undo bindings are a change to existing behaviour.
I think it is better that someone has to explicitly select the
vi-compatible single level undo/redo toggling and that the default is
multi-level undo with redo on Ctrl-R. Ctrl-R is currently redisplay.
The other keys are all vim bindings starting with a g prefix. gg is very
common and well known. I've bound it to beginning-of-buffer-or-history.
The beginning of history is really fairly useless but it probably needs
to be that for consistency with other keys: I only care about it going
to that start of the buffer. I'm slightly inclined to add a goto-line
to go to a line in the buffer based on numeric argument. Note that G
is bound to vi-fetch-history. That does go to the end of a buffer but
not if you're on a previous history line. I use a combination of it
with end-of-buffer-or-history in a custom widget. These should all be
line-based moves within a vi buffer so the patch also sets those flags.
Next is ga to what-cursor-position. ^G probably sooner comes to mind for
that purpose but that's currently list-expand. ga in vim gives you the
ASCII code of the character under the cursor, similarly to zsh's
what-cursor-position.
g~ is swap case (like ~) but with a movement command. I have vim's gu/gU
implemented as shell functions.
Finally, there are ge and gE for moving back to the end of the previous
word.
Any thoughts or other suggestions?
Oliver
diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index 1a664e5..b3d1c92 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -24,7 +24,7 @@
"backward-kill-word", backwardkillword, ZLE_KILL | ZLE_KEEPSUFFIX
"backward-word", backwardword, 0
"beep", handlefeep, 0
-"beginning-of-buffer-or-history", beginningofbufferorhistory, 0
+"beginning-of-buffer-or-history", beginningofbufferorhistory, ZLE_LINEMOVE
"beginning-of-history", beginningofhistory, 0
"beginning-of-line", beginningofline, 0
"beginning-of-line-hist", beginningoflinehist, 0
@@ -46,7 +46,7 @@
"down-line-or-search", downlineorsearch, ZLE_LINEMOVE | ZLE_LASTCOL
"emacs-backward-word", emacsbackwardword, 0
"emacs-forward-word", emacsforwardword, 0
-"end-of-buffer-or-history", endofbufferorhistory, 0
+"end-of-buffer-or-history", endofbufferorhistory, ZLE_LINEMOVE
"end-of-history", endofhistory, 0
"end-of-line", endofline, 0
"end-of-line-hist", endoflinehist, 0
@@ -143,7 +143,7 @@
"vi-digit-or-beginning-of-line", vidigitorbeginningofline, 0
"vi-down-line-or-history", vidownlineorhistory, ZLE_LINEMOVE
"vi-end-of-line", viendofline, ZLE_LASTCOL
-"vi-fetch-history", vifetchhistory, 0
+"vi-fetch-history", vifetchhistory, ZLE_LINEMOVE
"vi-find-next-char", vifindnextchar, 0
"vi-find-next-char-skip", vifindnextcharskip, 0
"vi-find-prev-char", vifindprevchar, 0
diff --git a/Src/Zle/zle_bindings.c b/Src/Zle/zle_bindings.c
index 50a2955..e3337d0 100644
--- a/Src/Zle/zle_bindings.c
+++ b/Src/Zle/zle_bindings.c
@@ -308,7 +308,7 @@ int vicmdbind[128] = {
/* ^O */ z_undefinedkey,
/* ^P */ z_uphistory,
/* ^Q */ z_undefinedkey,
- /* ^R */ z_redisplay,
+ /* ^R */ z_redo,
/* ^S */ z_undefinedkey,
/* ^T */ z_undefinedkey,
/* ^U */ z_undefinedkey,
@@ -407,7 +407,7 @@ int vicmdbind[128] = {
/* r */ z_vireplacechars,
/* s */ z_visubstitute,
/* t */ z_vifindnextcharskip,
- /* u */ z_viundochange,
+ /* u */ z_undo,
/* v */ z_visualmode,
/* w */ z_viforwardword,
/* x */ z_videletechar,
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index 30d25eb..6957e9f 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1357,6 +1357,13 @@ default_bindings(void)
bindkey(vismap, "x", refthingy(t_videlete), NULL);
bindkey(vismap, "~", refthingy(t_vioperswapcase), NULL);
+ /* vi mode: some common vim bindings */
+ bindkey(amap, "ga", refthingy(t_whatcursorposition), NULL);
+ bindkey(amap, "ge", refthingy(t_vibackwardwordend), NULL);
+ bindkey(amap, "gE", refthingy(t_vibackwardblankwordend), NULL);
+ bindkey(amap, "gg", refthingy(t_beginningofbufferorhistory), NULL);
+ bindkey(amap, "g~", refthingy(t_vioperswapcase), NULL);
+
/* emacs mode: arrow keys */
add_cursor_key(emap, TCUPCURSOR, t_uplineorhistory, 'A');
add_cursor_key(emap, TCDOWNCURSOR, t_downlineorhistory, 'B');
Messages sorted by:
Reverse Date,
Date,
Thread,
Author