summaryrefslogtreecommitdiff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/Zle/iwidgets.list2
-rw-r--r--Src/Zle/zle_keymap.c5
-rw-r--r--Src/Zle/zle_vi.c46
3 files changed, 52 insertions, 1 deletions
diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index 2b2654c5d..58310cd74 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -143,6 +143,7 @@
"vi-delete", videlete, ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_VIOPER
"vi-delete-char", videletechar, ZLE_KEEPSUFFIX
"vi-digit-or-beginning-of-line", vidigitorbeginningofline, 0
+"vi-down-case", vidowncase, ZLE_LASTCOL | ZLE_VIOPER
"vi-down-line-or-history", vidownlineorhistory, ZLE_LINEMOVE
"vi-end-of-line", viendofline, ZLE_LASTCOL
"vi-fetch-history", vifetchhistory, ZLE_LINEMOVE
@@ -188,6 +189,7 @@
"vi-swap-case", viswapcase, ZLE_LASTCOL
"vi-undo-change", viundochange, ZLE_KEEPSUFFIX
"vi-unindent", viunindent, ZLE_LASTCOL | ZLE_VIOPER
+"vi-up-case", viupcase, ZLE_LASTCOL | ZLE_VIOPER
"vi-up-line-or-history", viuplineorhistory, ZLE_LINEMOVE
"vi-yank", viyank, ZLE_LASTCOL | ZLE_VIOPER
"vi-yank-eol", viyankeol, 0
diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index f547dbf17..3db4207d9 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1374,8 +1374,11 @@ default_bindings(void)
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);
+ bindkey(amap, "gu", refthingy(t_vidowncase), NULL);
+ bindkey(amap, "gU", refthingy(t_viupcase), NULL);
bindkey(amap, "g~~", NULL, "g~g~");
+ bindkey(amap, "guu", NULL, "gugu");
+ bindkey(amap, "gUU", NULL, "gUgU");
/* emacs mode: arrow keys */
add_cursor_key(emap, TCUPCURSOR, t_uplineorhistory, 'A');
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 953af2401..baa2064e9 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -731,6 +731,52 @@ vioperswapcase(UNUSED(char **args))
/**/
int
+viupcase(UNUSED(char **args))
+{
+ int oldcs, c2, ret = 1;
+
+ /* get the range */
+ startvichange(1);
+ if ((c2 = getvirange(0)) != -1) {
+ oldcs = zlecs;
+ /* covert the case of all letters within range */
+ while (zlecs < c2) {
+ zleline[zlecs] = ZC_toupper(zleline[zlecs]);
+ INCCS();
+ }
+ /* go back to the first line of the range */
+ zlecs = oldcs;
+ ret = 0;
+ }
+ vichgflag = 0;
+ return ret;
+}
+
+/**/
+int
+vidowncase(UNUSED(char **args))
+{
+ int oldcs, c2, ret = 1;
+
+ /* get the range */
+ startvichange(1);
+ if ((c2 = getvirange(0)) != -1) {
+ oldcs = zlecs;
+ /* convert the case of all letters within range */
+ while (zlecs < c2) {
+ zleline[zlecs] = ZC_tolower(zleline[zlecs]);
+ INCCS();
+ }
+ /* go back to the first line of the range */
+ zlecs = oldcs;
+ ret = 0;
+ }
+ vichgflag = 0;
+ return ret;
+}
+
+/**/
+int
virepeatchange(UNUSED(char **args))
{
/* make sure we have a change to repeat */