mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1156 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			1156 lines
		
	
	
		
			31 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 source = helpers.source
 | |
| local command = helpers.command
 | |
| local assert_alive = helpers.assert_alive
 | |
| local uname = helpers.uname
 | |
| local eval = helpers.eval
 | |
| local eq = helpers.eq
 | |
| 
 | |
| local function new_screen(opt)
 | |
|   local screen = Screen.new(25, 5)
 | |
|   screen:attach(opt)
 | |
|   screen:set_default_attr_ids({
 | |
|     [1] = {bold = true, foreground = Screen.colors.Blue1},
 | |
|     [2] = {reverse = true},
 | |
|     [3] = {bold = true, reverse = true},
 | |
|     [4] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red},
 | |
|     [5] = {bold = true, foreground = Screen.colors.SeaGreen4},
 | |
|     [6] = {foreground = Screen.colors.Magenta},
 | |
|     [7] = {bold = true, foreground = Screen.colors.Brown},
 | |
|     [8] = {background = Screen.colors.LightGrey},
 | |
|     [9] = {bold = true},
 | |
|   })
 | |
|   return screen
 | |
| end
 | |
| 
 | |
| local function test_cmdline(linegrid)
 | |
|   local screen
 | |
| 
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = new_screen({rgb=true, ext_cmdline=true, ext_linegrid=linegrid})
 | |
|   end)
 | |
| 
 | |
|   it('works', function()
 | |
|     feed(':')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}}
 | |
| 
 | |
|     feed('sign')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign"}},
 | |
|       pos = 4,
 | |
|     }}}
 | |
| 
 | |
|     feed('<Left>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign"}},
 | |
|       pos = 3,
 | |
|     }}}
 | |
| 
 | |
|     feed('<bs>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sin"}},
 | |
|       pos = 2,
 | |
|     }}}
 | |
| 
 | |
|     feed('<Esc>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("works with input()", function()
 | |
|     feed(':call input("input", "default")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       prompt = "input",
 | |
|       content = {{"default"}},
 | |
|       pos = 7,
 | |
|     }}}
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("works with special chars and nested cmdline", function()
 | |
|     feed(':xx<c-r>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"xx"}},
 | |
|       pos = 2,
 | |
|       special = {'"', true},
 | |
|     }}}
 | |
| 
 | |
|     feed('=')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"xx"}},
 | |
|       pos = 2,
 | |
|       special = {'"', true},
 | |
|     }, {
 | |
|       firstc = "=",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}}
 | |
| 
 | |
|     feed('1+2')
 | |
|     local expectation = {{
 | |
|       firstc = ":",
 | |
|       content = {{"xx"}},
 | |
|       pos = 2,
 | |
|       special = {'"', true},
 | |
|     }, {
 | |
|       firstc = "=",
 | |
|       content = {{"1", 6}, {"+", 7}, {"2", 6}},
 | |
|       pos = 3,
 | |
|     }}
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline=expectation}
 | |
| 
 | |
|     -- erase information, so we check if it is retransmitted
 | |
|     command("mode")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline=expectation, reset=true}
 | |
| 
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"xx3"}},
 | |
|       pos = 3,
 | |
|     }}}
 | |
| 
 | |
|     feed('<esc>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("works with function definitions", function()
 | |
|     feed(':function Foo()<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       indent = 2,
 | |
|       firstc = ":",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}, cmdline_block = {
 | |
|       {{'function Foo()'}},
 | |
|     }}
 | |
| 
 | |
|     feed('line1<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       indent = 2,
 | |
|       firstc = ":",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}, cmdline_block = {
 | |
|       {{'function Foo()'}},
 | |
|       {{'  line1'}},
 | |
|     }}
 | |
| 
 | |
|     command("mode")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       indent = 2,
 | |
|       firstc = ":",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}, cmdline_block = {
 | |
|       {{'function Foo()'}},
 | |
|       {{'  line1'}},
 | |
|     }, reset=true}
 | |
| 
 | |
