mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	feat(ui): sign/statuscolumn can combine highlight attrs #31575
Problem:
Since e049c6e4c0, most statusline-like UI elements can combine
highlight attrs, except for sign/statuscolumn.
Solution:
Implement for sign/statuscolumn.
			
			
This commit is contained in:
		@@ -307,7 +307,7 @@ UI
 | 
			
		||||
  which controls the tool used to open the given path or URL. If you want to
 | 
			
		||||
  globally set this, you can override vim.ui.open using the same approach
 | 
			
		||||
  described at |vim.paste()|.
 | 
			
		||||
- `vim.ui.open()` now supports
 | 
			
		||||
• `vim.ui.open()` now supports
 | 
			
		||||
  [lemonade](https://github.com/lemonade-command/lemonade) as an option for
 | 
			
		||||
  opening urls/files. This is handy if you are in an ssh connection and use
 | 
			
		||||
  `lemonade`.
 | 
			
		||||
@@ -317,7 +317,6 @@ UI
 | 
			
		||||
  |hl-PmenuMatch|.
 | 
			
		||||
• |vim.diagnostic.setqflist()| updates an existing quickfix list with the
 | 
			
		||||
  given title if found
 | 
			
		||||
 | 
			
		||||
• |ui-messages| content chunks now also contain the highlight group ID.
 | 
			
		||||
 | 
			
		||||
==============================================================================
 | 
			
		||||
@@ -339,9 +338,9 @@ These existing features changed their behavior.
 | 
			
		||||
  more emoji characters than before, including those encoded with multiple
 | 
			
		||||
  emoji codepoints combined with ZWJ (zero width joiner) codepoints.
 | 
			
		||||
 | 
			
		||||
• Text in the 'statusline', 'tabline', and 'winbar' now inherits highlights
 | 
			
		||||
  from the respective |hl-StatusLine|, |hl-TabLine|, and |hl-WinBar| highlight
 | 
			
		||||
  groups.
 | 
			
		||||
• Custom highlights in 'rulerformat', 'statuscolumn', 'statusline', 'tabline',
 | 
			
		||||
  'winbar' and the number column (through |:sign-define| `numhl`) now combine
 | 
			
		||||
  with their respective highlight groups, as opposed to |hl-Normal|.
 | 
			
		||||
 | 
			
		||||
• |vim.on_key()| callbacks won't be invoked recursively when a callback itself
 | 
			
		||||
  consumes input.
 | 
			
		||||
 
 | 
			
		||||
@@ -462,10 +462,12 @@ void fill_foldcolumn(win_T *wp, foldinfo_T foldinfo, linenr_T lnum, int attr, in
 | 
			
		||||
static void draw_sign(bool nrcol, win_T *wp, winlinevars_T *wlv, int sign_idx, int sign_cul_attr)
 | 
			
		||||
{
 | 
			
		||||
  SignTextAttrs sattr = wlv->sattrs[sign_idx];
 | 
			
		||||
  int scl_attr = win_hl_attr(wp, use_cursor_line_highlight(wp, wlv->lnum) ? HLF_CLS : HLF_SC);
 | 
			
		||||
 | 
			
		||||
  if (sattr.text[0] && wlv->row == wlv->startrow + wlv->filler_lines && wlv->filler_todo <= 0) {
 | 
			
		||||
    int attr = (use_cursor_line_highlight(wp, wlv->lnum) && sign_cul_attr)
 | 
			
		||||
               ? sign_cul_attr : sattr.hl_id ? syn_id2attr(sattr.hl_id) : 0;
 | 
			
		||||
    attr = hl_combine_attr(scl_attr, attr);
 | 
			
		||||
    int fill = nrcol ? number_width(wp) + 1 : SIGN_WIDTH;
 | 
			
		||||
    draw_col_fill(wlv, schar_from_ascii(' '), fill, attr);
 | 
			
		||||
    int sign_pos = wlv->off - SIGN_WIDTH - (int)nrcol;
 | 
			
		||||
@@ -474,8 +476,7 @@ static void draw_sign(bool nrcol, win_T *wp, winlinevars_T *wlv, int sign_idx, i
 | 
			
		||||
    linebuf_char[sign_pos + 1] = sattr.text[1];
 | 
			
		||||
  } else {
 | 
			
		||||
    assert(!nrcol);  // handled in draw_lnum_col()
 | 
			
		||||
    int attr = win_hl_attr(wp, use_cursor_line_highlight(wp, wlv->lnum) ? HLF_CLS : HLF_SC);
 | 
			
		||||
    draw_col_fill(wlv, schar_from_ascii(' '), SIGN_WIDTH, attr);
 | 
			
		||||
    draw_col_fill(wlv, schar_from_ascii(' '), SIGN_WIDTH, scl_attr);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -559,8 +560,8 @@ static void draw_lnum_col(win_T *wp, winlinevars_T *wlv, int sign_num_attr, int
 | 
			
		||||
    } else {
 | 
			
		||||
      // Draw the line number (empty space after wrapping).
 | 
			
		||||
      int width = number_width(wp) + 1;
 | 
			
		||||
      int attr = (sign_num_attr > 0 && wlv->filler_todo <= 0)
 | 
			
		||||
                 ? sign_num_attr : get_line_number_attr(wp, wlv);
 | 
			
		||||
      int attr = hl_combine_attr(get_line_number_attr(wp, wlv),
 | 
			
		||||
                                 wlv->filler_todo <= 0 ? sign_num_attr : 0);
 | 
			
		||||
      if (wlv->row == wlv->startrow + wlv->filler_lines
 | 
			
		||||
          && (wp->w_skipcol == 0 || wlv->row > 0 || (wp->w_p_nu && wp->w_p_rnu))) {
 | 
			
		||||
        char buf[32];
 | 
			
		||||
@@ -640,7 +641,7 @@ static void draw_statuscol(win_T *wp, winlinevars_T *wlv, linenr_T lnum, int vir
 | 
			
		||||
    draw_col_buf(wp, wlv, transbuf, translen, attr, false);
 | 
			
		||||
    p = sp->start;
 | 
			
		||||
    int hl = sp->userhl;
 | 
			
		||||
    attr = hl < 0 ? syn_id2attr(-hl) : stcp->num_attr;
 | 
			
		||||
    attr = hl < 0 ? hl_combine_attr(stcp->num_attr, syn_id2attr(-hl)) : stcp->num_attr;
 | 
			
		||||
  }
 | 
			
		||||
  size_t translen = transstr_buf(p, buf + len - p, transbuf, MAXPATHL, true);
 | 
			
		||||
  draw_col_buf(wp, wlv, transbuf, translen, attr, false);
 | 
			
		||||
 
 | 
			
		||||
@@ -1731,7 +1731,7 @@ describe('API/extmarks', function()
 | 
			
		||||
    -- mark with invalidate is removed
 | 
			
		||||
    command('d2')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      S2^aaa bbb ccc                           |
 | 
			
		||||
      {7:S2}^aaa bbb ccc                           |
 | 
			
		||||
      {7:  }aaa bbb ccc                           |*3
 | 
			
		||||
      {7:  }                                      |
 | 
			
		||||
                                              |
 | 
			
		||||
@@ -1739,9 +1739,9 @@ describe('API/extmarks', function()
 | 
			
		||||
    -- mark is restored with undo_restore == true
 | 
			
		||||
    command('silent undo')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      S1{7:  }^aaa bbb ccc                         |
 | 
			
		||||
      S2S1aaa bbb ccc                         |
 | 
			
		||||
      S2{7:  }aaa bbb ccc                         |
 | 
			
		||||
      {7:S1  }^aaa bbb ccc                         |
 | 
			
		||||
      {7:S2S1}aaa bbb ccc                         |
 | 
			
		||||
      {7:S2  }aaa bbb ccc                         |
 | 
			
		||||
      {7:    }aaa bbb ccc                         |*2
 | 
			
		||||
                                              |
 | 
			
		||||
    ]])
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,9 @@ describe('signs', function()
 | 
			
		||||
  -- oldtest: Test_sign_cursor_position()
 | 
			
		||||
  it('are drawn correctly', function()
 | 
			
		||||
    local screen = Screen.new(75, 6)
 | 
			
		||||
    screen:add_extra_attr_ids({
 | 
			
		||||
      [100] = { foreground = Screen.colors.Blue4, background = Screen.colors.Yellow },
 | 
			
		||||
    })
 | 
			
		||||
    exec([[
 | 
			
		||||
      call setline(1, [repeat('x', 75), 'mmmm', 'yyyy'])
 | 
			
		||||
      call cursor(2,1)
 | 
			
		||||
@@ -37,7 +40,7 @@ describe('signs', function()
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
 | 
			
		||||
      {7:  }xx                                                                       |
 | 
			
		||||
      {10:=>}^mmmm                                                                     |
 | 
			
		||||
      {100:=>}^mmmm                                                                     |
 | 
			
		||||
      {7:  }yyyy                                                                     |
 | 
			
		||||
      {1:~                                                                          }|
 | 
			
		||||
                                                                                 |
 | 
			
		||||
@@ -48,7 +51,7 @@ describe('signs', function()
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
 | 
			
		||||
      {7:  }xx                                                                       |
 | 
			
		||||
      {10:-)}^mmmm                                                                     |
 | 
			
		||||
      {100:-)}^mmmm                                                                     |
 | 
			
		||||
      {7:  }yyyy                                                                     |
 | 
			
		||||
      {1:~                                                                          }|
 | 
			
		||||
                                                                                 |
 | 
			
		||||
@@ -59,7 +62,7 @@ describe('signs', function()
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
 | 
			
		||||
      {7:  }xx                                                                       |
 | 
			
		||||
      {10:-)}{4:^mmmm                                                                     }|
 | 
			
		||||
      {100:-)}{4:^mmmm                                                                     }|
 | 
			
		||||
      {7:  }yyyy                                                                     |
 | 
			
		||||
      {1:~                                                                          }|
 | 
			
		||||
                                                                                 |
 | 
			
		||||
 
 | 
			
		||||
@@ -631,7 +631,7 @@ describe('decorations providers', function()
 | 
			
		||||
      {14:  }hello97                               |
 | 
			
		||||
      {14:  }hello98                               |
 | 
			
		||||
      {14:  }hello99                               |
 | 
			
		||||
      X ^hello100                              |
 | 
			
		||||
      {14:X }^hello100                              |
 | 
			
		||||
      {14:  }hello101                              |
 | 
			
		||||
      {14:  }hello102                              |
 | 
			
		||||
      {14:  }hello103                              |
 | 
			
		||||
@@ -2301,13 +2301,16 @@ describe('extmark decorations', function()
 | 
			
		||||
 | 
			
		||||
  it('works with both hl_group and sign_hl_group', function()
 | 
			
		||||
    screen:try_resize(50, 3)
 | 
			
		||||
    screen:add_extra_attr_ids({
 | 
			
		||||
      [100] = { background = Screen.colors.WebGray, foreground = Screen.colors.Blue, bold = true },
 | 
			
		||||
    })
 | 
			
		||||
    insert('abcdefghijklmn')
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 0, {sign_text='S', sign_hl_group='NonText', hl_group='Error', end_col=14})
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      {1:S }{4:abcdefghijklm^n}                                  |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {100:S }{9:abcdefghijklm^n}                                  |
 | 
			
		||||
      {1:~                                                 }|
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('virt_text_repeat_linebreak repeats virtual text on wrapped lines', function()
 | 
			
		||||
@@ -5064,16 +5067,16 @@ l5
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S'})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      S l2                                              |
 | 
			
		||||
      {7:S }l2                                              |
 | 
			
		||||
      {7:  }l3                                              |
 | 
			
		||||
      {7:  }l4                                              |
 | 
			
		||||
      {7:  }l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add a single sign (with end row)', function()
 | 
			
		||||
@@ -5082,16 +5085,16 @@ l5
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S', end_row=1})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      S l2                                              |
 | 
			
		||||
      {7:S }l2                                              |
 | 
			
		||||
      {7:  }l3                                              |
 | 
			
		||||
      {7:  }l4                                              |
 | 
			
		||||
      {7:  }l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add a single sign and text highlight', function()
 | 
			
		||||
@@ -5099,16 +5102,16 @@ l5
 | 
			
		||||
    feed 'gg'
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, 0, {sign_text='S', hl_group='Todo', end_col=1})
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      S {100:l}2                                              |
 | 
			
		||||
      {7:S }{100:l}2                                              |
 | 
			
		||||
      {7:  }l3                                              |
 | 
			
		||||
      {7:  }l4                                              |
 | 
			
		||||
      {7:  }l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_clear_namespace(0, ns, 0, -1)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -5119,16 +5122,16 @@ l5
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S', end_row = 2})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      S l2                                              |
 | 
			
		||||
      S l3                                              |
 | 
			
		||||
      {7:S }l2                                              |
 | 
			
		||||
      {7:S }l3                                              |
 | 
			
		||||
      {7:  }l4                                              |
 | 
			
		||||
      {7:  }l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add multiple signs (multiple extmarks)', function()
 | 
			
		||||
@@ -5138,16 +5141,16 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S1'})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 3, -1, {sign_text='S2', end_row = 4})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      S1l2                                              |
 | 
			
		||||
      {7:S1}l2                                              |
 | 
			
		||||
      {7:  }l3                                              |
 | 
			
		||||
      S2l4                                              |
 | 
			
		||||
      S2l5                                              |
 | 
			
		||||
      {7:S2}l4                                              |
 | 
			
		||||
      {7:S2}l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add multiple signs (multiple extmarks) 2', function()
 | 
			
		||||
@@ -5156,16 +5159,16 @@ l5
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 3, -1, {sign_text='S1'})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S2', end_row = 3})
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:    }^l1                                            |
 | 
			
		||||
      S2{7:  }l2                                            |
 | 
			
		||||
      S2{7:  }l3                                            |
 | 
			
		||||
      S2S1l4                                            |
 | 
			
		||||
      {7:S2  }l2                                            |
 | 
			
		||||
      {7:S2  }l3                                            |
 | 
			
		||||
      {7:S2S1}l4                                            |
 | 
			
		||||
      {7:    }l5                                            |
 | 
			
		||||
      {7:    }                                              |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add multiple signs (multiple extmarks) 3', function()
 | 
			
		||||
@@ -5176,16 +5179,16 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S1', end_row=2})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 2, -1, {sign_text='S2', end_row=3})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:    }^l1                                            |
 | 
			
		||||
      S1{7:  }l2                                            |
 | 
			
		||||
      S2S1l3                                            |
 | 
			
		||||
      S2{7:  }l4                                            |
 | 
			
		||||
      {7:S1  }l2                                            |
 | 
			
		||||
      {7:S2S1}l3                                            |
 | 
			
		||||
      {7:S2  }l4                                            |
 | 
			
		||||
      {7:    }l5                                            |
 | 
			
		||||
      {7:    }                                              |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add multiple signs (multiple extmarks) 4', function()
 | 
			
		||||
@@ -5195,16 +5198,16 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S1', end_row=0})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='S2', end_row=1})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1^l1                                              |
 | 
			
		||||
      S2l2                                              |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}^l1                                              |
 | 
			
		||||
      {7:S2}l2                                              |
 | 
			
		||||
      {7:  }l3                                              |
 | 
			
		||||
      {7:  }l4                                              |
 | 
			
		||||
      {7:  }l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('works with old signs', function()
 | 
			
		||||
@@ -5219,16 +5222,16 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S4'})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 2, -1, {sign_text='S5'})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S4S1^l1                                            |
 | 
			
		||||
      S2x l2                                            |
 | 
			
		||||
      S5{7:  }l3                                            |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S4S1}^l1                                            |
 | 
			
		||||
      {7:S2x }l2                                            |
 | 
			
		||||
      {7:S5  }l3                                            |
 | 
			
		||||
      {7:    }l4                                            |
 | 
			
		||||
      {7:    }l5                                            |
 | 
			
		||||
      {7:    }                                              |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('works with old signs (with range)', function()
 | 
			
		||||
@@ -5244,16 +5247,16 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S4'})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 2, -1, {sign_text='S5'})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S4S3S1^l1                                          |
 | 
			
		||||
      S3S2x l2                                          |
 | 
			
		||||
      S5S3{7:  }l3                                          |
 | 
			
		||||
      S3{7:    }l4                                          |
 | 
			
		||||
      S3{7:    }l5                                          |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S4S3S1}^l1                                          |
 | 
			
		||||
      {7:S3S2x }l2                                          |
 | 
			
		||||
      {7:S5S3  }l3                                          |
 | 
			
		||||
      {7:S3    }l4                                          |
 | 
			
		||||
      {7:S3    }l5                                          |
 | 
			
		||||
      {7:      }                                            |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add a ranged sign (with start out of view)', function()
 | 
			
		||||
@@ -5264,14 +5267,14 @@ l5
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {sign_text='X', end_row=3})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      X {7:  }^l3                                            |
 | 
			
		||||
      X {7:  }l4                                            |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:X   }^l3                                            |
 | 
			
		||||
      {7:X   }l4                                            |
 | 
			
		||||
      {7:    }l5                                            |
 | 
			
		||||
      {7:    }                                              |
 | 
			
		||||
      {1:~                                                 }|*5
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can add lots of signs', function()
 | 
			
		||||
@@ -5293,11 +5296,11 @@ l5
 | 
			
		||||
      api.nvim_buf_set_extmark(0, ns, i, -1, { sign_text='Z' })
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      Z Y X W {100:a} {100:b} {100:c} {100:d} {100:e} {100:f} {100:g} {100:h}                 |*8
 | 
			
		||||
      Z Y X W {100:a} {100:b} {100:c} {100:d} {100:e} {100:f} {100:g} {100:^h}                 |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:Z Y X W }{100:a} {100:b} {100:c} {100:d} {100:e} {100:f} {100:g} {100:h}                 |*8
 | 
			
		||||
      {7:Z Y X W }{100:a} {100:b} {100:c} {100:d} {100:e} {100:f} {100:g} {100:^h}                 |
 | 
			
		||||
                                              |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('works with priority #19716', function()
 | 
			
		||||
@@ -5313,20 +5316,20 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S5', priority=200})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S1', priority=1})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S5S4O3S2S1^l1        |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S5S4O3S2S1}^l1        |
 | 
			
		||||
      {7:          }l2        |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    -- Check truncation works too
 | 
			
		||||
    api.nvim_set_option_value('signcolumn', 'auto', {})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S5^l1                |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S5}^l1                |
 | 
			
		||||
      {7:  }l2                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not overflow with many old signs #23852', function()
 | 
			
		||||
@@ -5343,21 +5346,21 @@ l5
 | 
			
		||||
    command([[exe 'sign place 07 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
 | 
			
		||||
    command([[exe 'sign place 08 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
 | 
			
		||||
    command([[exe 'sign place 09 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      O3O3O3O3O3O3O3O3O3^  |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:O3O3O3O3O3O3O3O3O3}^  |
 | 
			
		||||
      {1:~                   }|
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S1', priority=1})
 | 
			
		||||
    screen:expect_unchanged()
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='S5', priority=200})
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S5O3O3O3O3O3O3O3O3^  |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S5O3O3O3O3O3O3O3O3}^  |
 | 
			
		||||
      {1:~                   }|
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    assert_alive()
 | 
			
		||||
  end)
 | 
			
		||||
@@ -5383,12 +5386,12 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 1, -1, {invalidate = true, sign_text='S3'})
 | 
			
		||||
    feed('2Gdd')
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1l1                |
 | 
			
		||||
      S1^l3                |
 | 
			
		||||
      S1l4                |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}l1                |
 | 
			
		||||
      {7:S1}^l3                |
 | 
			
		||||
      {7:S1}l4                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct width with multiple overlapping signs', function()
 | 
			
		||||
@@ -5400,36 +5403,36 @@ l5
 | 
			
		||||
    feed('gg')
 | 
			
		||||
 | 
			
		||||
    local s1 = [[
 | 
			
		||||
      S2S1^l1              |
 | 
			
		||||
      S3S2l2              |
 | 
			
		||||
      S3S2l3              |
 | 
			
		||||
      {7:S2S1}^l1              |
 | 
			
		||||
      {7:S3S2}l2              |
 | 
			
		||||
      {7:S3S2}l3              |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]
 | 
			
		||||
    screen:expect{grid=s1}
 | 
			
		||||
    screen:expect(s1)
 | 
			
		||||
    -- Correct width when :move'ing a line with signs
 | 
			
		||||
    command('move2')
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S3{7:    }l2            |
 | 
			
		||||
      S3S2S1^l1            |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S3    }l2            |
 | 
			
		||||
      {7:S3S2S1}^l1            |
 | 
			
		||||
      {7:      }l3            |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
    command('silent undo')
 | 
			
		||||
    screen:expect{grid=s1}
 | 
			
		||||
    command('d')
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S3S2S1^l2            |
 | 
			
		||||
      S3S2{7:  }l3            |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S3S2S1}^l2            |
 | 
			
		||||
      {7:S3S2  }l3            |
 | 
			
		||||
      {7:      }l4            |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
    command('d')
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S3S2S1^l3            |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S3S2S1}^l3            |
 | 
			
		||||
      {7:      }l4            |
 | 
			
		||||
      {7:      }l5            |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct width when adding and removing multiple signs', function()
 | 
			
		||||
@@ -5452,12 +5455,12 @@ l5
 | 
			
		||||
      redraw!
 | 
			
		||||
      call nvim_buf_del_extmark(0, ns, s1)
 | 
			
		||||
    ]])
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1^l1                |
 | 
			
		||||
      S1l2                |
 | 
			
		||||
      S1l3                |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}^l1                |
 | 
			
		||||
      {7:S1}l2                |
 | 
			
		||||
      {7:S1}l3                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct width when deleting lines', function()
 | 
			
		||||
