On Mon, 3 Sep 2012, Christian Brabandt wrote:
> On Mo, 03 Sep 2012, Ingo Karkat wrote:
> > Hello Vim developers,
> >
> > This issue came up on Reddit
> > (
http://www.reddit.com/r/vim/comments/yyq4a/is_there_anyway_to_configure_vim_to_use_the/).
> >
> > With :set clipboard=unnamed, small deletes (such as "dw") affect the named
> > registers "1.."9. I can reproduce this with vanilla Vim 7.3.000 on Windows/x86,
> > and the latest Vim 7.3.646 on Ubuntu/x86.
> >
> > It appears that the setting triggers the exception from the rule "This register
> > ("-) contains text from commands that delete less than one line, except when the
> > command specifies a register with ["x].", although the register here comes from
> > the implementation, not the user.
> >
> > Based on the Reddit posting, some people apparently prefer this behavior (though
> > I personally dislike that multiple "x" commands will rapidly fill the number
> > registers with single characters), so maybe there should be (yet another) option
> > for that. ('smalldeletethreshold', with 0 = off, 1 = all, and N = for deletes
> > equal or larger than N characters?!)
>
> This patch just fixes this side effect. I don't think, it warrants yet
> another option.
I haven't been active on this list. I apologize if reviving a year-
old post violates list etiquette, but it seems like the easiest way to
reference the issue.
I for one am one of those poor misguided souls who quite regularly
abused this accidental side effect. I was rather disturbed by its
disappearance with my recent upgrade from the vim 7.3 shipped with
debian wheezy. I do think this warrants an option, so I've made an
attempt to implement one. This is my first time poking around in
vim's innards. I'd love to get some feedback. Did I do this right?
Would a different name make more sense? Also, is there any chance of
getting this patch accepted? I am reasonably certain that there are
quite a few of those people who prefer the earlier behavior.
Thank you and best regards,
Aryeh Leib Taurog
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -1126,6 +1126,9 @@
made for the delete operator with these movement commands: |%|, |(|, |)|, |`|,
|/|, |?|, |n|, |N|, |{| and |}|. Register "1 is always used then (this is Vi
compatible). The "- register is used as well if the delete is within a line.
+If 'regone' is set, both registers "1 and "- will always be used for small
+deletes, regardless of the movement commands used (this option is not Vi
+compatible).
With each successive deletion or change, Vim shifts the previous contents
of register 1 into register 2, 2 into 3, and so forth, losing the previous
contents of register 9.
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -5581,6 +5581,16 @@
that is not supported the pattern will not match. This is only useful
for debugging the regexp engine.
+'regone' 'rgo' boolean (default off)
+ global
+ {not in Vi}
+ When set, a delete which would normally be stored only in the small
+ delete register will also be pushed onto the number register stack,
+ that is the number registers will be shifted down and the delete
+ contents will be stored in numbered register 1.
+ See |quote_number| and |quote_-|.
+ NOTE: This option is set to false when 'compatible' is set.
+
*'relativenumber'* *'rnu'* *'norelativenumber'* *'nornu'*
'relativenumber' 'rnu' boolean (default off)
local to window
diff --git a/src/ops.c b/src/ops.c
--- a/src/ops.c
+++ b/src/ops.c
@@ -1736,7 +1736,7 @@
* Use the register name from before adjust_clip_reg() may have
* changed it.
*/
- if (orig_regname != 0 || oap->motion_type == MLINE
+ if (orig_regname != 0 || p_rgo || oap->motion_type == MLINE
|| oap->line_count > 1 || oap->use_reg_one)
{
y_current = &y_regs[9];
diff --git a/src/option.c b/src/option.c
--- a/src/option.c
+++ b/src/option.c
@@ -2098,6 +2098,9 @@
{"regexpengine", "re", P_NUM|P_VI_DEF,
(char_u *)&p_re, PV_NONE,
{(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
+ {"regone", "rgo", P_BOOL|P_VI_DEF|P_VIM,
+ (char_u *)&p_rgo, PV_NONE,
+ {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"relativenumber", "rnu", P_BOOL|P_VI_DEF|P_RWIN,
(char_u *)VAR_WIN, PV_RNU,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
diff --git a/src/option.h b/src/option.h
--- a/src/option.h
+++ b/src/option.h
@@ -655,6 +655,7 @@
EXTERN long p_rdt; /* 'redrawtime' */
#endif
EXTERN int p_remap; /* 'remap' */
+EXTERN int p_rgo; /* 'regone' */
EXTERN long p_re; /* 'regexpengine' */
EXTERN long p_report; /* 'report' */
#if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)