mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1007 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1007 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local helpers = require('test.functional.helpers')(after_each)
 | |
| local Screen = require('test.functional.ui.screen')
 | |
| local clear, feed = helpers.clear, helpers.feed
 | |
| local eval = helpers.eval
 | |
| local eq = helpers.eq
 | |
| local command = helpers.command
 | |
| local set_method_error = helpers.set_method_error
 | |
| local meths = helpers.meths
 | |
| 
 | |
| 
 | |
| describe('ui/ext_messages', function()
 | |
|   local screen
 | |
| 
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = Screen.new(25, 5)
 | |
|     screen:attach({rgb=true, ext_messages=true, ext_popupmenu=true})
 | |
|     screen:set_default_attr_ids({
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|       [3] = {bold = true},
 | |
|       [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|       [5] = {foreground = Screen.colors.Blue1},
 | |
|       [6] = {bold = true, reverse = true},
 | |
|       [7] = {background = Screen.colors.Yellow},
 | |
|       [8] = {foreground = Screen.colors.Red},
 | |
|     })
 | |
|   end)
 | |
|   after_each(function()
 | |
|     os.remove('Xtest')
 | |
|   end)
 | |
| 
 | |
|   it('msg_clear follows msg_show kind of confirm', function()
 | |
|     feed('iline 1<esc>')
 | |
|     feed(':call confirm("test")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       line ^1                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={ {
 | |
|       content = {{"\ntest\n[O]k: ", 4}},
 | |
|       kind = 'confirm',
 | |
|     }}}
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       line ^1                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it('msg_show kind=confirm,confirm_sub,emsg,wmsg,quickfix', function()
 | |
|     feed('iline 1\nline 2<esc>')
 | |
| 
 | |
|     -- kind=confirm
 | |
|     feed(':echo confirm("test")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       line 1                   |
 | |
|       line ^2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={ {
 | |
|       content = {{"\ntest\n[O]k: ", 4}},
 | |
|       kind = 'confirm',
 | |
|     }}}
 | |
|     feed('<cr><cr>')
 | |
|     screen:expect{grid=[[
 | |
|       line 1                   |
 | |
|       line ^2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={ {
 | |
|         content = { { "\ntest\n[O]k: ", 4 } },
 | |
|         kind = "confirm"
 | |
|       }, {
 | |
|         content = { { "1" } },
 | |
|         kind = "echo"
 | |
|       }, {
 | |
|         content = { { "Press ENTER or type command to continue", 4 } },
 | |
|         kind = "return_prompt"
 | |
|     } }}
 | |
|     feed('<cr><cr>')
 | |
| 
 | |
|     -- kind=confirm_sub
 | |
|     feed(':%s/i/X/gc<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       l{7:i}ne 1                   |
 | |
|       l{8:i}ne ^2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], attr_ids={
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|       [3] = {bold = true},
 | |
|       [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|       [5] = {foreground = Screen.colors.Blue1},
 | |
|       [6] = {bold = true, reverse = true},
 | |
|       [7] = {reverse = true},
 | |
|       [8] = {background = Screen.colors.Yellow},
 | |
|     }, messages={ {
 | |
|         content = { { "replace with X (y/n/a/q/l/^E/^Y)?", 4 } },
 | |
|         kind = "confirm_sub"
 | |
|       } }}
 | |
|     feed('nq')
 | |
| 
 | |
|     -- kind=wmsg (editing readonly file)
 | |
|     command('write Xtest')
 | |
|     command('set readonly nohls')
 | |
|     feed('G$x')
 | |
|     screen:expect{grid=[[
 | |
|         line 1                   |
 | |
|         {IGNORE}|
 | |
|         {1:~                        }|
 | |
|         {1:~                        }|
 | |
|         {1:~                        }|
 | |
|       ]], attr_ids={
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [7] = {foreground = Screen.colors.Red},
 | |
|       }, messages={ {
 | |
|         content = { { "W10: Warning: Changing a readonly file", 7 } },
 | |
|         kind = "wmsg"
 | |
|       }
 | |
|     }}
 | |
| 
 | |
|     -- kind=wmsg ('wrapscan' after search reaches EOF)
 | |
|     feed('uG$/i<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       l^ine 1                   |
 | |
|       line 2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], attr_ids={
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|       [3] = {bold = true},
 | |
|       [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|       [5] = {foreground = Screen.colors.Blue1},
 | |
|       [6] = {bold = true, reverse = true},
 | |
|       [7] = {foreground = Screen.colors.Red},
 | |
|     }, messages={ {
 | |
|         content = { { "search hit BOTTOM, continuing at TOP", 7 } },
 | |
|         kind = "wmsg"
 | |
|       } }}
 | |
| 
 | |
|     -- kind=emsg after :throw
 | |
|     feed(':throw "foo"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       l^ine 1                   |
 | |
|       line 2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={ {
 | |
|         content = { { "Error detected while processing :", 2 } },
 | |
|         kind = "emsg"
 | |
|       }, {
 | |
|         content = { { "E605: Exception not caught: foo", 2 } },
 | |
|         kind = ""
 | |
|       }, {
 | |
|         content = { { "Press ENTER or type command to continue", 4 } },
 | |
|         kind = "return_prompt"
 | |
|       } }
 | |
|     }
 | |
| 
 | |
|     -- kind=quickfix after :cnext
 | |
|     feed('<c-c>')
 | |
|     command("caddexpr [expand('%').':1:line1',expand('%').':2:line2']")
 | |
|     feed(':cnext<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       line 1                   |
 | |
|       ^line 2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={ {
 | |
|         content = { { "(2 of 2): line2" } },
 | |
|         kind = "quickfix"
 | |
|       } }}
 | |
|   end)
 | |
| 
 | |
|   it(':echoerr', function()
 | |
|     feed(':echoerr "raa"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{"raa", 2}},
 | |
|       kind = "echoerr",
 | |
|     }}}
 | |
| 
 | |
|     -- cmdline in a later input cycle clears error message
 | |
|     feed(':')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{ "" }},
 | |