|     feed('endfunction<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|     -- Try once more, to check buffer is reinitialized. #8007
 | |
|     feed(':function Bar()<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       indent = 2,
 | |
|       firstc = ":",
 | |
|       content = {{""}},
 | |
|       pos = 0,
 | |
|     }}, cmdline_block = {
 | |
|       {{'function Bar()'}},
 | |
|     }}
 | |
| 
 | |
|     feed('endfunction<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|   end)
 | |
| 
 | |
|   it("works with cmdline window", function()
 | |
|     feed(':make')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"make"}},
 | |
|       pos = 4,
 | |
|     }}}
 | |
| 
 | |
|     feed('<c-f>')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {2:[No Name]                }|
 | |
|       {1::}make^                    |
 | |
|       {3:[Command Line]           }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|     -- nested cmdline
 | |
|     feed(':yank')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {2:[No Name]                }|
 | |
|       {1::}make^                    |
 | |
|       {3:[Command Line]           }|
 | |
|                                |
 | |
|     ]], cmdline={nil, {
 | |
|       firstc = ":",
 | |
|       content = {{"yank"}},
 | |
|       pos = 4,
 | |
|     }}}
 | |
| 
 | |
|     command("mode")
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {2:[No Name]                }|
 | |
|       {1::}make^                    |
 | |
|       {3:[Command Line]           }|
 | |
|                                |
 | |
|     ]], cmdline={nil, {
 | |
|       firstc = ":",
 | |
|       content = {{"yank"}},
 | |
|       pos = 4,
 | |
|     }}, reset=true}
 | |
| 
 | |
|     feed("<c-c>")
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {2:[No Name]                }|
 | |
|       {1::}make^                    |
 | |
|       {3:[Command Line]           }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|     feed("<c-c>")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {2:[No Name]                }|
 | |
|       {1::}make                    |
 | |
|       {3:[Command Line]           }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"make"}},
 | |
|       pos = 4,
 | |
|     }}}
 | |
| 
 | |
|     command("redraw!")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"make"}},
 | |
|       pos = 4,
 | |
|     }}}
 | |
|   end)
 | |
| 
 | |
|   it('works with inputsecret()', function()
 | |
|     feed(":call inputsecret('secret:')<cr>abc123")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       prompt = "secret:",
 | |
|       content = {{"******"}},
 | |
|       pos = 6,
 | |
|     }}}
 | |
|   end)
 | |
| 
 | |
|   it('works with highlighted cmdline', function()
 | |
|     source([[
 | |
|       highlight RBP1 guibg=Red
 | |
|       highlight RBP2 guibg=Yellow
 | |
|       highlight RBP3 guibg=Green
 | |
|       highlight RBP4 guibg=Blue
 | |
|       let g:NUM_LVLS = 4
 | |
|       function RainBowParens(cmdline)
 | |
|         let ret = []
 | |
|         let i = 0
 | |
|         let lvl = 0
 | |
|         while i < len(a:cmdline)
 | |
|           if a:cmdline[i] is# '('
 | |
|             call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
 | |
|             let lvl += 1
 | |
|           elseif a:cmdline[i] is# ')'
 | |
|             let lvl -= 1
 | |
|             call add(ret, [i, i + 1, 'RBP' . ((lvl % g:NUM_LVLS) + 1)])
 | |
|           endif
 | |
|           let i += 1
 | |
|         endwhile
 | |
|         return ret
 | |
|       endfunction
 | |
|       map <f5>  :let x = input({'prompt':'>','highlight':'RainBowParens'})<cr>
 | |
|       "map <f5>  :let x = input({'prompt':'>'})<cr>
 | |
|     ]])
 | |
|     screen:set_default_attr_ids({
 | |
|       RBP1={background = Screen.colors.Red},
 | |
|       RBP2={background = Screen.colors.Yellow},
 | |
|       EOB={bold = true, foreground = Screen.colors.Blue1},
 | |
|     })
 | |
|     feed('<f5>(a(b)a)')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {EOB:~                        }|
 | |
|       {EOB:~                        }|
 | |
|       {EOB:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       prompt = '>',
 | |
|       content = {{'(', 'RBP1'}, {'a'}, {'(', 'RBP2'}, {'b'},
 | |
|                  { ')', 'RBP2'}, {'a'}, {')', 'RBP1'}},
 | |
|       pos = 7,
 | |
|     }}}
 | |
