# HG changeset patch # User Bram Moolenaar # Date 1344441665 -7200 # Node ID 7de7ef01288db1abc944293a28aac13ddd87879e # Parent 8f80a615ba033f002b710856e9dd535044e6bcb0 updated for version 7.3.629 Problem: There is no way to make 'shiftwidth' follow 'tabstop'. Solution: When 'shiftwidth' is zero use the value of 'tabstop'. (Christian Brabandt) diff --git a/src/edit.c b/src/edit.c --- a/src/edit.c +++ b/src/edit.c @@ -8899,9 +8899,9 @@ ins_bs(c, mode, inserted_space_p) *inserted_space_p = FALSE; if (p_sta && in_indent) - ts = curbuf->b_p_sw; + ts = (int)get_sw_value(); else - ts = curbuf->b_p_sts; + ts = (int)curbuf->b_p_sts; /* 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. */ @@ -9589,7 +9589,7 @@ ins_tab() * When nothing special, insert TAB like a normal character */ if (!curbuf->b_p_et - && !(p_sta && ind && curbuf->b_p_ts != curbuf->b_p_sw) + && !(p_sta && ind && curbuf->b_p_ts != get_sw_value()) && curbuf->b_p_sts == 0) return TRUE; @@ -9605,7 +9605,7 @@ ins_tab() AppendToRedobuff((char_u *)"\t"); if (p_sta && ind) /* insert tab in indent, use 'shiftwidth' */ - temp = (int)curbuf->b_p_sw; + temp = (int)get_sw_value(); else if (curbuf->b_p_sts > 0) /* use 'softtabstop' when set */ temp = (int)curbuf->b_p_sts; else /* otherwise use 'tabstop' */ diff --git a/src/ex_getln.c b/src/ex_getln.c --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2268,10 +2268,12 @@ getexmodeline(promptc, cookie, indent) if (c1 == Ctrl_T) { + long sw = get_sw_value(); + p = (char_u *)line_ga.ga_data; p[line_ga.ga_len] = NUL; indent = get_indent_str(p, 8); - indent += curbuf->b_p_sw - indent % curbuf->b_p_sw; + indent += sw - indent % sw; add_indent: while (get_indent_str(p, 8) < indent) { @@ -2323,7 +2325,7 @@ redraw: p[line_ga.ga_len] = NUL; indent = get_indent_str(p, 8); --indent; - indent -= indent % curbuf->b_p_sw; + indent -= indent % get_sw_value(); } while (get_indent_str(p, 8) > indent) { diff --git a/src/fold.c b/src/fold.c --- a/src/fold.c +++ b/src/fold.c @@ -3025,7 +3025,7 @@ foldlevelIndent(flp) flp->lvl = -1; } else - flp->lvl = get_indent_buf(buf, lnum) / buf->b_p_sw; + flp->lvl = get_indent_buf(buf, lnum) / get_sw_value(); if (flp->lvl > flp->wp->w_p_fdn) { flp->lvl = flp->wp->w_p_fdn; diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -1389,9 +1389,11 @@ open_line(dir, flags, second_line_indent #ifdef FEAT_SMARTINDENT if (did_si) { + int sw = (int)get_sw_value(); + if (p_sr) - newindent -= newindent % (int)curbuf->b_p_sw; - newindent += (int)curbuf->b_p_sw; + newindent -= newindent % sw; + newindent += sw; } #endif /* Copy the indent */ @@ -6461,11 +6463,14 @@ find_last_paren(l, start, end) int get_c_indent() { + int sw = (int)get_sw_value(); + /* * spaces from a block's opening brace the prevailing indent for that * block should be */ - int ind_level = curbuf->b_p_sw; + + int ind_level = sw; /* * spaces from the edge of the line an open brace that's at the end of a @@ -6512,12 +6517,12 @@ get_c_indent() /* * spaces from the switch() indent a "case xx" label should be located */ - int ind_case = curbuf->b_p_sw; + int ind_case = sw; /* * spaces from the "case xx:" code after a switch() should be located */ - int ind_case_code = curbuf->b_p_sw; + int ind_case_code = sw; /* * lineup break at end of case in switch() with case label @@ -6528,45 +6533,45 @@ get_c_indent() * spaces from the class declaration indent a scope declaration label * should be located */ - int ind_scopedecl = curbuf->b_p_sw; + int ind_scopedecl = sw; /* * spaces from the scope declaration label code should be located */ - int ind_scopedecl_code = curbuf->b_p_sw; + int ind_scopedecl_code = sw; /* * amount K&R-style parameters should be indented */ - int ind_param = curbuf->b_p_sw; + int ind_param = sw; /* * amount a function type spec should be indented */ - int ind_func_type = curbuf->b_p_sw; + int ind_func_type = sw; /* * amount a cpp base class declaration or constructor initialization * should be indented */ - int ind_cpp_baseclass = curbuf->b_p_sw; + int ind_cpp_baseclass = sw; /* * additional spaces beyond the prevailing indent a continuation line * should be located */ - int ind_continuation = curbuf->b_p_sw; + int ind_continuation = sw; /* * spaces from the indent of the line with an unclosed parentheses */ - int ind_unclosed = curbuf->b_p_sw * 2; + int ind_unclosed = sw * 2; /* * spaces from the indent of the line with an unclosed parentheses, which * itself is also unclosed */ - int ind_unclosed2 = curbuf->b_p_sw; + int ind_unclosed2 = sw; /* * suppress ignoring spaces from the indent of a line starting with an @@ -6719,12 +6724,12 @@ get_c_indent() if (*options == 's') /* "2s" means two times 'shiftwidth' */ { if (options == digits) - n = curbuf->b_p_sw; /* just "s" is one 'shiftwidth' */ + n = sw; /* just "s" is one 'shiftwidth' */ else { - n *= curbuf->b_p_sw; + n *= sw; if (divider) - n += (curbuf->b_p_sw * fraction + divider / 2) / divider; + n += (sw * fraction + divider / 2) / divider; } ++options; } diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -332,7 +332,7 @@ shift_line(left, round, amount, call_cha { int count; int i, j; - int p_sw = (int)curbuf->b_p_sw; + int p_sw = (int)get_sw_value(); count = get_indent(); /* get current indent */ @@ -388,7 +388,7 @@ shift_block(oap, amount) int total; char_u *newp, *oldp; int oldcol = curwin->w_cursor.col; - int p_sw = (int)curbuf->b_p_sw; + int p_sw = (int)get_sw_value(); int p_ts = (int)curbuf->b_p_ts; struct block_def bd; int incr; diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -8125,7 +8125,7 @@ set_num_option(opt_idx, varp, value, err need_mouse_correct = TRUE; #endif - if (curbuf->b_p_sw <= 0) + if (curbuf->b_p_sw < 0) { errmsg = e_positive; curbuf->b_p_sw = curbuf->b_p_ts; @@ -11419,3 +11419,13 @@ check_ff_value(p) { return check_opt_strings(p, p_ff_values, FALSE); } + +/* + * Return the effective shiftwidth value for current buffer, using the + * 'tabstop' value when 'shiftwidth' is zero. + */ + long +get_sw_value() +{ + return curbuf->b_p_sw ? curbuf->b_p_sw : curbuf->b_p_ts; +} diff --git a/src/proto/option.pro b/src/proto/option.pro --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -56,4 +56,5 @@ int can_bs __ARGS((int what)); void save_file_ff __ARGS((buf_T *buf)); 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)); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 629, +/**/ 628, /**/ 627,