summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/options.txt8
-rw-r--r--src/indent.c24
-rw-r--r--src/structs.h6
-rw-r--r--src/testdir/test_breakindent.vim62
-rw-r--r--src/version.c2
5 files changed, 91 insertions, 11 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index cd048456d..689c9a28c 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1392,14 +1392,20 @@ A jump table for the options with a short description can be found at |Q_op|.
characters. It permits dynamic French paragraph
indentation (negative) or emphasizing the line
continuation (positive).
+ (default: 0)
sbr Display the 'showbreak' value before applying the
additional indent.
+ (default: off)
list:{n} Adds an additional indent for lines that match a
numbered or bulleted list (using the
'formatlistpat' setting).
list:-1 Uses the length of a match with 'formatlistpat'
for indentation.
- The default value for min is 20, shift and list is 0.
+ (default: 0)
+ column:{n} Indent at column {n}. Will overrule the other
+ sub-options. Note: an additional indent may be
+ added for the 'showbreak' setting.
+ (default: off)
*'browsedir'* *'bsdir'*
'browsedir' 'bsdir' string (default: "last")
diff --git a/src/indent.c b/src/indent.c
index 9efa52753..e8892b517 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -866,6 +866,7 @@ briopt_check(win_T *wp)
long bri_min = 20;
int bri_sbr = FALSE;
int bri_list = 0;
+ int bri_vcol = 0;
p = wp->w_p_briopt;
while (*p != NUL)
@@ -891,6 +892,11 @@ briopt_check(win_T *wp)
p += 5;
bri_list = getdigits(&p);
}
+ else if (STRNCMP(p, "column:", 7) == 0)
+ {
+ p += 7;
+ bri_vcol = getdigits(&p);
+ }
if (*p != ',' && *p != NUL)
return FAIL;
if (*p == ',')
@@ -901,6 +907,7 @@ briopt_check(win_T *wp)
wp->w_briopt_min = bri_min;
wp->w_briopt_sbr = bri_sbr;
wp->w_briopt_list = bri_list;
+ wp->w_briopt_vcol = bri_vcol;
return OK;
}
@@ -953,11 +960,13 @@ get_breakindent_win(
prev_tick = CHANGEDTICK(wp->w_buffer);
# ifdef FEAT_VARTABS
prev_vts = wp->w_buffer->b_p_vts_array;
- prev_indent = get_indent_str_vtab(line,
+ if (wp->w_briopt_vcol == 0)
+ prev_indent = get_indent_str_vtab(line,
(int)wp->w_buffer->b_p_ts,
wp->w_buffer->b_p_vts_array, wp->w_p_list);
# else
- prev_indent = get_indent_str(line,
+ if (wp->w_briopt_vcol == 0)
+ prev_indent = get_indent_str(line,
(int)wp->w_buffer->b_p_ts, wp->w_p_list);
# endif
prev_listopt = wp->w_briopt_list;
@@ -965,7 +974,7 @@ get_breakindent_win(
vim_free(prev_flp);
prev_flp = vim_strsave(get_flp_value(wp->w_buffer));
// add additional indent for numbered lists
- if (wp->w_briopt_list != 0)
+ if (wp->w_briopt_list != 0 && wp->w_briopt_vcol == 0)
{
regmatch_T regmatch;
@@ -986,7 +995,14 @@ get_breakindent_win(
}
}
}
- bri = prev_indent + wp->w_briopt_shift;
+ if (wp->w_briopt_vcol != 0)
+ {
+ // column value has priority
+ bri = wp->w_briopt_vcol;
+ prev_list = 0;
+ }
+ else
+ bri = prev_indent + wp->w_briopt_shift;
// Add offset for number column, if 'n' is in 'cpoptions'
bri += win_col_off2(wp);
diff --git a/src/structs.h b/src/structs.h
index 3135616dd..1a607c65e 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -3215,7 +3215,7 @@ struct diffblock_S
#endif
#define SNAP_HELP_IDX 0
-#define SNAP_AUCMD_IDX 1
+#define SNAP_AUCMD_IDX 1
#define SNAP_COUNT 2
/*
@@ -3312,7 +3312,8 @@ struct frame_S
// for first
// fr_child and fr_win are mutually exclusive
frame_T *fr_child; // first contained frame
- win_T *fr_win; // window that fills this frame
+ win_T *fr_win; // window that fills this frame; for a snapshot
+ // set to the current window
};
#define FR_LEAF 0 // frame is a leaf
@@ -3742,6 +3743,7 @@ struct window_S
int w_briopt_shift; // additional shift for breakindent
int w_briopt_sbr; // sbr in 'briopt'
int w_briopt_list; // additional indent for lists
+ int w_briopt_vcol; // indent for specific column
#endif
long w_scbind_pos;
diff --git a/src/testdir/test_breakindent.vim b/src/testdir/test_breakindent.vim
index 9b6106d7b..8f8f2c4f1 100644
--- a/src/testdir/test_breakindent.vim
+++ b/src/testdir/test_breakindent.vim
@@ -837,16 +837,17 @@ endfunc
func Test_window_resize_with_linebreak()
new
53vnew
- set linebreak
- set showbreak=>>
- set breakindent
- set breakindentopt=shift:4
+ setl linebreak
+ setl showbreak=>>
+ setl breakindent
+ setl breakindentopt=shift:4
call setline(1, "\naaaaaaaaa\n\na\naaaaa\n¯aaaaaaaaaa\naaaaaaaaaaaa\naaa\n\"a:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - aaaaaaaa\"\naaaaaaaa\n\"a")
redraw!
call assert_equal([" >>aa^@\"a: "], ScreenLines(2, 14))
vertical resize 52
redraw!
call assert_equal([" >>aaa^@\"a:"], ScreenLines(2, 14))
+ set linebreak& showbreak& breakindent& breakindentopt&
%bw!
endfunc
@@ -943,4 +944,57 @@ func Test_no_extra_indent()
bwipeout!
endfunc
+func Test_breakindent_column()
+ " restore original
+ let s:input ="\tabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP"
+ call s:test_windows('setl breakindent breakindentopt=column:10')
+ redraw!
+ " 1) default: does not indent, too wide :(
+ let expect = [
+ \ " ",
+ \ " abcdefghijklmnop",
+ \ "qrstuvwxyzABCDEFGHIJ",
+ \ "KLMNOP "
+ \ ]
+ let lines = s:screen_lines2(1, 4, 20)
+ call s:compare_lines(expect, lines)
+ " 2) lower min value, so that breakindent works
+ setl breakindentopt+=min:5
+ redraw!
+ let expect = [
+ \ " ",
+ \ " abcdefghijklmnop",
+ \ " qrstuvwxyz",
+ \ " ABCDEFGHIJ",
+ \ " KLMNOP "
+ \ ]
+ let lines = s:screen_lines2(1, 5, 20)
+ " 3) set shift option -> no influence
+ setl breakindentopt+=shift:5
+ redraw!
+ let expect = [
+ \ " ",
+ \ " abcdefghijklmnop",
+ \ " qrstuvwxyz",
+ \ " ABCDEFGHIJ",
+ \ " KLMNOP "
+ \ ]
+ let lines = s:screen_lines2(1, 5, 20)
+ call s:compare_lines(expect, lines)
+ " 4) add showbreak value
+ setl showbreak=++
+ redraw!
+ let expect = [
+ \ " ",
+ \ " abcdefghijklmnop",
+ \ " ++qrstuvwx",
+ \ " ++yzABCDEF",
+ \ " ++GHIJKLMN",
+ \ " ++OP "
+ \ ]
+ let lines = s:screen_lines2(1, 6, 20)
+ call s:compare_lines(expect, lines)
+ bwipeout!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 301c5831a..4cb930fd6 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4882,
+/**/
4881,
/**/
4880,