Merge #5975 from jamessan/execute-with-attrs

execute: Correctly capture output with highlight attributes
This commit is contained in:
Justin M. Keyes
2017-02-03 12:36:17 +01:00
committed by GitHub
2 changed files with 60 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ local exc_exec = helpers.exc_exec
local funcs = helpers.funcs
local Screen = require('test.functional.ui.screen')
local command = helpers.command
local feed = helpers.feed
describe('execute()', function()
before_each(clear)
@@ -21,7 +22,11 @@ describe('execute()', function()
eq("\nfoo\nbar", funcs.execute({'echo "foo"', 'echo "bar"'}))
end)
it('supports nested redirection', function()
it('supports nested execute("execute(...)")', function()
eq('42', funcs.execute([[echon execute("echon execute('echon 42')")]]))
end)
it('supports nested :redir to a variable', function()
source([[
function! g:Foo()
let a = ''
@@ -33,14 +38,39 @@ describe('execute()', function()
function! g:Bar()
let a = ''
redir => a
silent echon "bar1"
call g:Foo()
silent echon "bar2"
redir END
silent echon "bar3"
return a
endfunction
]])
eq('foo', funcs.execute('call g:Bar()'))
eq('top1bar1foobar2bar3', funcs.execute('echon "top1"|call g:Bar()'))
end)
eq('42', funcs.execute([[echon execute("echon execute('echon 42')")]]))
it('supports nested :redir to a register', function()
source([[
let @a = ''
function! g:Foo()
redir @a>>
silent echon "foo"
redir END
return @a
endfunction
function! g:Bar()
redir @a>>
silent echon "bar1"
call g:Foo()
silent echon "bar2"
redir END
silent echon "bar3"
return @a
endfunction
]])
eq('top1bar1foobar2bar3', funcs.execute('echon "top1"|call g:Bar()'))
-- :redir itself doesn't nest, so the redirection ends in g:Foo
eq('bar1foo', eval('@a'))
end)
it('captures a transformed string', function()
@@ -69,6 +99,25 @@ describe('execute()', function()
eq('Vim:E729: using Funcref as a String', ret)
end)
it('captures output with highlights', function()
eq('\nErrorMsg xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red',
eval('execute("hi ErrorMsg")'))
end)
it('does not corrupt the command display #5422', function()
local screen = Screen.new(70, 5)
screen:attach()
feed(':echo execute("hi ErrorMsg")<CR>')
screen:expect([[
~ |
~ |
:echo execute("hi ErrorMsg") |
ErrorMsg xxx ctermfg=15 ctermbg=1 guifg=White guibg=Red |
Press ENTER or type command to continue^ |
]])
feed('<CR>')
end)
-- This matches Vim behavior.
it('does not capture shell-command output', function()
eq('\n:!echo "foo"\13\n', funcs.execute('!echo "foo"'))