|       pos = 0,
 | |
|     }}}
 | |
| 
 | |
| 
 | |
|     feed('echoerr "bork" | echoerr "fail"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|         content = {{ "bork", 2 }},
 | |
|         kind = "echoerr"
 | |
|       }, {
 | |
|         content = {{ "fail", 2 }},
 | |
|         kind = "echoerr"
 | |
|       }, {
 | |
|         content = {{ "Press ENTER or type command to continue", 4 }},
 | |
|         kind = "return_prompt"
 | |
|     }}}
 | |
| 
 | |
|     feed(':echoerr "extrafail"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|         content = { { "bork", 2 } },
 | |
|         kind = "echoerr"
 | |
|       }, {
 | |
|         content = { { "fail", 2 } },
 | |
|         kind = "echoerr"
 | |
|       }, {
 | |
|         content = { { "extrafail", 2 } },
 | |
|         kind = "echoerr"
 | |
|       }, {
 | |
|         content = { { "Press ENTER or type command to continue", 4 } },
 | |
|         kind = "return_prompt"
 | |
|     }}}
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]]}
 | |
| 
 | |
|     -- cmdline without interleaving wait/display keeps the error message
 | |
|     feed(':echoerr "problem" | let x = input("foo> ")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "problem", 2 }},
 | |
|       kind = "echoerr"
 | |
|     }}, cmdline={{
 | |
|       prompt = "foo> ",
 | |
|       content = {{ "" }},
 | |
|       pos = 0,
 | |
|     }}}
 | |
| 
 | |