@@ -5472,12 +5475,12 @@ l5
 | 
			
		||||
      call nvim_buf_del_extmark(0, ns, s3)
 | 
			
		||||
      norm 4Gdd
 | 
			
		||||
    ]])
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:    }l3              |
 | 
			
		||||
      S2S1l5              |
 | 
			
		||||
      {7:S2S1}l5              |
 | 
			
		||||
      {7:    }^                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct width when splitting lines with signs on different columns', function()
 | 
			
		||||
@@ -5487,12 +5490,12 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 0, {sign_text='S1'})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 1, {sign_text='S2'})
 | 
			
		||||
    feed('a<cr><esc>')
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1l                 |
 | 
			
		||||
      S2^1                 |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}l                 |
 | 
			
		||||
      {7:S2}^1                 |
 | 
			
		||||
      {7:  }l2                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct width after wiping a buffer', function()
 | 
			
		||||
@@ -5501,12 +5504,12 @@ l5
 | 
			
		||||
    feed('gg')
 | 
			
		||||
    local buf = api.nvim_get_current_buf()
 | 
			
		||||
    api.nvim_buf_set_extmark(buf, ns, 0, 0, { sign_text = 'h' })
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      h ^l1                |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:h }^l1                |
 | 
			
		||||
      {7:  }l2                |
 | 
			
		||||
      {7:  }l3                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
    api.nvim_win_set_buf(0, api.nvim_create_buf(false, true))
 | 
			
		||||
    api.nvim_buf_delete(buf, {unload=true, force=true})
 | 
			
		||||
    api.nvim_buf_set_lines(buf, 0, -1, false, {''})
 | 
			
		||||
