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)