|     feed('solution<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]]}
 | |
|     eq('solution', eval('x'))
 | |
| 
 | |
|     feed(":messages<cr>")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {kind="echoerr", content={{"raa", 2}}},
 | |
|       {kind="echoerr", content={{"bork", 2}}},
 | |
|       {kind="echoerr", content={{"fail", 2}}},
 | |
|       {kind="echoerr", content={{"extrafail", 2}}},
 | |
|       {kind="echoerr", content={{"problem", 2}}}
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it('shortmess-=S', function()
 | |
|     command('set shortmess-=S')
 | |
|     feed('iline 1\nline 2<esc>')
 | |
| 
 | |
|     feed('/line<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       {7:^line} 1                   |
 | |
|       {7:line} 2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {content = {{"/line      [1/2] W"}}, kind = "search_count"}
 | |
|     }}
 | |
| 
 | |
|     feed('n')
 | |
|     screen:expect{grid=[[
 | |
|       {7:line} 1                   |
 | |
|       {7:^line} 2                   |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {content = {{"/line        [2/2]"}}, kind = "search_count"}
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it(':hi Group output', function()
 | |
|     feed(':hi ErrorMsg<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {content = {{"\nErrorMsg      " }, {"xxx", 2}, {" "},
 | |
|                   {"ctermfg=", 5 }, { "15 " }, { "ctermbg=", 5 }, { "1 " },
 | |
|                   {"guifg=", 5 }, { "White " }, { "guibg=", 5 }, { "Red" }},
 | |
|        kind = ""}
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it("doesn't crash with column adjustment #10069", function()
 | |
|     feed(':let [x,y] = [1,2]<cr>')
 | |
|     feed(':let x y<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {content = {{ "x                     #1" }}, kind = ""},
 | |
|       {content = {{ "y                     #2" }}, kind = ""},
 | |
|       {content = {{ "Press ENTER or type command to continue", 4 }}, kind = "return_prompt"}
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it('&showmode', function()
 | |
|     command('imap <f2> <cmd>echomsg "stuff"<cr>')
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={{"-- INSERT --", 3}}}
 | |
| 
 | |
|     feed('alphpabet<cr>alphanum<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "-- INSERT --", 3 } }}
 | |
| 
 | |
|     feed('<c-x>')
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)", 3 } }}
 | |
| 
 | |
|     feed('<c-p>')
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       alphanum^                 |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], popupmenu={
 | |
|       anchor = { 1, 2, 0 },
 | |
|       items = { { "alphpabet", "", "", "" }, { "alphanum", "", "", "" } },
 | |
|       pos = 1
 | |
|     }, showmode={ { "-- Keyword Local completion (^N^P) ", 3 }, { "match 1 of 2", 4 } }}
 | |
| 
 | |
|     -- echomsg and showmode don't overwrite each other, this is the same
 | |
|     -- as the TUI behavior with cmdheight=2 or larger.
 | |
|     feed('<f2>')
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       alphanum^                 |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], popupmenu={
 | |
|       anchor = { 1, 2, 0 },
 | |
|       items = { { "alphpabet", "", "", "" }, { "alphanum", "", "", "" } },
 | |
|       pos = 1
 | |
|     }, messages={ {
 | |
|         content = { { "stuff" } },
 | |
|         kind = "echomsg"
 | |
|       } }, showmode={ { "-- Keyword Local completion (^N^P) ", 3 }, { "match 1 of 2", 4 } }}
 | |
| 
 | |
|     feed('<c-p>')
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       alphpabet^                |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], popupmenu={
 | |
|       anchor = { 1, 2, 0 },
 | |
|       items = { { "alphpabet", "", "", "" }, { "alphanum", "", "", "" } },
 | |
|       pos = 0
 | |
|     }, messages={ {
 | |
|         content = { { "stuff" } },
 | |
|         kind = "echomsg"
 | |
|       } }, showmode={ { "-- Keyword Local completion (^N^P) ", 3 }, { "match 2 of 2", 4 } }}
 | |
| 
 | |
|     feed("<esc>:messages<cr>")
 | |
|     screen:expect{grid=[[
 | |
|       alphpabet                |
 | |
|       alphanum                 |
 | |
|       alphpabe^t                |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {kind="echomsg", content={{"stuff"}}},
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it('&showmode with macro-recording message', function()
 | |
|     feed('qq')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "recording @q", 3 } }}
 | |
| 
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "-- INSERT --recording @q", 3 } }}
 | |
| 
 | |
|     feed('<esc>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "recording @q", 3 } }}
 | |
| 
 | |
|     feed('q')
 | |
|     screen:expect([[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]])
 | |
|   end)
 | |
| 
 | |
|   it('shows macro-recording message with &noshowmode', function()
 | |
|     command("set noshowmode")
 | |
|     feed('qq')
 | |
|     -- also check mode to avoid immediate success
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "recording @q", 3 } }, mode="normal"}
 | |
| 
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "recording @q", 3 } }, mode="insert"}
 | |
| 
 | |
|     feed('<esc>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "recording @q", 3 } }, mode="normal"}
 | |
| 
 | |
|     feed('q')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], mode="normal"}
 | |
|   end)
 | |
| 
 | |
|   it('supports &showcmd and &ruler', function()
 | |
|     command('set showcmd ruler')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], ruler={ { "0,0-1   All" } }}
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showmode={ { "-- INSERT --", 3 } }, ruler={ { "0,1     All" } }}
 | |