@@ -5537,12 +5540,12 @@ l5
 | 
			
		||||
      end)
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1^l1                |
 | 
			
		||||
      S2l2                |
 | 
			
		||||
      S4l3                |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}^l1                |
 | 
			
		||||
      {7:S2}l2                |
 | 
			
		||||
      {7:S4}l3                |
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('no crash with sign after many marks #27137', function()
 | 
			
		||||
@@ -5553,11 +5556,11 @@ l5
 | 
			
		||||
    end
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 0, {sign_text = 'S1'})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S1{9:^a}                 |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1}{9:^a}                 |
 | 
			
		||||
      {1:~                   }|*2
 | 
			
		||||
                          |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct sort order with multiple namespaces and same id', function()
 | 
			
		||||
@@ -5565,11 +5568,11 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 0, {sign_text = 'S1', id = 1})
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns2, 0, 0, {sign_text = 'S2', id = 1})
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S2S1^                                              |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S2S1}^                                              |
 | 
			
		||||
      {1:~                                                 }|*8
 | 
			
		||||
                                                        |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correct number of signs after deleting text (#27046)', function()
 | 
			
		||||
@@ -5586,12 +5589,12 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 30, 0, {end_row = 30, end_col = 3, hl_group = 'Error'})
 | 
			
		||||
    command('0d29')
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      S4S3S2S1{9:^foo}                                       |
 | 
			
		||||
      S5{7:      }{9:foo}                                       |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S4S3S2S1}{9:^foo}                                       |
 | 
			
		||||
      {7:S5      }{9:foo}                                       |
 | 
			
		||||
      {1:~                                                 }|*7
 | 
			
		||||
      29 fewer lines                                    |
 | 
			
		||||
    ]]}
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    api.nvim_buf_clear_namespace(0, ns, 0, -1)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -5599,21 +5602,17 @@ l5
 | 
			
		||||
  it([[correct numberwidth with 'signcolumn' set to "number" #28984]], function()
 | 
			
		||||
    command('set number numberwidth=1 signcolumn=number')
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 0, 0, { sign_text = 'S1' })
 | 
			
		||||
    screen:expect({
 | 
			
		||||
      grid = [[
 | 
			
		||||
        S1 ^                                               |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S1 }^                                               |
 | 
			
		||||
      {1:~                                                 }|*8
 | 
			
		||||
                                                        |
 | 
			
		||||
      ]]
 | 
			
		||||
    })
 | 
			
		||||
    ]])
 | 
			
		||||
    api.nvim_buf_del_extmark(0, ns, 1)
 | 
			
		||||
    screen:expect({
 | 
			
		||||
      grid = [[
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {8:1 }^                                                |
 | 
			
		||||
      {1:~                                                 }|*8
 | 
			
		||||
                                                        |
 | 
			
		||||
      ]]
 | 
			
		||||
    })
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('supports emoji as signs', function()
 | 
			
		||||
@@ -5626,10 +5625,10 @@ l5
 | 
			
		||||
    api.nvim_buf_set_extmark(0, ns, 4, 0, {sign_text='❤x'})
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }^l1                                              |
 | 
			
		||||
      🧑🌾l2                                              |
 | 
			
		||||
      ❤️l3                                              |
 | 
			
		||||
      ❤ l4                                              |
 | 
			
		||||
      ❤xl5                                              |
 | 
			
		||||
      {7:🧑🌾}l2                                              |
 | 
			
		||||
      {7:❤️}l3                                              |
 | 
			
		||||
      {7:❤ }l4                                              |
 | 
			
		||||
      {7:❤x}l5                                              |
 | 
			
		||||
      {7:  }                                                |
 | 
			
		||||
      {1:~                                                 }|*3
 | 
			
		||||
                                                        |
 | 
			
		||||
 
 | 
			
		||||
