Problem: 'showbreak' cannot be set for one window.
Solution: Make 'showbreak' global-local.
*'showbreak'* *'sbr'* *E595*
'showbreak' 'sbr' string (default "")
- global
+ global or local to window |global-local|
{not available when compiled without the |+linebreak|
feature}
String to put at the start of lines that have been wrapped. Useful
Note that tabs after the showbreak will be displayed differently.
If you want the 'showbreak' to appear in between line numbers, add the
"n" flag to 'cpoptions'.
-
+ A window-local value overrules a global value. If the global value is
+ set and you want no value in the current window use NONE: >
+ :setlocal showbreak=NONE
+<
*'showcmd'* *'sc'* *'noshowcmd'* *'nosc'*
'showcmd' 'sc' boolean (Vim default: on, off for Unix,
Vi default: off, set in |defaults.vim|)
colnr_T col)
{
#ifdef FEAT_LINEBREAK
- if (!curwin->w_p_lbr && *p_sbr == NUL && !curwin->w_p_bri)
+ if (!curwin->w_p_lbr && *get_showbreak_value(curwin) == NUL
+ && !curwin->w_p_bri)
{
#endif
if (curwin->w_p_wrap)
char_u *ps;
int tab_corr = (*s == TAB);
int n;
+ char_u *sbr;
/*
* No 'linebreak', 'showbreak' and 'breakindent': return quickly.
*/
- if (!wp->w_p_lbr && !wp->w_p_bri && *p_sbr == NUL)
+ if (!wp->w_p_lbr && !wp->w_p_bri && *get_showbreak_value(wp) == NUL)
#endif
{
if (wp->w_p_wrap)
* Set *headp to the size of what we add.
*/
added = 0;
- if ((*p_sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0)
+ sbr = get_showbreak_value(wp);
+ if ((*sbr != NUL || wp->w_p_bri) && wp->w_p_wrap && col != 0)
{
colnr_T sbrlen = 0;
int numberwidth = win_col_off(wp);
numberextra = wp->w_width - (numberextra - win_col_off2(wp));
if (col >= numberextra && numberextra > 0)
col %= numberextra;
- if (*p_sbr != NUL)
+ if (*sbr != NUL)
{
- sbrlen = (colnr_T)MB_CHARLEN(p_sbr);
+ sbrlen = (colnr_T)MB_CHARLEN(sbr);
if (col >= sbrlen)
col -= sbrlen;
}
if (col == 0 || col + size + sbrlen > (colnr_T)wp->w_width)
{
added = 0;
- if (*p_sbr != NUL)
+ if (*sbr != NUL)
{
if (size + sbrlen + numberwidth > (colnr_T)wp->w_width)
{
if (width <= 0)
width = (colnr_T)1;
- added += ((size - prev_width) / width) * vim_strsize(p_sbr);
+ added += ((size - prev_width) / width) * vim_strsize(sbr);
if ((size - prev_width) % width)
// wrapped, add another length of 'sbr'
- added += vim_strsize(p_sbr);
+ added += vim_strsize(sbr);
}
else
- added += vim_strsize(p_sbr);
+ added += vim_strsize(sbr);
}
if (wp->w_p_bri)
added += get_breakindent_win(wp, line);
*/
if ((!wp->w_p_list || lcs_tab1 != NUL)
#ifdef FEAT_LINEBREAK
- && !wp->w_p_lbr && *p_sbr == NUL && !wp->w_p_bri
+ && !wp->w_p_lbr && *get_showbreak_value(wp) == NUL && !wp->w_p_bri
#endif
)
{
#ifdef FEAT_LINEBREAK
if (wp->w_p_brisbr && draw_state == WL_BRI - 1
- && n_extra == 0 && *p_sbr != NUL)
+ && n_extra == 0 && *get_showbreak_value(wp) != NUL)
// draw indent after showbreak value
draw_state = WL_BRI;
else if (wp->w_p_brisbr && draw_state == WL_SBR && n_extra == 0)
#if defined(FEAT_LINEBREAK) || defined(FEAT_DIFF)
if (draw_state == WL_SBR - 1 && n_extra == 0)
{
+ char_u *sbr;
+
draw_state = WL_SBR;
# ifdef FEAT_DIFF
if (filler_todo > 0)
}
# endif
# ifdef FEAT_LINEBREAK
- if (*p_sbr != NUL && need_showbreak)
+ sbr = get_showbreak_value(wp);
+ if (*sbr != NUL && need_showbreak)
{
// Draw 'showbreak' at the start of each broken line.
- p_extra = p_sbr;
+ p_extra = sbr;
c_extra = NUL;
c_final = NUL;
- n_extra = (int)STRLEN(p_sbr);
+ n_extra = (int)STRLEN(sbr);
char_attr = HL_ATTR(HLF_AT);
need_showbreak = FALSE;
- vcol_sbr = vcol + MB_CHARLEN(p_sbr);
+ vcol_sbr = vcol + MB_CHARLEN(sbr);
// Correct end of highlighted area for 'showbreak',
// required when 'linebreak' is also set.
if (tocol == vcol)
int tab_len = 0;
long vcol_adjusted = vcol; // removed showbreak length
#ifdef FEAT_LINEBREAK
+ char_u *sbr = get_showbreak_value(wp);
+
// only adjust the tab_len, when at the first column
// after the showbreak value was drawn
- if (*p_sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap)
- vcol_adjusted = vcol - MB_CHARLEN(p_sbr);
+ if (*sbr != NUL && vcol == vcol_sbr && wp->w_p_wrap)
+ vcol_adjusted = vcol - MB_CHARLEN(sbr);
#endif
// tab amount depends on current column
#ifdef FEAT_VARTABS
/* getviscol() is slow, skip it when 'showbreak' is empty,
* 'breakindent' is not set and there are no multi-byte
* characters */
- if ((*p_sbr == NUL && !curwin->w_p_bri
+ if ((*get_showbreak_value(curwin) == NUL && !curwin->w_p_bri
&& !has_mbyte) || getviscol() < v)
break;
++width;
/* long line wrapping, adjust curwin->w_wrow */
if (curwin->w_wcol >= curwin->w_width)
{
+ char_u *sbr;
+
/* this same formula is used in validate_cursor_col() */
n = (curwin->w_wcol - curwin->w_width) / width + 1;
curwin->w_wcol -= n * width;
/* When cursor wraps to first char of next line in Insert
* mode, the 'showbreak' string isn't shown, backup to first
* column */
- if (*p_sbr && *ml_get_cursor() == NUL
- && curwin->w_wcol == (int)vim_strsize(p_sbr))
+ sbr = get_showbreak_value(curwin);
+ if (*sbr && *ml_get_cursor() == NUL
+ && curwin->w_wcol == (int)vim_strsize(sbr))
curwin->w_wcol = 0;
#endif
}
{
# ifdef FEAT_LINEBREAK
char_u *saved_sbr = p_sbr;
+ char_u *saved_w_sbr = curwin->w_p_sbr;
/* Make 'sbr' empty for a moment to get the correct size. */
p_sbr = empty_option;
+ curwin->w_p_sbr = empty_option;
# endif
getvcols(curwin, &curwin->w_cursor, &VIsual, &leftcol, &rightcol);
# ifdef FEAT_LINEBREAK
p_sbr = saved_sbr;
+ curwin->w_p_sbr = saved_w_sbr;
# endif
sprintf((char *)showcmd_buf, "%ldx%ld", lines,
(long)(rightcol - leftcol + 1));
validate_virtcol();
virtcol = curwin->w_virtcol;
#if defined(FEAT_LINEBREAK)
- if (virtcol > (colnr_T)width1 && *p_sbr != NUL)
- virtcol -= vim_strsize(p_sbr);
+ if (virtcol > (colnr_T)width1 && *get_showbreak_value(curwin) != NUL)
+ virtcol -= vim_strsize(get_showbreak_value(curwin));
#endif
if (virtcol > curwin->w_curswant
{
#ifdef FEAT_LINEBREAK
char_u * saved_sbr = p_sbr;
+ char_u * saved_w_sbr = curwin->w_p_sbr;
/* Make 'sbr' empty for a moment to get the correct size. */
p_sbr = empty_option;
+ curwin->w_p_sbr = empty_option;
#endif
oparg.is_VIsual = 1;
oparg.block_mode = TRUE;
&oparg.start_vcol, &oparg.end_vcol);
#ifdef FEAT_LINEBREAK
p_sbr = saved_sbr;
+ curwin->w_p_sbr = saved_w_sbr;
#endif
if (curwin->w_curswant == MAXCOL)
oparg.end_vcol = MAXCOL;
clear_string_option(&buf->b_p_cm);
break;
#endif
+#ifdef FEAT_LINEBREAK
+ case PV_SBR:
+ clear_string_option(&((win_T *)from)->w_p_sbr);
+ break;
+#endif
#ifdef FEAT_STL_OPT
case PV_STL:
clear_string_option(&((win_T *)from)->w_p_stl);
#if defined(FEAT_CRYPT)
case PV_CM: return (char_u *)&(curbuf->b_p_cm);
#endif
+#ifdef FEAT_LINEBREAK
+ case PV_SBR: return (char_u *)&(curwin->w_p_sbr);
+#endif
#ifdef FEAT_STL_OPT
case PV_STL: return (char_u *)&(curwin->w_p_stl);
#endif
case PV_CM: return *curbuf->b_p_cm != NUL
? (char_u *)&(curbuf->b_p_cm) : p->var;
#endif
+#ifdef FEAT_LINEBREAK
+ case PV_SBR: return *curwin->w_p_sbr != NUL
+ ? (char_u *)&(curwin->w_p_sbr) : p->var;
+#endif
#ifdef FEAT_STL_OPT
case PV_STL: return *curwin->w_p_stl != NUL
? (char_u *)&(curwin->w_p_stl) : p->var;
to->wo_rl = from->wo_rl;
to->wo_rlc = vim_strsave(from->wo_rlc);
#endif
+#ifdef FEAT_LINEBREAK
+ to->wo_sbr = vim_strsave(from->wo_sbr);
+#endif
#ifdef FEAT_STL_OPT
to->wo_stl = vim_strsave(from->wo_stl);
#endif
#ifdef FEAT_RIGHTLEFT
check_string_option(&wop->wo_rlc);
#endif
+#ifdef FEAT_LINEBREAK
+ check_string_option(&wop->wo_sbr);
+#endif
#ifdef FEAT_STL_OPT
check_string_option(&wop->wo_stl);
#endif
#ifdef FEAT_RIGHTLEFT
clear_string_option(&wop->wo_rlc);
#endif
+#ifdef FEAT_LINEBREAK
+ clear_string_option(&wop->wo_sbr);
+#endif
#ifdef FEAT_STL_OPT
clear_string_option(&wop->wo_stl);
#endif
return buf->b_bkc_flags ? buf->b_bkc_flags : bkc_flags;
}
+#if defined(FEAT_LINEBREAK) || defined(PROTO)
+/*
+ * Get the local or global value of 'showbreak'.
+ */
+ char_u *
+get_showbreak_value(win_T *win)
+{
+ if (win->w_p_sbr == NULL || *win->w_p_sbr == NUL)
+ return p_sbr;
+ if (STRCMP(win->w_p_sbr, "NONE") == 0)
+ return empty_option;
+ return win->w_p_sbr;
+}
+#endif
+
#if defined(FEAT_SIGNS) || defined(PROTO)
/*
* Return TRUE when window "wp" has a column to draw signs in.
, WV_CULOPT
, WV_CC
#endif
+#ifdef FEAT_LINEBREAK
+ , WV_SBR
+#endif
#ifdef FEAT_STL_OPT
, WV_STL
#endif
# define PV_CULOPT OPT_WIN(WV_CULOPT)
# define PV_CC OPT_WIN(WV_CC)
#endif
+#ifdef FEAT_LINEBREAK
+# define PV_SBR OPT_BOTH(OPT_WIN(WV_SBR))
+#endif
#ifdef FEAT_STL_OPT
# define PV_STL OPT_BOTH(OPT_WIN(WV_STL))
#endif
{(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
{"showbreak", "sbr", P_STRING|P_VI_DEF|P_RALL,
#ifdef FEAT_LINEBREAK
- (char_u *)&p_sbr, PV_NONE,
+ (char_u *)&p_sbr, PV_SBR,
#else
(char_u *)NULL, PV_NONE,
#endif
#ifdef FEAT_LINEBREAK
// 'showbreak'
- else if (varp == &p_sbr)
+ else if (gvarp == &p_sbr)
{
- for (s = p_sbr; *s; )
+ for (s = *varp; *s; )
{
if (ptr2cells(s) != 1)
- errmsg = N_("E595: contains unprintable or wide character");
+ errmsg = N_("E595: 'showbreak' contains unprintable or wide character");
MB_PTR_ADV(s);
}
}
void find_mps_values(int *initc, int *findc, int *backwards, int switchit);
int briopt_check(win_T *wp);
unsigned int get_bkc_value(buf_T *buf);
+char_u *get_showbreak_value(win_T *win);
int signcolumn_on(win_T *wp);
dict_T *get_winbuf_options(int bufopt);
int fill_culopt_flags(char_u *val, win_T *wp);
char_u *wo_cc;
# define w_p_cc w_onebuf_opt.wo_cc // 'colorcolumn'
#endif
+#ifdef FEAT_LINEBREAK
+ char_u *wo_sbr;
+#define w_p_sbr w_onebuf_opt.wo_sbr // 'showbreak'
+#endif
#ifdef FEAT_STL_OPT
char_u *wo_stl;
#define w_p_stl w_onebuf_opt.wo_stl // 'statusline'
func Test_breakindent02()
" simple breakindent test with showbreak set
- call s:test_windows('setl briopt=min:0 sbr=>>')
+ set sbr=>>
+ call s:test_windows('setl briopt=min:0 sbr=')
let lines = s:screen_lines(line('.'),8)
let expect = [
\ " abcd",
func Test_breakindent04()
" breakindent set with min width 18
- call s:test_windows('setl sbr= briopt=min:18')
+ set sbr=<<<
+ call s:test_windows('setl sbr=NONE briopt=min:18')
let lines = s:screen_lines(line('.'),8)
let expect = [
\ " abcd",
call s:compare_lines(expect, lines)
" clean up
call s:close_windows('set sbr=')
+ set sbr=
endfunc
func Test_breakindent04_vartabs()
let [hiCursorLine, hi_ul, hi_bg] = HiCursorLine()
call NewWindow('topleft 5', 10)
+ set showbreak=xxx
setlocal breakindent breakindentopt=min:0,shift:1 showbreak=>
call setline(1, ' ' . repeat('a', 9) . 'bcd')
call matchadd('Search', '\n')
call CloseWindow()
set showbreak=
+ setlocal showbreak=
exe hiCursorLine
endfunc
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 2281,
/**/
2280,
/**/