|     feed('abcde<cr>12345<esc>')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       1234^5                    |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], ruler={ { "2,5     All" } }}
 | |
|     feed('d')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       1234^5                    |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showcmd={ { "d" } }, ruler={ { "2,5     All" } }}
 | |
|     feed('<esc>^')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       ^12345                    |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], ruler={ { "2,1     All" } }}
 | |
|     feed('d')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       ^12345                    |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showcmd={ { "d" } }, ruler={ { "2,1     All" } }}
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       ^12345                    |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], showcmd={ { "di" } }, ruler={ { "2,1     All" } }}
 | |
|     feed('w')
 | |
|     screen:expect{grid=[[
 | |
|       abcde                    |
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], ruler={ { "2,0-1   All" } }}
 | |
| 
 | |
|     -- when ruler is part of statusline it is not externalized.
 | |
|     -- this will be added as part of future ext_statusline support
 | |
|     command("set laststatus=2")
 | |
|     screen:expect([[
 | |
|       abcde                    |
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {6:<o Name] [+] 2,0-1    All}|
 | |
|     ]])
 | |
|   end)
 | |
| 
 | |
|   it('keeps history of message of different kinds', function()
 | |
|     feed(':echomsg "howdy"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "howdy" }}, kind = "echomsg"}
 | |
|     }}
 | |
| 
 | |
|     -- always test a message without kind. If this one gets promoted to a
 | |
|     -- category, add a new message without kind.
 | |
|     feed('<c-c>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "Type  :qa!  and press <Enter> to abandon all changes and exit Nvim" }},
 | |
|       kind = ""}
 | |
|     }}
 | |
| 
 | |
|     feed(':echoerr "bork"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "bork", 2 }}, kind = "echoerr"}
 | |
|     }}
 | |
| 
 | |
|     feed(':echo "xyz"<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "xyz" }}, kind = "echo"}
 | |
|     }}
 | |
| 
 | |
|     feed(':call nosuchfunction()<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{ "E117: Unknown function: nosuchfunction", 2 }},
 | |
|       kind = "emsg"}
 | |
|     }}
 | |
| 
 | |
|     feed(':messages<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={
 | |
|       {kind="echomsg", content={{"howdy"}}},
 | |
|       {kind="", content={{"Type  :qa!  and press <Enter> to abandon all changes and exit Nvim"}}},
 | |
|       {kind="echoerr", content={{"bork", 2}}},
 | |
|       {kind="emsg", content={{"E117: Unknown function: nosuchfunction", 2}}}
 | |
|     }}
 | |
|   end)
 | |
| 
 | |
|   it('implies ext_cmdline and ignores cmdheight', function()
 | |
|     eq(0, eval('&cmdheight'))
 | |
|     feed(':set cmdheight=1')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], cmdline={{
 | |
|       content = { { "set cmdheight=1" } },
 | |
|       firstc = ":",
 | |
|       pos = 15 }
 | |
|     }}
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect([[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]])
 | |
|     eq(0, eval('&cmdheight'))
 | |
| 
 | |
|     -- normally this would be an error
 | |
|     feed(':set cmdheight=0')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], cmdline={{
 | |
|         content = { { "set cmdheight=0" } },
 | |
|         firstc = ":",
 | |
|         pos = 15 }
 | |
|     }}
 | |
|     feed('<cr>')
 | |
|     screen:expect([[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]])
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it('supports multiline messages from lua', function()
 | |
|     feed(':lua error("such\\nmultiline\\nerror")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|         content = {{'E5105: Error while calling lua chunk: [string "<VimL compiled string>"]:1: such\nmultiline\nerror', 2}},
 | |
|         kind = "lua_error"
 | |
|      }}}
 | |
|   end)
 | |
| 
 | |
|   it('supports multiline messages from rpc', function()
 | |
|     feed(':call rpcrequest(1, "test_method")<cr>')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|       content = {{"Error invoking 'test_method' on channel 1:\ncomplete\nerror\n\nmessage", 2}},
 | |
|       kind = "rpc_error"
 | |
|     }}, request_cb=function (name)
 | |
|       if name == "test_method" then
 | |
|         set_method_error("complete\nerror\n\nmessage")
 | |