|   end)
 | |
| 
 | |
|   it('works together with ext_wildmenu', function()
 | |
|     local expected = {
 | |
|       'define',
 | |
|       'jump',
 | |
|       'list',
 | |
|       'place',
 | |
|       'undefine',
 | |
|       'unplace',
 | |
|     }
 | |
| 
 | |
|     command('set wildmode=full')
 | |
|     command('set wildmenu')
 | |
|     screen:set_option('ext_wildmenu', true)
 | |
|     feed(':sign <tab>')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign define"}},
 | |
|       pos = 11,
 | |
|     }}, wildmenu_items=expected, wildmenu_pos=0}
 | |
| 
 | |
|     feed('<tab>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign jump"}},
 | |
|       pos = 9,
 | |
|     }}, wildmenu_items=expected, wildmenu_pos=1}
 | |
| 
 | |
|     feed('<left><left>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign "}},
 | |
|       pos = 5,
 | |
|     }}, wildmenu_items=expected, wildmenu_pos=-1}
 | |
| 
 | |
|     feed('<right>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign define"}},
 | |
|       pos = 11,
 | |
|     }}, wildmenu_items=expected, wildmenu_pos=0}
 | |
| 
 | |
|     feed('a')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign definea"}},
 | |
|       pos = 12,
 | |
|     }}}
 | |
|   end)
 | |
| 
 | |
|   it('works together with ext_popupmenu', function()
 | |
|     local expected = {
 | |
|         {'define', '', '', ''},
 | |
|         {'jump', '', '', ''},
 | |
|         {'list', '', '', ''},
 | |
|         {'place', '', '', ''},
 | |
|         {'undefine', '', '', ''},
 | |
|         {'unplace', '', '', ''},
 | |
|     }
 | |
| 
 | |
|     command('set wildmode=full')
 | |
|     command('set wildmenu')
 | |
|     screen:set_option('ext_popupmenu', true)
 | |
|     feed(':sign <tab>')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign define"}},
 | |
|       pos = 11,
 | |
|     }}, popupmenu={items=expected, pos=0, anchor={-1, 0, 5}}}
 | |
| 
 | |
|     feed('<tab>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign jump"}},
 | |
|       pos = 9,
 | |
|     }}, popupmenu={items=expected, pos=1, anchor={-1, 0, 5}}}
 | |
| 
 | |
|     feed('<left><left>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign "}},
 | |
|       pos = 5,
 | |
|     }}, popupmenu={items=expected, pos=-1, anchor={-1, 0, 5}}}
 | |
| 
 | |
|     feed('<right>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign define"}},
 | |
|       pos = 11,
 | |
|     }}, popupmenu={items=expected, pos=0, anchor={-1, 0, 5}}}
 | |
| 
 | |
|     feed('a')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign definea"}},
 | |
|       pos = 12,
 | |
|     }}}
 | |
|     feed('<esc>')
 | |
| 
 | |
|     -- check positioning with multibyte char in pattern
 | |
|     command("e långfile1")
 | |
|     command("sp långfile2")
 | |
|     feed(':b lå<tab>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {3:långfile2                }|
 | |
|                                |
 | |
|       {2:långfile1                }|
 | |
|                                |
 | |
|     ]], popupmenu={
 | |
|       anchor = { -1, 0, 2 },
 | |
|       items = {{ "långfile1", "", "", "" }, { "långfile2", "", "", "" }},
 | |
|       pos = 0
 | |
|     }, cmdline={{
 | |
|       content = {{ "b långfile1" }},
 | |
|       firstc = ":",
 | |
|       pos = 12
 | |
|     }}}
 | |
|   end)
 | |
| 
 | |
