Works like a charm, Christian.

Bram, I'd love to have a negative sts mean that it's the same as sw. The reason 
I suggested a zero value is for consistency, in that setting sw=0 means use the 
sts value. I'd recommend allowing sw to be negative if we go ahead with this.

Attached is Christian's diff modified so that sts falls back to sw instead of 
ts.




On Wednesday, October 3, 2012 6:53:30 AM UTC-7, Milan Vancura wrote:
> Hi Bram.
> 
> 
> 
> > It might make more sense to have a negative 'sts' value mean that
> 
> > 'shiftwidth' is used.
> 
> 
> 
> Yes, this is what I do for years: sw and sts set to the same value (and to try
> 
> to not forget to change the second when changing the first). It would be a
> 
> pretty enhancement if sts followed sw value automatically.
> 
> 
> 
> Milan Van�ura

-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
diff -r 04592728474a runtime/doc/options.txt
--- a/runtime/doc/options.txt	Fri Sep 21 14:54:30 2012 +0200
+++ b/runtime/doc/options.txt	Wed Oct 03 15:16:39 2012 -0700
@@ -6383,6 +6383,7 @@
 	of 8, while being able to edit like it is set to 'sts'.  However,
 	commands like "x" still work on the actual characters.
 	When 'sts' is zero, this feature is off.
+	When 'sts' is negative, the value of 'ts' is used.
 	'softtabstop' is set to 0 when the 'paste' option is set.
 	See also |ins-expandtab|.  When 'expandtab' is not set, the number of
 	spaces is minimized by using <Tab>s.
diff -r 04592728474a src/edit.c
--- a/src/edit.c	Fri Sep 21 14:54:30 2012 +0200
+++ b/src/edit.c	Wed Oct 03 15:16:39 2012 -0700
@@ -8885,7 +8885,7 @@
 	 */
 	if (	   mode == BACKSPACE_CHAR
 		&& ((p_sta && in_indent)
-		    || (curbuf->b_p_sts != 0
+		    || (get_sts_value() != 0
 			&& curwin->w_cursor.col > 0
 			&& (*(ml_get_cursor() - 1) == TAB
 			    || (*(ml_get_cursor() - 1) == ' '
@@ -8901,7 +8901,7 @@
 	    if (p_sta && in_indent)
 		ts = (int)get_sw_value();
 	    else
-		ts = (int)curbuf->b_p_sts;
+		ts = (int)get_sts_value();
 	    /* Compute the virtual column where we want to be.  Since
 	     * 'showbreak' may get in the way, need to get the last column of
 	     * the previous character. */
@@ -9590,7 +9590,7 @@
      */
     if (!curbuf->b_p_et
 	    && !(p_sta && ind && curbuf->b_p_ts != get_sw_value())
-	    && curbuf->b_p_sts == 0)
+	    && get_sts_value() == 0)
 	return TRUE;
 
     if (stop_arrow() == FAIL)
@@ -9606,8 +9606,8 @@
 
     if (p_sta && ind)		/* insert tab in indent, use 'shiftwidth' */
 	temp = (int)get_sw_value();
-    else if (curbuf->b_p_sts > 0) /* use 'softtabstop' when set */
-	temp = (int)curbuf->b_p_sts;
+    else if (curbuf->b_p_sts != 0) /* use 'softtabstop' when set */
+	temp = (int)get_sts_value();
     else			/* otherwise use 'tabstop' */
 	temp = (int)curbuf->b_p_ts;
     temp -= get_nolist_virtcol() % temp;
@@ -9635,7 +9635,7 @@
     /*
      * When 'expandtab' not set: Replace spaces by TABs where possible.
      */
-    if (!curbuf->b_p_et && (curbuf->b_p_sts || (p_sta && ind)))
+    if (!curbuf->b_p_et && (get_sts_value() || (p_sta && ind)))
     {
 	char_u		*ptr;
 #ifdef FEAT_VREPLACE
diff -r 04592728474a src/option.c
--- a/src/option.c	Fri Sep 21 14:54:30 2012 +0200
+++ b/src/option.c	Wed Oct 03 15:16:39 2012 -0700
@@ -8509,11 +8509,6 @@
 	    p_window = Rows - 1;
     }
 
-    if (curbuf->b_p_sts < 0)
-    {
-	errmsg = e_positive;
-	curbuf->b_p_sts = 0;
-    }
     if (curbuf->b_p_ts <= 0)
     {
 	errmsg = e_positive;
@@ -11429,3 +11424,13 @@
 {
     return curbuf->b_p_sw ? curbuf->b_p_sw : curbuf->b_p_ts;
 }
+
+/*
+ * Return the effective softtabstop value for current buffer, using the
+ * 'tabstop' value when 'softtabstop' is zero.
+ */
+    long
+get_sts_value()
+{
+    return curbuf->b_p_sts < 0 ? get_sw_value() : curbuf->b_p_sts;
+}
diff -r 04592728474a src/proto/option.pro
--- a/src/proto/option.pro	Fri Sep 21 14:54:30 2012 +0200
+++ b/src/proto/option.pro	Wed Oct 03 15:16:39 2012 -0700
@@ -57,4 +57,5 @@
 int file_ff_differs __ARGS((buf_T *buf, int ignore_empty));
 int check_ff_value __ARGS((char_u *p));
 long get_sw_value __ARGS((void));
+long get_sts_value __ARGS((void));
 /* vim: set ft=c : */

Raspunde prin e-mail lui