|       end
 | |
|     end}
 | |
|   end)
 | |
| 
 | |
|   it('wildmode=list', function()
 | |
|     screen:try_resize(25, 7)
 | |
|     screen:set_option('ext_popupmenu', false)
 | |
| 
 | |
|     command('set wildmenu wildmode=list')
 | |
|     feed(':set wildm<tab>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|     ]], messages={{
 | |
|         content = {{'wildmenu  wildmode'}},
 | |
|         kind = '',
 | |
|      }},
 | |
|     cmdline={{
 | |
|       firstc = ':',
 | |
|       content = {{ 'set wildm' }},
 | |
|       pos = 9,
 | |
|     }}}
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('ui/builtin messages', function()
 | |
|   local screen
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = Screen.new(60, 7)
 | |
|     screen:attach({rgb=true, ext_popupmenu=true})
 | |
|     screen:set_default_attr_ids({
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|       [3] = {bold = true, reverse = true},
 | |
|       [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|       [5] = {foreground = Screen.colors.Blue1},
 | |
|       [6] = {bold = true, foreground = Screen.colors.Magenta},
 | |
|     })
 | |
|   end)
 | |
| 
 | |
|   it('supports multiline messages from rpc', function()
 | |
|     feed(':call rpcrequest(1, "test_method")<cr>')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       {3:                                                            }|
 | |
|       {2:Error invoking 'test_method' on channel 1:}                  |
 | |
|       {2:complete}                                                    |
 | |
|       {2:error}                                                       |
 | |
|                                                                   |
 | |
|       {2:message}                                                     |
 | |
|       {4:Press ENTER or type command to continue}^                     |
 | |
|     ]], request_cb=function (name)
 | |
|       if name == "test_method" then
 | |
|         set_method_error("complete\nerror\n\nmessage")
 | |
|       end
 | |
|     end}
 | |
|   end)
 | |
| 
 | |
|   it(':hi Group output', function()
 | |
|     screen:try_resize(70,7)
 | |
|     feed(':hi ErrorMsg<cr>')
 | |
|     screen:expect([[
 | |
|                                                                             |
 | |
|       {1:~                                                                     }|
 | |
|       {1:~                                                                     }|
 | |
|       {3:                                                                      }|
 | |
|       :hi ErrorMsg                                                          |
 | |
|       ErrorMsg       {2:xxx} {5:ctermfg=}15 {5:ctermbg=}1 {5:guifg=}White {5:guibg=}Red         |
 | |
|       {4:Press ENTER or type command to continue}^                               |
 | |
|     ]])
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:try_resize(30,7)
 | |
|     feed(':hi ErrorMsg<cr>')
 | |
|     screen:expect([[
 | |
|       :hi ErrorMsg                  |
 | |
|       ErrorMsg       {2:xxx} {5:ctermfg=}15 |
 | |
|                          {5:ctermbg=}1  |
 | |
|                          {5:guifg=}White|
 | |
|                          {5:guibg=}Red  |
 | |
|       {4:Press ENTER or type command to}|
 | |
|       {4: continue}^                     |
 | |
|     ]])
 | |
|     feed('<cr>')
 | |
| 
 | |
|     -- screen size doesn't affect internal output #10285
 | |
|     eq('ErrorMsg       xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red',
 | |
|        meths.command_output("hi ErrorMsg"))
 | |
|   end)
 | |
| 
 | |