|   it('ext_wildmenu takes precedence over ext_popupmenu', function()
 | |
|     local expected = {
 | |
|       'define',
 | |
|       'jump',
 | |
|       'list',
 | |
|       'place',
 | |
|       'undefine',
 | |
|       'unplace',
 | |
|     }
 | |
| 
 | |
|     command('set wildmode=full')
 | |
|     command('set wildmenu')
 | |
|     screen:set_option('ext_wildmenu', true)
 | |
|     screen:set_option('ext_popupmenu', true)
 | |
|     feed(':sign <tab>')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       firstc = ":",
 | |
|       content = {{"sign define"}},
 | |
|       pos = 11,
 | |
|     }}, wildmenu_items=expected, wildmenu_pos=0}
 | |
|   end)
 | |
| 
 | |
|   it("doesn't send invalid events when aborting mapping #10000", function()
 | |
|     command('set notimeout')
 | |
|     command('cnoremap ab c')
 | |
| 
 | |
|     feed(':xa')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]], cmdline={{
 | |
|       content = { { "x" } },
 | |
|       firstc = ":",
 | |
|       pos = 1,
 | |
|       special = { "a", false }
 | |
|     }}}
 | |
| 
 | |
|     -- This used to send an invalid event where pos where larger than the total
 | |
|     -- length of content. Checked in _handle_cmdline_show.
 | |
|     feed('<esc>')
 | |
|     screen:expect([[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|                                |
 | |
|     ]])
 | |
|   end)
 | |
| 
 | |
| end
 | |
| 
 | |
| -- the representation of cmdline and cmdline_block contents changed with ext_linegrid
 | |
| -- (which uses indexed highlights) so make sure to test both
 | |
| describe('ui/ext_cmdline', function() test_cmdline(true) end)
 | |
| describe('ui/ext_cmdline (legacy highlights)', function() test_cmdline(false) end)
 | |
| 
 | |
| describe('cmdline redraw', function()
 | |
|   local screen
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = new_screen({rgb=true})
 | |
|   end)
 | |
| 
 | |
|   it('with timer', function()
 | |
|     feed(':012345678901234567890123456789')
 | |
|     screen:expect{grid=[[
 | |
|                              |
 | |
|     {1:~                        }|
 | |
|     {3:                         }|
 | |
|     :012345678901234567890123|
 | |
|     456789^                   |
 | |
|     ]]}
 | |
|     command('call timer_start(0, {-> 1})')
 | |
|     screen:expect{grid=[[
 | |
|                              |
 | |
|     {1:~                        }|
 | |
|     {3:                         }|
 | |
|     :012345678901234567890123|
 | |
|     456789^                   |
 | |
|     ]], unchanged=true, timeout=100}
 | |
|   end)
 | |
| 
 | |
|   it('with <Cmd>', function()
 | |
|     if string.find(uname(), 'bsd') then
 | |
|       pending('FIXME #10804')
 | |
|     end
 | |
|     command('cmap a <Cmd>call sin(0)<CR>')  -- no-op
 | |
|     feed(':012345678901234567890123456789')
 | |
|     screen:expect{grid=[[
 | |
|                              |
 | |
|     {1:~                        }|
 | |
|     {3:                         }|
 | |
|     :012345678901234567890123|
 | |
|     456789^                   |
 | |
|     ]]}
 | |
|     feed('a')
 | |
|     screen:expect{grid=[[
 | |
|                              |
 | |
|     {1:~                        }|
 | |
|     {3:                         }|
 | |
|     :012345678901234567890123|
 | |
|     456789^                   |
 | |
|     ]], unchanged=true}
 | |
|   end)
 | |
| 
 | |
|   it('after pressing Ctrl-C in cmdwin in Visual mode #18967', function()
 | |
|     screen:try_resize(40, 10)
 | |
|     command('set cmdwinheight=3')
 | |
|     feed('q:iabc<Esc>vhh')
 | |
|     screen:expect([[
 | |
|                                               |
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {2:[No Name]                               }|
 | |
|       {1::}^a{8:bc}                                    |
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {3:[Command Line]                          }|
 | |
|       {9:-- VISUAL --}                            |
 | |
|     ]])
 | |
|     feed('<C-C>')
 | |
|     screen:expect([[
 | |
|                                               |
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {2:[No Name]                               }|
 | |
|       {1::}a{8:bc}                                    |
 | |
|       {1:~                                       }|
 | |
|       {1:~                                       }|
 | |
|       {3:[Command Line]                          }|
 | |
|       :^abc                                    |
 | |
|     ]])
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('statusline is redrawn on entering cmdline', function()
 | |
|   local screen
 | |
| 
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = new_screen()
 | |
|     command('set laststatus=2')
 | |
|   end)
 | |
| 
 | |
|   it('from normal mode', function()
 | |
|     command('set statusline=%{mode()}')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {3:n                        }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|     feed(':')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {3:c                        }|
 | |
|       :^                        |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it('from normal mode when : is mapped', function()
 | |
|     command('set statusline=%{mode()}')
 | |
|     command('nnoremap ; :')
 | |
| 
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {3:n                        }|
 | |
|                                |
 | |
|     ]]}
 | |
