mirror of
https://github.com/neovim/neovim.git
synced 2025-12-15 19:05:40 +00:00
feat(lua): add vim.system()
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.
This commit is contained in:
57
test/functional/lua/system_spec.lua
Normal file
57
test/functional/lua/system_spec.lua
Normal file
@@ -0,0 +1,57 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user