|   it(':syntax list langGroup output', function()
 | |
|     command("syntax on")
 | |
|     command("set syntax=vim")
 | |
|     screen:try_resize(110,7)
 | |
|     feed(':syntax list vimComment<cr>')
 | |
|     screen:expect([[
 | |
|       {6:--- Syntax items ---}                                                                                          |
 | |
|       vimComment     {5:xxx} {5:match} /\s"[^\-:.%#=*].*$/ms=s+1,lc=1  {5:excludenl} {5:contains}=@vimCommentGroup,vimCommentString |
 | |
|                                                                                                                     |
 | |
|                          {5:match} /\<endif\s\+".*$/ms=s+5,lc=5  {5:contains}=@vimCommentGroup,vimCommentString             |
 | |
|                          {5:match} /\<else\s\+".*$/ms=s+4,lc=4  {5:contains}=@vimCommentGroup,vimCommentString              |
 | |
|                          {5:links to} Comment                                                                           |
 | |
|       {4:Press ENTER or type command to continue}^                                                                       |
 | |
|     ]])
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:try_resize(55,7)
 | |
|     feed(':syntax list vimComment<cr>')
 | |
|     screen:expect([[
 | |
|                                                              |
 | |
|                          {5:match} /\<endif\s\+".*$/ms=s+5,lc=5  |
 | |
|       {5:contains}=@vimCommentGroup,vimCommentString             |
 | |
|                          {5:match} /\<else\s\+".*$/ms=s+4,lc=4  {5:c}|
 | |
|       {5:ontains}=@vimCommentGroup,vimCommentString              |
 | |
|                          {5:links to} Comment                    |
 | |
|       {4:Press ENTER or type command to continue}^                |
 | |
|     ]])
 | |
|     feed('<cr>')
 | |
| 
 | |
|     -- ignore final whitespace inside string
 | |
|     -- luacheck: push ignore
 | |
|     eq([[--- Syntax items ---
 | |
| vimComment     xxx match /\s"[^\-:.%#=*].*$/ms=s+1,lc=1  excludenl contains=@vimCommentGroup,vimCommentString 
 | |
|                    match /\<endif\s\+".*$/ms=s+5,lc=5  contains=@vimCommentGroup,vimCommentString 
 | |
|                    match /\<else\s\+".*$/ms=s+4,lc=4  contains=@vimCommentGroup,vimCommentString 
 | |
|                    links to Comment]],
 | |
|        meths.command_output('syntax list vimComment'))
 | |
|     -- luacheck: pop
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('ui/ext_messages', function()
 | |
|   local screen
 | |
| 
 | |
|   before_each(function()
 | |
|     clear{args_rm={'--headless'}, args={"--cmd", "set shortmess-=I"}}
 | |
|     screen = Screen.new(80, 24)
 | |
|     screen:attach({rgb=true, ext_messages=true, ext_popupmenu=true})
 | |
|     screen:set_default_attr_ids({
 | |
|       [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|       [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|       [3] = {bold = true},
 | |
|       [4] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|       [5] = {foreground = Screen.colors.Blue1},
 | |
|     })
 | |
|   end)
 | |
| 
 | |
|   it('supports intro screen', function()
 | |
|     -- intro message is not externalized. But check that it still works.
 | |
|     -- Note parts of it depends on version or is indeterministic. We ignore those parts.
 | |
|     screen:expect([[
 | |
|       ^                                                                                |
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {IGNORE}|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                 }Nvim is open source and freely distributable{1:                  }|
 | |
|       {1:~                           }https://neovim.io/#chat{1:                             }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                }type  :help nvim{5:<Enter>}       if you are new! {1:                 }|
 | |
|       {1:~                }type  :checkhealth{5:<Enter>}     to optimize Nvim{1:                 }|
 | |
|       {1:~                }type  :q{5:<Enter>}               to exit         {1:                 }|
 | |
|       {1:~                }type  :help{5:<Enter>}            for help        {1:                 }|
 | |
|       {1:~                                                                               }|
 | |
|       {IGNORE}|
 | |
|       {IGNORE}|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|     ]])
 | |
| 
 | |
|     feed("<c-l>")
 | |
|     screen:expect([[
 | |
|       ^                                                                                |
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|       {1:~                                                                               }|
 | |
|     ]])
 | |
| 
 | |
|     feed(":intro<cr>")
 | |
|     screen:expect{grid=[[
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|       {IGNORE}|
 | |
|                                                                                       |
 | |
|                         Nvim is open source and freely distributable                  |
 | |
|                                   https://neovim.io/#chat                             |
 | |
|                                                                                       |
 | |
|                        type  :help nvim{5:<Enter>}       if you are new!                  |
 | |
|                        type  :checkhealth{5:<Enter>}     to optimize Nvim                 |
 | |
|                        type  :q{5:<Enter>}               to exit                          |
 | |
|                        type  :help{5:<Enter>}            for help                         |
 | |
|                                                                                       |
 | |
|       {IGNORE}|
 | |
|       {IGNORE}|
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|                                                                                       |
 | |
|     ]], messages={
 | |
|       {content = { { "Press ENTER or type command to continue", 4 } }, kind = "return_prompt" }
 | |
|     }}
 | |
|   end)
 | |
| end)
 | 
