mirror of
https://github.com/neovim/neovim.git
synced 2025-01-01 17:23:36 -07:00
c0952e62fd
feat(lua): add vim.system() Problem: Handling system commands in Lua is tedious and error-prone: - vim.fn.jobstart() is vimscript and comes with all limitations attached to typval. - vim.loop.spawn is too low level Solution: Add vim.system(). Partly inspired by Python's subprocess module Does not expose any libuv objects.
58 lines
1.3 KiB
Lua
58 lines
1.3 KiB
Lua
local helpers = require('test.functional.helpers')(after_each)
|
|
local clear = helpers.clear
|
|
local exec_lua = helpers.exec_lua
|
|
local eq = helpers.eq
|
|
|
|
local function system_sync(cmd, opts)
|
|
return exec_lua([[
|
|
return vim.system(...):wait()
|
|
]], cmd, opts)
|
|
end
|
|
|
|
local function system_async(cmd, opts)
|
|
exec_lua([[
|
|
local cmd, opts = ...
|
|
_G.done = false
|
|
vim.system(cmd, opts, function(obj)
|
|
_G.done = true
|
|
_G.ret = obj
|
|
end)
|
|
]], cmd, opts)
|
|
|
|
while true do
|
|
if exec_lua[[return _G.done]] then
|
|
break
|
|
end
|
|
end
|
|
|
|
return exec_lua[[return _G.ret]]
|
|
end
|
|
|
|
describe('vim.system', function()
|
|
before_each(function()
|
|
clear()
|
|
end)
|
|
|
|
for name, system in pairs{ sync = system_sync, async = system_async, } do
|
|
describe('('..name..')', function()
|
|
it('can run simple commands', function()
|
|
eq('hello\n', system({'echo', 'hello' }, { text = true }).stdout)
|
|
end)
|
|
|
|
it('handle input', function()
|
|
eq('hellocat', system({ 'cat' }, { stdin = 'hellocat', text = true }).stdout)
|
|
end)
|
|
|
|
it ('supports timeout', function()
|
|
eq({
|
|
code = 0,
|
|
signal = 2,
|
|
stdout = '',
|
|
stderr = "Command timed out: 'sleep 10'"
|
|
}, system({ 'sleep', '10' }, { timeout = 1 }))
|
|
end)
|
|
end)
|
|
end
|
|
|
|
end)
|