mirror of
https://github.com/neovim/neovim.git
synced 2025-09-25 04:28:33 +00:00
floats: add NormalFloat highlight and 'nonumber' default
This commit is contained in:
@@ -4953,6 +4953,8 @@ NonText '@' at the end of the window, characters from 'showbreak'
|
|||||||
fit at the end of the line). See also |hl-EndOfBuffer|.
|
fit at the end of the line). See also |hl-EndOfBuffer|.
|
||||||
*hl-Normal*
|
*hl-Normal*
|
||||||
Normal normal text
|
Normal normal text
|
||||||
|
*hl-NormalFloat*
|
||||||
|
NormalFloat Normal text in floating windows.
|
||||||
*hl-NormalNC*
|
*hl-NormalNC*
|
||||||
NormalNC normal text in non-current windows
|
NormalNC normal text in non-current windows
|
||||||
*hl-Pmenu*
|
*hl-Pmenu*
|
||||||
|
@@ -161,6 +161,7 @@ Functions:
|
|||||||
|
|
||||||
Highlight groups:
|
Highlight groups:
|
||||||
|expr-highlight| highlight groups (prefixed with "Nvim")
|
|expr-highlight| highlight groups (prefixed with "Nvim")
|
||||||
|
|hl-NormalFloat| highlights floating window
|
||||||
|hl-NormalNC| highlights non-current windows
|
|hl-NormalNC| highlights non-current windows
|
||||||
|hl-MsgSeparator| highlights separator for scrolled messages
|
|hl-MsgSeparator| highlights separator for scrolled messages
|
||||||
|hl-QuickFixLine|
|
|hl-QuickFixLine|
|
||||||
|
@@ -160,14 +160,19 @@ void update_window_hl(win_T *wp, bool invalid)
|
|||||||
wp->w_hl_needs_update = false;
|
wp->w_hl_needs_update = false;
|
||||||
|
|
||||||
// determine window specific background set in 'winhighlight'
|
// determine window specific background set in 'winhighlight'
|
||||||
|
bool float_win = wp->w_floating && !wp->w_float_config.external;
|
||||||
if (wp != curwin && wp->w_hl_ids[HLF_INACTIVE] > 0) {
|
if (wp != curwin && wp->w_hl_ids[HLF_INACTIVE] > 0) {
|
||||||
wp->w_hl_attr_normal = hl_get_ui_attr(HLF_INACTIVE,
|
wp->w_hl_attr_normal = hl_get_ui_attr(HLF_INACTIVE,
|
||||||
wp->w_hl_ids[HLF_INACTIVE], true);
|
wp->w_hl_ids[HLF_INACTIVE], true);
|
||||||
|
} else if (float_win && wp->w_hl_ids[HLF_NFLOAT] > 0) {
|
||||||
|
wp->w_hl_attr_normal = hl_get_ui_attr(HLF_NFLOAT,
|
||||||
|
wp->w_hl_ids[HLF_NFLOAT], true);
|
||||||
} else if (wp->w_hl_id_normal > 0) {
|
} else if (wp->w_hl_id_normal > 0) {
|
||||||
wp->w_hl_attr_normal = hl_get_ui_attr(-1, wp->w_hl_id_normal, true);
|
wp->w_hl_attr_normal = hl_get_ui_attr(-1, wp->w_hl_id_normal, true);
|
||||||
} else {
|
} else {
|
||||||
wp->w_hl_attr_normal = 0;
|
wp->w_hl_attr_normal = float_win ? HL_ATTR(HLF_NFLOAT) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wp != curwin) {
|
if (wp != curwin) {
|
||||||
wp->w_hl_attr_normal = hl_combine_attr(HL_ATTR(HLF_INACTIVE),
|
wp->w_hl_attr_normal = hl_combine_attr(HL_ATTR(HLF_INACTIVE),
|
||||||
wp->w_hl_attr_normal);
|
wp->w_hl_attr_normal);
|
||||||
|
@@ -90,6 +90,7 @@ typedef enum {
|
|||||||
, HLF_0 // Whitespace
|
, HLF_0 // Whitespace
|
||||||
, HLF_INACTIVE // NormalNC: Normal text in non-current windows
|
, HLF_INACTIVE // NormalNC: Normal text in non-current windows
|
||||||
, HLF_MSGSEP // message separator line
|
, HLF_MSGSEP // message separator line
|
||||||
|
, HLF_NFLOAT // Floating window
|
||||||
, HLF_COUNT // MUST be the last one
|
, HLF_COUNT // MUST be the last one
|
||||||
} hlf_T;
|
} hlf_T;
|
||||||
|
|
||||||
@@ -142,6 +143,7 @@ EXTERN const char *hlf_names[] INIT(= {
|
|||||||
[HLF_0] = "Whitespace",
|
[HLF_0] = "Whitespace",
|
||||||
[HLF_INACTIVE] = "NormalNC",
|
[HLF_INACTIVE] = "NormalNC",
|
||||||
[HLF_MSGSEP] = "MsgSeparator",
|
[HLF_MSGSEP] = "MsgSeparator",
|
||||||
|
[HLF_NFLOAT] = "NormalFloat",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@@ -5956,6 +5956,7 @@ static const char *highlight_init_both[] = {
|
|||||||
"default link Substitute Search",
|
"default link Substitute Search",
|
||||||
"default link Whitespace NonText",
|
"default link Whitespace NonText",
|
||||||
"default link MsgSeparator StatusLine",
|
"default link MsgSeparator StatusLine",
|
||||||
|
"default link NormalFloat Pmenu",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -567,6 +567,10 @@ win_T *win_new_float(win_T *wp, int width, int height, FloatConfig config,
|
|||||||
wp->w_floating = 1;
|
wp->w_floating = 1;
|
||||||
wp->w_status_height = 0;
|
wp->w_status_height = 0;
|
||||||
wp->w_vsep_width = 0;
|
wp->w_vsep_width = 0;
|
||||||
|
|
||||||
|
// TODO(bfredl): use set_option_to() after merging #9110 ?
|
||||||
|
wp->w_p_nu = false;
|
||||||
|
wp->w_allbuf_opt.wo_nu = false;
|
||||||
win_config_float(wp, width, height, config);
|
win_config_float(wp, width, height, config);
|
||||||
wp->w_pos_changed = true;
|
wp->w_pos_changed = true;
|
||||||
redraw_win_later(wp, VALID);
|
redraw_win_later(wp, VALID);
|
||||||
@@ -586,6 +590,7 @@ void win_config_float(win_T *wp, int width, int height,
|
|||||||
config.window = curwin->handle;
|
config.window = curwin->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool change_external = config.external != wp->w_float_config.external;
|
||||||
wp->w_float_config = config;
|
wp->w_float_config = config;
|
||||||
|
|
||||||
if (!ui_has(kUIMultigrid)) {
|
if (!ui_has(kUIMultigrid)) {
|
||||||
@@ -596,6 +601,10 @@ void win_config_float(win_T *wp, int width, int height,
|
|||||||
win_set_inner_size(wp);
|
win_set_inner_size(wp);
|
||||||
must_redraw = MAX(must_redraw, VALID);
|
must_redraw = MAX(must_redraw, VALID);
|
||||||
wp->w_pos_changed = true;
|
wp->w_pos_changed = true;
|
||||||
|
if (change_external) {
|
||||||
|
wp->w_hl_needs_update = true;
|
||||||
|
redraw_win_later(wp, NOT_VALID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ui_ext_win_position(win_T *wp)
|
static void ui_ext_win_position(win_T *wp)
|
||||||
|
@@ -216,10 +216,10 @@ describe('ui/cursor', function()
|
|||||||
if m.blinkwait then m.blinkwait = 700 end
|
if m.blinkwait then m.blinkwait = 700 end
|
||||||
end
|
end
|
||||||
if m.hl_id then
|
if m.hl_id then
|
||||||
m.hl_id = 49
|
m.hl_id = 50
|
||||||
m.attr = {background = Screen.colors.DarkGray}
|
m.attr = {background = Screen.colors.DarkGray}
|
||||||
end
|
end
|
||||||
if m.id_lm then m.id_lm = 50 end
|
if m.id_lm then m.id_lm = 51 end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Assert the new expectation.
|
-- Assert the new expectation.
|
||||||
|
@@ -29,7 +29,10 @@ describe('floating windows', function()
|
|||||||
[10] = {background = Screen.colors.LightGrey, underline = true, bold = true, foreground = Screen.colors.Magenta},
|
[10] = {background = Screen.colors.LightGrey, underline = true, bold = true, foreground = Screen.colors.Magenta},
|
||||||
[11] = {bold = true, foreground = Screen.colors.Magenta},
|
[11] = {bold = true, foreground = Screen.colors.Magenta},
|
||||||
[12] = {background = Screen.colors.Red, bold = true, foreground = Screen.colors.Blue1},
|
[12] = {background = Screen.colors.Red, bold = true, foreground = Screen.colors.Blue1},
|
||||||
[13] = {background = Screen.colors.WebGray}
|
[13] = {background = Screen.colors.WebGray},
|
||||||
|
[14] = {foreground = Screen.colors.Brown},
|
||||||
|
[15] = {background = Screen.colors.Grey20},
|
||||||
|
[16] = {background = Screen.colors.Grey20, bold = true, foreground = Screen.colors.Blue1},
|
||||||
}
|
}
|
||||||
|
|
||||||
local function with_ext_multigrid(multigrid)
|
local function with_ext_multigrid(multigrid)
|
||||||
@@ -43,12 +46,10 @@ describe('floating windows', function()
|
|||||||
it('can be created and reconfigured', function()
|
it('can be created and reconfigured', function()
|
||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
local win = meths.open_win(buf, false, 20, 2, {relative='editor', row=2, col=5})
|
local win = meths.open_win(buf, false, 20, 2, {relative='editor', row=2, col=5})
|
||||||
meths.win_set_option(win , 'winhl', 'Normal:PMenu')
|
|
||||||
local expected_pos = {
|
local expected_pos = {
|
||||||
[3]={{id=1001}, 'NW', 1, 2, 5, true},
|
[3]={{id=1001}, 'NW', 1, 2, 5, true},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if multigrid then
|
if multigrid then
|
||||||
screen:expect{grid=[[
|
screen:expect{grid=[[
|
||||||
## grid 1
|
## grid 1
|
||||||
@@ -151,6 +152,83 @@ describe('floating windows', function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('defaults to nonumber and NormalFloat highlight', function()
|
||||||
|
command('set number')
|
||||||
|
command('hi NormalFloat guibg=#333333')
|
||||||
|
feed('ix<cr>y<cr><esc>gg')
|
||||||
|
local win = meths.open_win(0, false, 20, 4, {relative='editor', row=4, col=10})
|
||||||
|
if multigrid then
|
||||||
|
screen:expect{grid=[[
|
||||||
|
## grid 1
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
|
|
||||||
|
## grid 2
|
||||||
|
{14: 1 }^x |
|
||||||
|
{14: 2 }y |
|
||||||
|
{14: 3 } |
|
||||||
|
{0:~ }|
|
||||||
|
{0:~ }|
|
||||||
|
{0:~ }|
|
||||||
|
## grid 3
|
||||||
|
{15:x }|
|
||||||
|
{15:y }|
|
||||||
|
{15: }|
|
||||||
|
{16:~ }|
|
||||||
|
]], float_pos={[3] = {{id = 1001}, "NW", 1, 4, 10, true}}}
|
||||||
|
else
|
||||||
|
screen:expect([[
|
||||||
|
{14: 1 }^x |
|
||||||
|
{14: 2 }y |
|
||||||
|
{14: 3 } {15:x } |
|
||||||
|
{0:~ }{15:y }{0: }|
|
||||||
|
{0:~ }{15: }{0: }|
|
||||||
|
{0:~ }{16:~ }{0: }|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end
|
||||||
|
|
||||||
|
local buf = meths.create_buf(false, true)
|
||||||
|
meths.win_set_buf(win, buf)
|
||||||
|
if multigrid then
|
||||||
|
screen:expect{grid=[[
|
||||||
|
## grid 1
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
[2:----------------------------------------]|
|
||||||
|
{4:[No Name] [+] }|
|
||||||
|
|
|
||||||
|
## grid 2
|
||||||
|
{14: 1 }^x |
|
||||||
|
{14: 2 }y |
|
||||||
|
{14: 3 } |
|
||||||
|
{0:~ }|
|
||||||
|
{0:~ }|
|
||||||
|
## grid 3
|
||||||
|
{15: }|
|
||||||
|
{16:~ }|
|
||||||
|
{16:~ }|
|
||||||
|
{16:~ }|
|
||||||
|
]], float_pos={[3] = {{id = 1001}, "NW", 1, 4, 10, true}}}
|
||||||
|
else
|
||||||
|
screen:expect([[
|
||||||
|
{14: 1 }^x |
|
||||||
|
{14: 2 }y |
|
||||||
|
{14: 3 } {15: } |
|
||||||
|
{0:~ }{16:~ }{0: }|
|
||||||
|
{0:~ }{16:~ }{0: }|
|
||||||
|
{4:[No Name] }{16:~ }{4: }|
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
it('API has proper error messages', function()
|
it('API has proper error messages', function()
|
||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
eq({false, "Invalid options key 'bork'"},
|
eq({false, "Invalid options key 'bork'"},
|
||||||
@@ -211,7 +289,6 @@ describe('floating windows', function()
|
|||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
-- no 'win' arg, relative default window
|
-- no 'win' arg, relative default window
|
||||||
local win = meths.open_win(buf, false, 20, 2, {relative='win', row=0, col=10})
|
local win = meths.open_win(buf, false, 20, 2, {relative='win', row=0, col=10})
|
||||||
meths.win_set_option(win, 'winhl', 'Normal:PMenu')
|
|
||||||
if multigrid then
|
if multigrid then
|
||||||
screen:expect{grid=[[
|
screen:expect{grid=[[
|
||||||
## grid 1
|
## grid 1
|
||||||
@@ -467,8 +544,7 @@ describe('floating windows', function()
|
|||||||
screen2:attach(nil, session2)
|
screen2:attach(nil, session2)
|
||||||
screen2:set_default_attr_ids(attrs)
|
screen2:set_default_attr_ids(attrs)
|
||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
local win = meths.open_win(buf, true, 20, 2, {relative='editor', row=2, col=5})
|
meths.open_win(buf, true, 20, 2, {relative='editor', row=2, col=5})
|
||||||
meths.win_set_option(win, 'winhl', 'Normal:PMenu')
|
|
||||||
local expected_pos = {
|
local expected_pos = {
|
||||||
[2]={{id=1001}, 'NW', 1, 2, 5}
|
[2]={{id=1001}, 'NW', 1, 2, 5}
|
||||||
}
|
}
|
||||||
@@ -502,7 +578,6 @@ describe('floating windows', function()
|
|||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
meths.buf_set_lines(buf, 0, -1, true, {'such', 'very', 'float'})
|
meths.buf_set_lines(buf, 0, -1, true, {'such', 'very', 'float'})
|
||||||
local win = meths.open_win(buf, false, 15, 4, {relative='editor', row=2, col=10})
|
local win = meths.open_win(buf, false, 15, 4, {relative='editor', row=2, col=10})
|
||||||
meths.win_set_option(win , 'winhl', 'Normal:PMenu')
|
|
||||||
local expected_pos = {
|
local expected_pos = {
|
||||||
[4]={{id=1002}, 'NW', 1, 2, 10, true},
|
[4]={{id=1002}, 'NW', 1, 2, 10, true},
|
||||||
}
|
}
|
||||||
@@ -1417,7 +1492,6 @@ describe('floating windows', function()
|
|||||||
local buf = meths.create_buf(false,false)
|
local buf = meths.create_buf(false,false)
|
||||||
win = meths.open_win(buf, false, 20, 2, {relative='editor', row=2, col=5})
|
win = meths.open_win(buf, false, 20, 2, {relative='editor', row=2, col=5})
|
||||||
meths.buf_set_lines(buf,0,-1,true,{"y"})
|
meths.buf_set_lines(buf,0,-1,true,{"y"})
|
||||||
meths.win_set_option(win , 'winhl', 'Normal:PMenu')
|
|
||||||
expected_pos = {
|
expected_pos = {
|
||||||
[3]={{id=1001}, 'NW', 1, 2, 5, true}
|
[3]={{id=1001}, 'NW', 1, 2, 5, true}
|
||||||
}
|
}
|
||||||
@@ -2057,39 +2131,6 @@ describe('floating windows', function()
|
|||||||
|
|
||||||
it("s :split (float)", function()
|
it("s :split (float)", function()
|
||||||
feed("<c-w>w<c-w>s")
|
feed("<c-w>w<c-w>s")
|
||||||
if multigrid then
|
|
||||||
screen:expect{grid=[[
|
|
||||||
## grid 1
|
|
||||||
[4:----------------------------------------]|
|
|
||||||
[4:----------------------------------------]|
|
|
||||||
{4:[No Name] [+] }|
|
|
||||||
[2:----------------------------------------]|
|
|
||||||
[2:----------------------------------------]|
|
|
||||||
{5:[No Name] [+] }|
|
|
||||||
|
|
|
||||||
## grid 2
|
|
||||||
x |
|
|
||||||
{0:~ }|
|
|
||||||
## grid 3
|
|
||||||
{1:y }|
|
|
||||||
{2:~ }|
|
|
||||||
## grid 4
|
|
||||||
{1:^y }|
|
|
||||||
{2:~ }|
|
|
||||||
]], float_pos=expected_pos}
|
|
||||||
else
|
|
||||||
screen:expect([[
|
|
||||||
{1:^y }|
|
|
||||||
{2:~ }|
|
|
||||||
{4:[No N}{1:y }{4: }|
|
|
||||||
x {2:~ } |
|
|
||||||
{0:~ }|
|
|
||||||
{5:[No Name] [+] }|
|
|
||||||
|
|
|
||||||
]])
|
|
||||||
end
|
|
||||||
|
|
||||||
feed(":set winhighlight=<cr><c-l>")
|
|
||||||
if multigrid then
|
if multigrid then
|
||||||
screen:expect{grid=[[
|
screen:expect{grid=[[
|
||||||
## grid 1
|
## grid 1
|
||||||
@@ -2122,7 +2163,6 @@ describe('floating windows', function()
|
|||||||
]])
|
]])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
feed("<c-w>j")
|
feed("<c-w>j")
|
||||||
if multigrid then
|
if multigrid then
|
||||||
screen:expect{grid=[[
|
screen:expect{grid=[[
|
||||||
@@ -2659,16 +2699,16 @@ describe('floating windows', function()
|
|||||||
x |
|
x |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:^y }|
|
^y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
]]}
|
]]}
|
||||||
else
|
else
|
||||||
screen:expect([[
|
screen:expect([[
|
||||||
x |
|
x |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
{5:[No Name] [+] }|
|
{5:[No Name] [+] }|
|
||||||
{1:^y }|
|
^y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
{4:[No Name] [+] }|
|
{4:[No Name] [+] }|
|
||||||
|
|
|
|
||||||
]])
|
]])
|
||||||
@@ -2693,8 +2733,8 @@ describe('floating windows', function()
|
|||||||
{0:~ }|
|
{0:~ }|
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:^y }|
|
^y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
]], float_pos=expected_pos}
|
]], float_pos=expected_pos}
|
||||||
else
|
else
|
||||||
eq({false, "UI doesn't support external windows"},
|
eq({false, "UI doesn't support external windows"},
|
||||||
@@ -2717,11 +2757,10 @@ describe('floating windows', function()
|
|||||||
x |
|
x |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:^y }|
|
^y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
]])
|
]])
|
||||||
end
|
end
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('movements with nested split layout', function()
|
it('movements with nested split layout', function()
|
||||||
@@ -2786,8 +2825,8 @@ describe('floating windows', function()
|
|||||||
4 |
|
4 |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
^5 |
|
{1:^5 }|
|
||||||
{0:~ }|
|
{2:~ }|
|
||||||
## grid 4
|
## grid 4
|
||||||
2 |
|
2 |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
@@ -2802,8 +2841,8 @@ describe('floating windows', function()
|
|||||||
screen:expect([[
|
screen:expect([[
|
||||||
1 {5:│}2 |
|
1 {5:│}2 |
|
||||||
{0:~ }{5:│}{0:~ }|
|
{0:~ }{5:│}{0:~ }|
|
||||||
{5:[No N}^5 {5:ame] [+] }|
|
{5:[No N}{1:^5 }{5:ame] [+] }|
|
||||||
3 {0:~ } |
|
3 {2:~ } |
|
||||||
{0:~ }{5:│}{0:~ }|
|
{0:~ }{5:│}{0:~ }|
|
||||||
{5:[No Name] [+] [No Name] [+] }|
|
{5:[No Name] [+] [No Name] [+] }|
|
||||||
:enew |
|
:enew |
|
||||||
@@ -2985,8 +3024,8 @@ describe('floating windows', function()
|
|||||||
{0:~ }|
|
{0:~ }|
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:y }|
|
y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
## grid 4
|
## grid 4
|
||||||
^ |
|
^ |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
@@ -3016,8 +3055,8 @@ describe('floating windows', function()
|
|||||||
{0:~ }|
|
{0:~ }|
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:y }|
|
y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
## grid 4
|
## grid 4
|
||||||
|
|
|
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
@@ -3044,8 +3083,8 @@ describe('floating windows', function()
|
|||||||
{0:~ }|
|
{0:~ }|
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
## grid 3
|
## grid 3
|
||||||
{1:y }|
|
y |
|
||||||
{2:~ }|
|
{0:~ }|
|
||||||
## grid 4
|
## grid 4
|
||||||
^ |
|
^ |
|
||||||
{0:~ }|
|
{0:~ }|
|
||||||
|
Reference in New Issue
Block a user