| 
 | |
|     feed(';')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       {1:~                        }|
 | |
|       {1:~                        }|
 | |
|       {3:c                        }|
 | |
|       :^                        |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it('but not with scrolled messages', function()
 | |
|     command('set statusline=%{mode()}')
 | |
|     screen:try_resize(35,10)
 | |
|     feed(':echoerr doesnotexist<cr>')
 | |
|     screen:expect{grid=[[
 | |
|                                          |
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {3:                                   }|
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {5:inue}^                               |
 | |
|     ]]}
 | |
|     feed(':echoerr doesnotexist<cr>')
 | |
|     screen:expect{grid=[[
 | |
|                                          |
 | |
|       {1:~                                  }|
 | |
|       {3:                                   }|
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {5:inue}^                               |
 | |
|     ]]}
 | |
| 
 | |
|     feed(':echoerr doesnotexist<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {4:E121: Undefined variable: doesnotex}|
 | |
|       {4:ist}                                |
 | |
|       {5:Press ENTER or type command to cont}|
 | |
|       {5:inue}^                               |
 | |
|     ]]}
 | |
| 
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                                   |
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {1:~                                  }|
 | |
|       {3:n                                  }|
 | |
|                                          |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   describe('if custom statusline is set by', function()
 | |
|     before_each(function()
 | |
|       command('set statusline=')
 | |
|       screen:expect{grid=[[
 | |
|         ^                         |
 | |
|         {1:~                        }|
 | |
|         {1:~                        }|
 | |
|         {3:[No Name]                }|
 | |
|                                  |
 | |
|       ]]}
 | |
|     end)
 | |
| 
 | |
|     it('CmdlineEnter autocommand', function()
 | |
|       command('autocmd CmdlineEnter * set statusline=command')
 | |
|       feed(':')
 | |
|       screen:expect{grid=[[
 | |
|                                  |
 | |
|         {1:~                        }|
 | |
|         {1:~                        }|
 | |
|         {3:command                  }|
 | |
|         :^                        |
 | |
|       ]]}
 | |
|     end)
 | |
| 
 | |
|     it('ModeChanged autocommand', function()
 | |
|       command('autocmd ModeChanged *:c set statusline=command')
 | |
|       feed(':')
 | |
|       screen:expect{grid=[[
 | |
|                                  |
 | |
|         {1:~                        }|
 | |
|         {1:~                        }|
 | |
|         {3:command                  }|
 | |
|         :^                        |
 | |
|       ]]}
 | |
|     end)
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe("cmdline height", function()
 | |
|   it("does not crash resized screen #14263", function()
 | |
|     clear()
 | |
|     local screen = Screen.new(25, 10)
 | |
|     screen:attach()
 | |
|     command('set cmdheight=9999')
 | |
|     screen:try_resize(25, 5)
 | |
|     assert_alive()
 | |
|   end)
 | |
| end)
 | |
| 
 | |
| describe('cmdheight=0', function()
 | |
|   local screen
 | |
|   before_each(function()
 | |
|     clear()
 | |
|     screen = Screen.new(25, 5)
 | |
|     screen:attach()
 | |
|   end)
 | |
| 
 | |
|   it("with cmdheight=1 noruler laststatus=2", function()
 | |
|     command("set cmdheight=1 noruler laststatus=2")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name]                |
 | |
|                                |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("with cmdheight=0 noruler laststatus=2", function()
 | |
|     command("set cmdheight=0 noruler laststatus=2")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name]                |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("with cmdheight=0 ruler laststatus=0", function()
 | |
|     command("set cmdheight=0 ruler laststatus=0")
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]]}
 | |
