summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--Src/Zle/iwidgets.list20
-rw-r--r--Src/Zle/zle_vi.c20
-rw-r--r--Src/jobs.c2
-rw-r--r--Test/X02zlevi.ztst19
5 files changed, 57 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index f574e6617..284029883 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,17 @@
in output loops so that unexpectedly long completion listings can
be interrupted
+2014-10-29 Oliver Kiddle <opk@zsh.org>
+
+ * 33528: Src/Zle/iwidgets.list, Src/Zle/zle_vi.c,
+ Test/X02zlevi.ztst: take notice of last column position when
+ using vi-yank and an upward cursor movement
+
+2014-10-27 Mikael Magnusson <mikachu@gmail.com>
+
+ * 33561, 33562: Src/jobs.c: The time builtin forgot to unmetafy
+ TIMEFMT.
+
2014-10-26 Peter Stephenson <p.w.stephenson@ntlworld.com>
* 33564: Test/A05execution.ztst: more care with monitor option.
diff --git a/Src/Zle/iwidgets.list b/Src/Zle/iwidgets.list
index ea41a7fed..79d62c7b5 100644
--- a/Src/Zle/iwidgets.list
+++ b/Src/Zle/iwidgets.list
@@ -102,9 +102,9 @@
"self-insert-unmeta", selfinsertunmeta, ZLE_MENUCMP | ZLE_KEEPSUFFIX
"send-break", sendbreak, 0
"set-mark-command", setmarkcommand, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
-"split-undo", splitundo, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_NOTCOMMAND
+"split-undo", splitundo, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL | ZLE_NOTCOMMAND
"spell-word", spellword, 0
-"set-local-history", setlocalhistory, 0
+"set-local-history", setlocalhistory, ZLE_LASTCOL
"transpose-chars", transposechars, 0
"transpose-words", transposewords, 0
"undefined-key", undefinedkey, 0
@@ -122,12 +122,12 @@
"vi-backward-kill-word", vibackwardkillword, ZLE_KEEPSUFFIX
"vi-backward-word", vibackwardword, 0
"vi-beginning-of-line", vibeginningofline, 0
-"vi-caps-lock-panic", vicapslockpanic, 0
-"vi-change", vichange, 0
+"vi-caps-lock-panic", vicapslockpanic, ZLE_LASTCOL
+"vi-change", vichange, ZLE_LASTCOL
"vi-change-eol", vichangeeol, 0
"vi-change-whole-line", vichangewholeline, 0
"vi-cmd-mode", vicmdmode, 0
-"vi-delete", videlete, ZLE_KEEPSUFFIX
+"vi-delete", videlete, ZLE_KEEPSUFFIX | ZLE_LASTCOL
"vi-delete-char", videletechar, ZLE_KEEPSUFFIX
"vi-digit-or-beginning-of-line", vidigitorbeginningofline, 0
"vi-down-line-or-history", vidownlineorhistory, ZLE_LINEMOVE
@@ -148,7 +148,7 @@
"vi-goto-mark-line", vigotomarkline, 0
"vi-history-search-backward", vihistorysearchbackward, 0
"vi-history-search-forward", vihistorysearchforward, 0
-"vi-indent", viindent, 0
+"vi-indent", viindent, ZLE_LASTCOL
"vi-insert", viinsert, 0
"vi-insert-bol", viinsertbol, 0
"vi-join", vijoin, 0
@@ -157,7 +157,7 @@
"vi-match-bracket", vimatchbracket, 0
"vi-open-line-above", viopenlineabove, 0
"vi-open-line-below", viopenlinebelow, 0
-"vi-oper-swap-case", vioperswapcase, 0
+"vi-oper-swap-case", vioperswapcase, ZLE_LASTCOL
"vi-pound-insert", vipoundinsert, 0
"vi-put-after", viputafter, ZLE_YANK | ZLE_KEEPSUFFIX
"vi-put-before", viputbefore, ZLE_YANK | ZLE_KEEPSUFFIX
@@ -172,11 +172,11 @@
"vi-set-buffer", visetbuffer, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"vi-set-mark", visetmark, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
"vi-substitute", visubstitute, 0
-"vi-swap-case", viswapcase, 0
+"vi-swap-case", viswapcase, ZLE_LASTCOL
"vi-undo-change", viundochange, ZLE_KEEPSUFFIX
-"vi-unindent", viunindent, 0
+"vi-unindent", viunindent, ZLE_LASTCOL
"vi-up-line-or-history", viuplineorhistory, ZLE_LINEMOVE
-"vi-yank", viyank, 0
+"vi-yank", viyank, ZLE_LASTCOL
"vi-yank-eol", viyankeol, 0
"vi-yank-whole-line", viyankwholeline, 0
"what-cursor-position", whatcursorposition, ZLE_MENUCMP | ZLE_KEEPSUFFIX | ZLE_LASTCOL
diff --git a/Src/Zle/zle_vi.c b/Src/Zle/zle_vi.c
index 53919e361..0a8b27d65 100644
--- a/Src/Zle/zle_vi.c
+++ b/Src/Zle/zle_vi.c
@@ -248,6 +248,7 @@ getvirange(int wf)
* point we just need to make the range encompass entire lines. */
if(vilinerange) {
int newcs = findbol();
+ lastcol = zlecs - newcs;
zlecs = pos;
pos = findeol();
zlecs = newcs;
@@ -348,6 +349,7 @@ videlete(UNUSED(char **args))
forekill(c2 - zlecs, CUT_RAW);
ret = 0;
if (vilinerange && zlell) {
+ lastcol = -1;
if (zlecs == zlell)
DECCS();
foredel(1, 0);
@@ -449,7 +451,7 @@ vichangewholeline(char **args)
int
viyank(UNUSED(char **args))
{
- int oldcs = zlecs, c2, ret = 1;
+ int c2, ret = 1;
startvichange(1);
if ((c2 = getvirange(0)) != -1) {
@@ -459,11 +461,19 @@ viyank(UNUSED(char **args))
vichgflag = 0;
/* cursor now at the start of the range yanked. For line mode
* restore the column position */
- if (vilinerange) {
- while (oldcs > 0 && zleline[oldcs - 1] != ZWC('\n') &&
- zlecs != zlell && zleline[zlecs] != ZWC('\n')) {
- ++zlecs; --oldcs;
+ if (vilinerange && lastcol != -1) {
+ int x = findeol();
+
+ if ((zlecs += lastcol) >= x) {
+ zlecs = x;
+ if (zlecs > findbol() && invicmdmode())
+ DECCS();
}
+#ifdef MULTIBYTE_SUPPORT
+ else
+ CCRIGHT();
+#endif
+ lastcol = -1;
}
return ret;
}
diff --git a/Src/jobs.c b/Src/jobs.c
index 18bb648d9..494d5aa90 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -704,6 +704,8 @@ printtime(struct timeval *real, child_times_t *ti, char *desc)
queue_signals();
if (!(s = getsparam("TIMEFMT")))
s = DEFAULT_TIMEFMT;
+ else
+ s = unmetafy(s, NULL);
for (; *s; s++)
if (*s == '%')
diff --git a/Test/X02zlevi.ztst b/Test/X02zlevi.ztst
index d9fa0d51f..2af6f06e6 100644
--- a/Test/X02zlevi.ztst
+++ b/Test/X02zlevi.ztst
@@ -37,6 +37,25 @@
>two
>CURSOR: 2
+ zletest $'long\eo s\eolong\ekjy-k'
+0:yank up clears lastcol
+>BUFFER: long
+> s
+>long
+>CURSOR: 2
+
+ zletest $'long\eos\eklljyk'
+0:yank up honours lastcol
+>BUFFER: long
+>s
+>CURSOR: 2
+
+ zletest $'long\eolong\eo s\eolong\ekjd-k'
+0:delete up clears lastcol
+>BUFFER: long
+>long
+>CURSOR: 0
+
zletest $'yankee doodle\ebhDyy0"1P'
0:paste register 1 to get last deletion
>BUFFER: doodleyankee