@@ -1046,6 +1046,8 @@ describe('float window', function()
 | 
			
		||||
        [26] = {blend = 80, background = Screen.colors.Gray0};
 | 
			
		||||
        [27] = {foreground = Screen.colors.Black, background = Screen.colors.LightGrey};
 | 
			
		||||
        [28] = {foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey};
 | 
			
		||||
        [29] = {background = Screen.colors.Yellow1, foreground = Screen.colors.Blue4};
 | 
			
		||||
        [30] = {background = Screen.colors.Grey, foreground = Screen.colors.Blue4, bold = true};
 | 
			
		||||
      }
 | 
			
		||||
      screen:set_default_attr_ids(attrs)
 | 
			
		||||
    end)
 | 
			
		||||
@@ -1451,14 +1453,14 @@ describe('float window', function()
 | 
			
		||||
          [2:----------------------------------------]|*6
 | 
			
		||||
          [3:----------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {19: }{17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19: }{29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19:   }{14:  2 }{22:y}                                |
 | 
			
		||||
          {19:   }{14:  3 }{22: }                                |
 | 
			
		||||
          {0:~                                       }|*3
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                  |
 | 
			
		||||
        ## grid 4
 | 
			
		||||
          {17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }|
 | 
			
		||||
          {29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }|
 | 
			
		||||
          {19:  }{15:y                 }|
 | 
			
		||||
          {19:  }{15:                  }|
 | 
			
		||||
          {15:                    }|
 | 
			
		||||
@@ -1466,9 +1468,9 @@ describe('float window', function()
 | 
			
		||||
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {19: }{17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19: }{29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19:   }{14:  2 }{22:y}                                |
 | 
			
		||||
          {19:   }{14:  3 }{22: }  {17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }          |
 | 
			
		||||
          {19:   }{14:  3 }{22: }  {29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }          |
 | 
			
		||||
          {0:~         }{19:  }{15:y                 }{0:          }|
 | 
			
		||||
          {0:~         }{19:  }{15:                  }{0:          }|
 | 
			
		||||
          {0:~         }{15:                    }{0:          }|
 | 
			
		||||
@@ -1551,14 +1553,14 @@ describe('float window', function()
 | 
			
		||||
          [2:----------------------------------------]|*6
 | 
			
		||||
          [3:----------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {19: }{17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19: }{29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19:   }{14:  2 }{22:y}                                |
 | 
			
		||||
          {19:   }{14:  3 }{22: }                                |
 | 
			
		||||
          {0:~                                       }|*3
 | 
			
		||||
        ## grid 3
 | 
			
		||||
                                                  |
 | 
			
		||||
        ## grid 4
 | 
			
		||||
          {17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }|
 | 
			
		||||
          {29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }|
 | 
			
		||||
          {19:  }{15:y                 }|
 | 
			
		||||
          {19:  }{15:                  }|
 | 
			
		||||
          {15:                    }|
 | 
			
		||||
@@ -1566,9 +1568,9 @@ describe('float window', function()
 | 
			
		||||
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {19: }{17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19: }{29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{20:  1 }{22:^x}{21:                                }|
 | 
			
		||||
          {19:   }{14:  2 }{22:y}                                |
 | 
			
		||||
          {19:   }{14:  3 }{22: }  {17:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }          |
 | 
			
		||||
          {19:   }{14:  3 }{22: }  {29:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}{15:x                 }          |
 | 
			
		||||
          {0:~         }{19:  }{15:y                 }{0:          }|
 | 
			
		||||
          {0:~         }{19:  }{15:                  }{0:          }|
 | 
			
		||||
          {0:~         }{15:                    }{0:          }|
 | 
			
		||||
@@ -1621,7 +1623,7 @@ describe('float window', function()
 | 
			
		||||
          [2:----------------------------------------]|*6
 | 
			
		||||
          [3:----------------------------------------]|
 | 
			
		||||
        ## grid 2
 | 
			
		||||
          {20:   1}{19:   }{22:^x}{21:                                }|
 | 
			
		||||
          {20:   1}{30:   }{22:^x}{21:                                }|
 | 
			
		||||
          {14:   2}{19:   }{22:y}                                |
 | 
			
		||||
          {14:   3}{19:   }{22: }                                |
 | 
			
		||||
          {0:~                                       }|*3
 | 
			
		||||
@@ -1634,7 +1636,7 @@ describe('float window', function()
 | 
			
		||||
        ]], float_pos={[4] = {1001, "NW", 1, 4, 10, true}}}
 | 
			
		||||
      else
 | 
			
		||||
        screen:expect{grid=[[
 | 
			
		||||
          {20:   1}{19:   }{22:^x}{21:                                }|
 | 
			
		||||
          {20:   1}{30:   }{22:^x}{21:                                }|
 | 
			
		||||
          {14:   2}{19:   }{22:y}                                |
 | 
			
		||||
          {14:   3}{19:   }{22: }  {15:x                   }          |
 | 
			
		||||
          {0:~         }{15:y                   }{0:          }|
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,12 @@ describe('Signs', function()
 | 
			
		||||
    screen = Screen.new()
 | 
			
		||||
    screen:add_extra_attr_ids {
 | 
			
		||||
      [100] = { bold = true, foreground = Screen.colors.Magenta1 },
 | 
			
		||||
      [101] = { foreground = Screen.colors.DarkBlue, background = Screen.colors.Yellow1 },
 | 
			
		||||
      [102] = { foreground = Screen.colors.Brown, background = Screen.colors.Yellow },
 | 
			
		||||
      [103] = { background = Screen.colors.Yellow, reverse = true },
 | 
			
		||||
      [104] = { reverse = true, foreground = Screen.colors.Grey100, background = Screen.colors.Red },
 | 
			
		||||
      [105] = { bold = true, background = Screen.colors.Red1, foreground = Screen.colors.Gray100 },
 | 
			
		||||
      [106] = { foreground = Screen.colors.Brown, reverse = true },
 | 
			
		||||
    }
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -27,8 +33,8 @@ describe('Signs', function()
 | 
			
		||||
        sign place 2 line=2 name=piet2 buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}a                                                  |
 | 
			
		||||
        {10:𠜎̀́̂̃̄̅}b                                                  |
 | 
			
		||||
        {101:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}a                                                  |
 | 
			
		||||
        {101:𠜎̀́̂̃̄̅}b                                                  |
 | 
			
		||||
        {7:  }^                                                   |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -45,9 +51,9 @@ describe('Signs', function()
 | 
			
		||||
        sign place 3 line=1 name=pietx buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>!}a                                                  |
 | 
			
		||||
        {101:>!}a                                                  |
 | 
			
		||||
        {7:  }b                                                  |
 | 
			
		||||
        {10:>>}c                                                  |
 | 
			
		||||
        {101:>>}c                                                  |
 | 
			
		||||
        {7:  }^                                                   |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -80,13 +86,13 @@ describe('Signs', function()
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {7:  }{21:^a                                                  }|
 | 
			
		||||
        {10:>>}b                                                  |
 | 
			
		||||
        {101:>>}b                                                  |
 | 
			
		||||
        {7:  }c                                                  |
 | 
			
		||||
        {7:  }                                                   |
 | 
			
		||||
        {1:~                                                    }|*2
 | 
			
		||||
        {3:[No Name] [+]                                        }|
 | 
			
		||||
        {7:  }{21:a                                                  }|
 | 
			
		||||
        {10:>>}b                                                  |
 | 
			
		||||
        {101:>>}b                                                  |
 | 
			
		||||
        {7:  }c                                                  |
 | 
			
		||||
        {7:  }                                                   |
 | 
			
		||||
        {1:~                                                    }|
 | 
			
		||||
@@ -110,16 +116,23 @@ describe('Signs', function()
 | 
			
		||||
        sign place 6 line=4 name=pietxx buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}{8:  1 }a                                              |
 | 
			
		||||
        {101:>>}{8:  1 }a                                              |
 | 
			
		||||
        {7:  }{8:  2 }{9:b                                              }|
 | 
			
		||||
        {7:  }{13:  3 }c                                              |
 | 
			
		||||
        {10:>>}{13:  4 }{9:^                                               }|
 | 
			
		||||
        {101:>>}{13:  4 }{9:^                                               }|
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
      -- Check that 'statuscolumn' correctly applies numhl
 | 
			
		||||
      exec('set statuscolumn=%s%=%l\\ ')
 | 
			
		||||
      screen:expect_unchanged()
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {102:>>}{8:  1 }a                                              |
 | 
			
		||||
        {7:  }{8:  2 }{9:b                                              }|
 | 
			
		||||
        {7:  }{13:  3 }c                                              |
 | 
			
		||||
        {101:>>}{13:  4 }{9:^                                               }|
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('highlights the cursorline sign with culhl', function()
 | 
			
		||||
@@ -132,33 +145,33 @@ describe('Signs', function()
 | 
			
		||||
        set cursorline
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}a                                                  |
 | 
			
		||||
        {10:>>}b                                                  |
 | 
			
		||||
        {101:>>}a                                                  |
 | 
			
		||||
        {101:>>}b                                                  |
 | 
			
		||||
        {9:>>}{21:^c                                                  }|
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
      feed('k')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}a                                                  |
 | 
			
		||||
        {101:>>}a                                                  |
 | 
			
		||||
        {9:>>}{21:^b                                                  }|
 | 
			
		||||
        {10:>>}c                                                  |
 | 
			
		||||
        {101:>>}c                                                  |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
      exec('set nocursorline')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}a                                                  |
 | 
			
		||||
        {10:>>}^b                                                  |
 | 
			
		||||
        {10:>>}c                                                  |
 | 
			
		||||
        {101:>>}a                                                  |
 | 
			
		||||
        {101:>>}^b                                                  |
 | 
			
		||||
        {101:>>}c                                                  |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
      exec('set cursorline cursorlineopt=line')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}a                                                  |
 | 
			
		||||
        {10:>>}{21:^b                                                  }|
 | 
			
		||||
        {10:>>}c                                                  |
 | 
			
		||||
        {101:>>}a                                                  |
 | 
			
		||||
        {101:>>}{21:^b                                                  }|
 | 
			
		||||
        {101:>>}c                                                  |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
@@ -166,16 +179,24 @@ describe('Signs', function()
 | 
			
		||||
      exec('hi! link SignColumn IncSearch')
 | 
			
		||||
      feed('Go<esc>2G')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}a                                                  |
 | 
			
		||||
        {9:>>}^b                                                  |
 | 
			
		||||
        {10:>>}c                                                  |
 | 
			
		||||
        {103:>>}a                                                  |
 | 
			
		||||
        {104:>>}^b                                                  |
 | 
			
		||||
        {103:>>}c                                                  |
 | 
			
		||||
        {2:  }                                                   |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
 | 
			
		||||
      -- Check that 'statuscolumn' cursorline/signcolumn highlights are the same (#21726)
 | 
			
		||||
      exec('set statuscolumn=%s')
 | 
			
		||||
      screen:expect_unchanged()
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {102:>>}a                                                  |
 | 
			
		||||
        {105:>>}^b                                                  |
 | 
			
		||||
        {102:>>}c                                                  |
 | 
			
		||||
        {106:  }                                                   |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('multiple signs #9295', function()
 | 
			
		||||
@@ -196,7 +217,7 @@ describe('Signs', function()
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {7:    }{8:  1 }a                                            |
 | 
			
		||||
        {7:    }{8:  2 }b                                            |
 | 
			
		||||
        WW{10:>>}{8:  3 }c                                            |
 | 
			
		||||
        {7:WW}{101:>>}{8:  3 }c                                            |
 | 
			
		||||
        {7:    }{8:  4 }^                                             |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -209,9 +230,9 @@ describe('Signs', function()
 | 
			
		||||
        sign place 3 line=2 name=pietError buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {9:XX}{10:>>}{8:  1 }a                                            |
 | 
			
		||||
        {10:>>}{9:XX}{8:  2 }b                                            |
 | 
			
		||||
        WW{10:>>}{8:  3 }c                                            |
 | 
			
		||||
        {9:XX}{101:>>}{8:  1 }a                                            |
 | 
			
		||||
        {101:>>}{9:XX}{8:  2 }b                                            |
 | 
			
		||||
        {7:WW}{101:>>}{8:  3 }c                                            |
 | 
			
		||||
        {7:    }{8:  4 }^                                             |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -220,8 +241,8 @@ describe('Signs', function()
 | 
			
		||||
      exec('set signcolumn=yes:1')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {9:XX}{8:  1 }a                                              |
 | 
			
		||||
        {10:>>}{8:  2 }b                                              |
 | 
			
		||||
        WW{8:  3 }c                                              |
 | 
			
		||||
        {101:>>}{8:  2 }b                                              |
 | 
			
		||||
        {7:WW}{8:  3 }c                                              |
 | 
			
		||||
        {7:  }{8:  4 }^                                               |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -229,9 +250,9 @@ describe('Signs', function()
 | 
			
		||||
      -- "auto:3" accommodates all the signs we defined so far.
 | 
			
		||||
      exec('set signcolumn=auto:3')
 | 
			
		||||
      local s3 = [[
 | 
			
		||||
        {9:XX}{10:>>}{7:  }{8:  1 }a                                          |
 | 
			
		||||
        {10:>>}{9:XX}{7:  }{8:  2 }b                                          |
 | 
			
		||||
        WW{10:>>}{9:XX}{8:  3 }c                                          |
 | 
			
		||||
        {9:XX}{101:>>}{7:  }{8:  1 }a                                          |
 | 
			
		||||
        {101:>>}{9:XX}{7:  }{8:  2 }b                                          |
 | 
			
		||||
        {7:WW}{101:>>}{9:XX}{8:  3 }c                                          |
 | 
			
		||||
        {7:      }{8:  4 }^                                           |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -240,9 +261,9 @@ describe('Signs', function()
 | 
			
		||||
      -- Check "yes:9".
 | 
			
		||||
      exec('set signcolumn=yes:9')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {9:XX}{10:>>}{7:              }{8:  1 }a                              |
 | 
			
		||||
        {10:>>}{9:XX}{7:              }{8:  2 }b                              |
 | 
			
		||||
        WW{10:>>}{9:XX}{7:            }{8:  3 }c                              |
 | 
			
		||||
        {9:XX}{101:>>}{7:              }{8:  1 }a                              |
 | 
			
		||||
        {101:>>}{9:XX}{7:              }{8:  2 }b                              |
 | 
			
		||||
        {7:WW}{101:>>}{9:XX}{7:            }{8:  3 }c                              |
 | 
			
		||||
        {7:                  }{8:  4 }^                               |
 | 
			
		||||
        {1:~                                                    }|*9
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -255,8 +276,8 @@ describe('Signs', function()
 | 
			
		||||
      exec('3move1')
 | 
			
		||||
      exec('2d')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {9:XX}{10:>>}{8:  1 }a                                            |
 | 
			
		||||
        {10:>>}{9:XX}{8:  2 }^b                                            |
 | 
			
		||||
        {9:XX}{101:>>}{8:  1 }a                                            |
 | 
			
		||||
        {101:>>}{9:XX}{8:  2 }^b                                            |
 | 
			
		||||
        {7:    }{8:  3 }                                             |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -264,8 +285,8 @@ describe('Signs', function()
 | 
			
		||||
      -- character deletion does not delete signs.
 | 
			
		||||
      feed('x')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {9:XX}{10:>>}{8:  1 }a                                            |
 | 
			
		||||
        {10:>>}{9:XX}{8:  2 }^                                             |
 | 
			
		||||
        {9:XX}{101:>>}{8:  1 }a                                            |
 | 
			
		||||
        {101:>>}{9:XX}{8:  2 }^                                             |
 | 
			
		||||
        {7:    }{8:  3 }                                             |
 | 
			
		||||
        {1:~                                                    }|*10
 | 
			
		||||
                                                             |
 | 
			
		||||
@@ -301,7 +322,7 @@ describe('Signs', function()
 | 
			
		||||
      exec('sign define pietSearch text=>> texthl=Search')
 | 
			
		||||
      exec('sign place 1 line=1 name=pietSearch buffer=1')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}{7:  }{8:  1 }a                                            |
 | 
			
		||||
        {101:>>}{7:  }{8:  1 }a                                            |
 | 
			
		||||
        {7:    }{8:  2 }b                                            |
 | 
			
		||||
        {7:    }{8:  3 }c                                            |
 | 
			
		||||
        {7:    }{8:  4 }^                                             |
 | 
			
		||||
@@ -316,7 +337,7 @@ describe('Signs', function()
 | 
			
		||||
        sign place 4 line=1 name=pietSearch buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>>>>>>>}{8:  1 }a                                        |
 | 
			
		||||
        {101:>>>>>>>>}{8:  1 }a                                        |
 | 
			
		||||
        {7:        }{8:  2 }b                                        |
 | 
			
		||||
        {7:        }{8:  3 }c                                        |
 | 
			
		||||
        {7:        }{8:  4 }^                                         |
 | 
			
		||||
@@ -328,7 +349,7 @@ describe('Signs', function()
 | 
			
		||||
      screen:expect_unchanged()
 | 
			
		||||
      exec('sign unplace 4')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>>>>>}{8:  1 }a                                          |
 | 
			
		||||
        {101:>>>>>>}{8:  1 }a                                          |
 | 
			
		||||
        {7:      }{8:  2 }b                                          |
 | 
			
		||||
        {7:      }{8:  3 }c                                          |
 | 
			
		||||
        {7:      }{8:  4 }^                                           |
 | 
			
		||||
@@ -345,7 +366,7 @@ describe('Signs', function()
 | 
			
		||||
        sign place 8 line=1 name=pietSearch buffer=1
 | 
			
		||||
      ]])
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>>>>>>>>>}{8:  1 }a                                      |
 | 
			
		||||
        {101:>>>>>>>>>>}{8:  1 }a                                      |
 | 
			
		||||
        {7:          }{8:  2 }b                                      |
 | 
			
		||||
        {7:          }{8:  3 }c                                      |
 | 
			
		||||
        {7:          }{8:  4 }^                                       |
 | 
			
		||||
@@ -375,7 +396,7 @@ describe('Signs', function()
 | 
			
		||||
      -- single column with 1 sign with text and one sign without
 | 
			
		||||
      exec('sign place 1 line=1 name=pietSearch buffer=1')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}{8:  1 }a                                              |
 | 
			
		||||
        {101:>>}{8:  1 }a                                              |
 | 
			
		||||
        {7:  }{8:  2 }b                                              |
 | 
			
		||||
        {7:  }{8:  3 }c                                              |
 | 
			
		||||
        {7:  }{8:  4 }^                                               |
 | 
			
		||||
@@ -396,7 +417,7 @@ describe('Signs', function()
 | 
			
		||||
      -- line number should be drawn if sign has no text
 | 
			
		||||
      -- no signcolumn, line number for "a" is Search, for "b" is Error, for "c" is LineNr
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10: >> }a                                                |
 | 
			
		||||
        {101: >> }a                                                |
 | 
			
		||||
        {9:  2 }b                                                |
 | 
			
		||||
        {8:  3 }c                                                |
 | 
			
		||||
        {8:  4 }^                                                 |
 | 
			
		||||
@@ -406,7 +427,7 @@ describe('Signs', function()
 | 
			
		||||
      -- number column on wrapped part of a line should be empty
 | 
			
		||||
      feed('gg100aa<Esc>')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {101: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {9:    }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {9:    }aa^a                                              |
 | 
			
		||||
        {9:  2 }b                                                |
 | 
			
		||||
@@ -423,7 +444,7 @@ describe('Signs', function()
 | 
			
		||||
      -- number column on virtual lines should be empty
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {8:    }VIRT LINES                                       |
 | 
			
		||||
        {10: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {101: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {9:    }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
        {9:    }aa^a                                              |
 | 
			
		||||
        {9:  2 }b                                                |
 | 
			
		||||
@@ -439,7 +460,7 @@ describe('Signs', function()
 | 
			
		||||
      exec('sign place 100000 line=1 name=piet buffer=1')
 | 
			
		||||
      feed(':sign place<cr>')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}                                                   |
 | 
			
		||||
        {101:>>}                                                   |
 | 
			
		||||
        {1:~                                                    }|*6
 | 
			
		||||
        {3:                                                     }|
 | 
			
		||||
        :sign place                                          |
 | 
			
		||||
@@ -452,7 +473,7 @@ describe('Signs', function()
 | 
			
		||||
 | 
			
		||||
      feed('<cr>')
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        {10:>>}^                                                   |
 | 
			
		||||
        {101:>>}^                                                   |
 | 
			
		||||
        {1:~                                                    }|*12
 | 
			
		||||
                                                             |
 | 
			
		||||
      ]])
 | 
			
		||||
@@ -470,7 +491,7 @@ describe('Signs', function()
 | 
			
		||||
      {7:  }a                                                  |
 | 
			
		||||
      {7:  }^c                                                  |
 | 
			
		||||
      {7:  }d                                                  |
 | 
			
		||||
      >>e                                                  |
 | 
			
		||||
      {7:>>}e                                                  |
 | 
			
		||||
      {1:~                                                    }|*9
 | 
			
		||||
                                                           |
 | 
			
		||||
    ]])
 | 
			
		||||
@@ -498,7 +519,7 @@ describe('Signs', function()
 | 
			
		||||
      {7:  }b                                                  |
 | 
			
		||||
      {7:  }c                                                  |
 | 
			
		||||
      {7:  }d                                                  |
 | 
			
		||||
      >>e                                                  |
 | 
			
		||||
      {7:>>}e                                                  |
 | 
			
		||||
      {1:~                                                    }|*7
 | 
			
		||||
                                                           |
 | 
			
		||||
    ]])
 | 
			
		||||
@@ -550,7 +571,7 @@ describe('Signs', function()
 | 
			
		||||
    exec('silent undo')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:  }1                                                  |
 | 
			
		||||
      S1^2                                                  |
 | 
			
		||||
      {7:S1}^2                                                  |
 | 
			
		||||
      {7:  }3                                                  |
 | 
			
		||||
      {7:  }4                                                  |
 | 
			
		||||
      {1:~                                                    }|*9
 | 
			
		||||
@@ -575,23 +596,19 @@ describe('Signs', function()
 | 
			
		||||
      sign place 2 line=9 name=S2
 | 
			
		||||
    ]])
 | 
			
		||||
    -- Now placed at end of buffer
 | 
			
		||||
    local s1 = {
 | 
			
		||||
      grid = [[
 | 
			
		||||
        S2^                                                   |
 | 
			
		||||
    local s1 = [[
 | 
			
		||||
      {7:S2}^                                                   |
 | 
			
		||||
      {1:~                                                    }|*12
 | 
			
		||||
                                                           |
 | 
			
		||||
      ]],
 | 
			
		||||
    }
 | 
			
		||||
    ]]
 | 
			
		||||
    screen:expect(s1)
 | 
			
		||||
    -- Signcolumn tracking used to not count signs placed beyond end of buffer here
 | 
			
		||||
    exec('set signcolumn=auto:9')
 | 
			
		||||
    screen:expect({
 | 
			
		||||
      grid = [[
 | 
			
		||||
        S2S1^                                                 |
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7:S2S1}^                                                 |
 | 
			
		||||
      {1:~                                                    }|*12
 | 
			
		||||
                                                           |
 | 
			
		||||
      ]],
 | 
			
		||||
    })
 | 
			
		||||
    ]])
 | 
			
		||||
    -- Unplacing the sign does not crash by decrementing tracked signs below zero
 | 
			
		||||
    exec('sign unplace 1')
 | 
			
		||||
    screen:expect(s1)
 | 
			
		||||
@@ -658,7 +675,7 @@ describe('Signs', function()
 | 
			
		||||
      {7:  }497                     │{7:  }2                       |
 | 
			
		||||
      {7:  }498                     │{7:  }3                       |
 | 
			
		||||
      {7:  }499                     │{7:  }4                       |
 | 
			
		||||
      ! ^500                     │{7:  }5                       |
 | 
			
		||||
      {7:! }^500                     │{7:  }5                       |
 | 
			
		||||
      {3:[No Name] [+]              }{2:[No Name] [+]             }|
 | 
			
		||||
                                                           |
 | 
			
		||||
    ]])
 | 
			
		||||
@@ -675,7 +692,7 @@ describe('Signs', function()
 | 
			
		||||
      {7:  }497                     │{7:  }2                       |
 | 
			
		||||
      {7:  }498                     │{7:  }3                       |
 | 
			
		||||
      {7:  }499                     │{7:  }4                       |
 | 
			
		||||
      ! ^500                     │{7:  }5                       |
 | 
			
		||||
      {7:! }^500                     │{7:  }5                       |
 | 
			
		||||
      {3:[No Name] [+]              }{2:[No Name] [+]             }|
 | 
			
		||||
      :lua log, needs_clear = {}, true                     |
 | 
			
		||||
    ]])
 | 
			
		||||
 
 | 
			
		||||
@@ -236,6 +236,11 @@ describe('statuscolumn', function()
 | 
			
		||||
    command("call setline(1,repeat([repeat('aaaaa',10)],16))")
 | 
			
		||||
    screen:add_extra_attr_ids {
 | 
			
		||||
      [100] = { foreground = Screen.colors.Red, background = Screen.colors.LightGray },
 | 
			
		||||
      [101] = {
 | 
			
		||||
        bold = true,
 | 
			
		||||
        background = Screen.colors.WebGray,
 | 
			
		||||
        foreground = Screen.colors.DarkBlue,
 | 
			
		||||
      },
 | 
			
		||||
    }
 | 
			
		||||
    command('hi! CursorLine guifg=Red guibg=NONE')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
@@ -308,7 +313,7 @@ describe('statuscolumn', function()
 | 
			
		||||
      {7: }{8:  │}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7: }{8: 7│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:  │}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7:+}{15: 8│}{7:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101:+}{15: 8│}{101:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7: }{8: 9│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:  │}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7: }{8:10│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
@@ -326,7 +331,7 @@ describe('statuscolumn', function()
 | 
			
		||||
      {7: }{8: 6│}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7: }{8: 7│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8: 7│}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7:+}{15: 8│}{7:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101:+}{15: 8│}{101:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7: }{8: 9│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8: 9│}{7:    }{8: }aaaaaa                                      |
 | 
			
		||||
      {7: }{8:10│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
@@ -344,7 +349,7 @@ describe('statuscolumn', function()
 | 
			
		||||
      {7: }{8:  2│}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7:+}{15:  0│}{7:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101:+}{15:  0│}{101:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7: }{8:  2│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
@@ -361,7 +366,7 @@ describe('statuscolumn', function()
 | 
			
		||||
      {7: }{8:   │}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:   │}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7:+}{15:  0│}{7:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101:+}{15:  0│}{101:    }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7: }{8:  1│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:   │}{7:    }{8: }aaaaaaa                                    |
 | 
			
		||||
      {7: }{8:  2│}{7:    }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
@@ -386,7 +391,7 @@ describe('statuscolumn', function()
 | 
			
		||||
      {7: }{8:   │}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaa        |
 | 
			
		||||
      {7: }{8:  1│}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:   │}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaa        |
 | 
			
		||||
      {7:+}{15:  0│}{7:                  }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101:+}{15:  0│}{101:                  }{15: }{100:^+--  1 line: aaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7: }{8:  1│}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7: }{8:   │}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaa        |
 | 
			
		||||
      {7: }{8:  2│}{7:                  }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
@@ -397,7 +402,7 @@ describe('statuscolumn', function()
 | 
			
		||||
    command('set cpoptions+=n')
 | 
			
		||||
    feed('Hgjg0')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7: }{15:  0│}{8:>>}{7:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101: }{15:  0│>>}{101:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }{19:^aaaaaaaaaaaaaaaaaaaaa             }|
 | 
			
		||||
      {7: }{8:  3│}{1:>!}{7:                }{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
 | 
			
		||||
      {7:                   }aaaaaaaaaaaaaaaaaaaaa             |
 | 
			
		||||
@@ -416,7 +421,7 @@ describe('statuscolumn', function()
 | 
			
		||||
    command('sign unplace 2')
 | 
			
		||||
    feed('J2gjg0')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7: }{15:  0│}{8:>>}{7:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101: }{15:  0│>>}{101:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }     {19:aaaaaaaaaaaaaaaaaaaaa aaaaaaa}|
 | 
			
		||||
      {7:                   }     {19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }     {19:^aaaaaaaaaaaaaa               }|
 | 
			
		||||
@@ -434,7 +439,7 @@ describe('statuscolumn', function()
 | 
			
		||||
    command('set nobreakindent')
 | 
			
		||||
    feed('$g0')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {7: }{15:  0│}{8:>>}{7:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {101: }{15:  0│>>}{101:                }{15: }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }{19:aaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }{19:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}|
 | 
			
		||||
      {7:                   }{19:^aaaa                              }|
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user