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 : */