|   end)
 | |
| 
 | |
|   it("with cmdheight=0 ruler laststatus=0", function()
 | |
|     command("set cmdheight=0 noruler laststatus=0 showmode")
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]], showmode={}}
 | |
|     feed('<Esc>')
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it("with cmdheight=0 ruler rulerformat laststatus=0", function()
 | |
|     command("set cmdheight=0 noruler laststatus=0 rulerformat=%l,%c%= showmode")
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]], showmode={}}
 | |
|     feed('<Esc>')
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it("with showmode", function()
 | |
|     command("set cmdheight=1 noruler laststatus=0 showmode")
 | |
|     feed('i')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       -- INSERT --             |
 | |
|     ]]}
 | |
|     feed('<Esc>')
 | |
|     eq(1, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it("when using command line", function()
 | |
|     command("set cmdheight=0 noruler laststatus=0")
 | |
|     feed(':')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       :^                        |
 | |
|     ]]}
 | |
|     eq(0, eval('&cmdheight'))
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]], showmode={}}
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it("when using input()", function()
 | |
|     command("set cmdheight=0 noruler laststatus=0")
 | |
|     feed(':call input("foo >")<cr>')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       ~                        |
 | |
|                                |
 | |
|       :call input("foo >")     |
 | |
|       foo >^                    |
 | |
|     ]]}
 | |
|     eq(0, eval('&cmdheight'))
 | |
|     feed('<cr>')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]], showmode={}}
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| 
 | |
|   it("with winbar and splits", function()
 | |
|     command("set cmdheight=0 noruler laststatus=3 winbar=foo")
 | |
|     feed(':split<CR>')
 | |
|     screen:expect{grid=[[
 | |
|                                |
 | |
|       :split                   |
 | |
|       E36: Not enough room     |
 | |
|       Press ENTER or type comma|
 | |
|       nd to continue^           |
 | |
|     ]]}
 | |
|     feed('<CR>')
 | |
|     screen:expect{grid=[[
 | |
|       foo                      |
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name]                |
 | |
|     ]]}
 | |
|     feed(':')
 | |
|     screen:expect{grid=[[
 | |
|       foo                      |
 | |
|                                |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       :^                        |
 | |
|     ]]}
 | |
|     feed('<Esc>')
 | |
|     screen:expect{grid=[[
 | |
|       foo                      |
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name]                |
 | |
|     ]], showmode={}}
 | |
|     eq(0, eval('&cmdheight'))
 | |
| 
 | |
|     assert_alive()
 | |
|   end)
 | |
| 
 | |
|   it("when macro with lastline", function()
 | |
|     command("set cmdheight=0 display=lastline")
 | |
|     feed('qq')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]]}
 | |
|     feed('q')
 | |
|     screen:expect{grid=[[
 | |
|       ^                         |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|     ]], unchanged=true}
 | |
|   end)
 | |
| 
 | |
|   it("when substitute text", function()
 | |
|     command("set cmdheight=0 noruler laststatus=3")
 | |
|     feed('ifoo<ESC>')
 | |
|     screen:expect{grid=[[
 | |
|       fo^o                      |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name] [+]            |
 | |
|     ]]}
 | |
| 
 | |
|     feed(':%s/foo/bar/gc<CR>')
 | |
|     screen:expect{grid=[[
 | |
|       foo                      |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       replace wi...q/l/^E/^Y)?^ |
 | |
|     ]]}
 | |
| 
 | |
|     feed('y')
 | |
|     screen:expect{grid=[[
 | |
|       ^bar                      |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       ~                        |
 | |
|       [No Name] [+]            |
 | |
|     ]]}
 | |
| 
 | |
|     assert_alive()
 | |
|   end)
 | |
| 
 | |
|   it("when window resize", function()
 | |
|     command("set cmdheight=0")
 | |
|     feed('<C-w>+')
 | |
|     eq(0, eval('&cmdheight'))
 | |
|   end)
 | |
| end)
 | 
