diff options
Diffstat (limited to 'src/nvim/lua/vim.lua')
| -rw-r--r-- | src/nvim/lua/vim.lua | 68 | 
1 files changed, 66 insertions, 2 deletions
diff --git a/src/nvim/lua/vim.lua b/src/nvim/lua/vim.lua index c7952520b0..e1bbb03d3f 100644 --- a/src/nvim/lua/vim.lua +++ b/src/nvim/lua/vim.lua @@ -1,3 +1,62 @@ +-- Internal-only until comments in #8107 are addressed. +-- Returns: +--    {errcode}, {output} +local function _system(cmd) +  local out = vim.api.nvim_call_function('system', { cmd }) +  local err = vim.api.nvim_get_vvar('shell_error') +  return err, out +end + +-- Gets process info from the `ps` command. +-- Used by nvim_get_proc() as a fallback. +local function _os_proc_info(pid) +  if pid == nil or pid <= 0 or type(pid) ~= 'number' then +    error('invalid pid') +  end +  local cmd = { 'ps', '-p', pid, '-o', 'ucomm=', } +  local err, name = _system(cmd) +  if 1 == err and string.gsub(name, '%s*', '') == '' then +    return {}  -- Process not found. +  elseif 0 ~= err then +    local args_str = vim.api.nvim_call_function('string', { cmd }) +    error('command failed: '..args_str) +  end +  local _, ppid = _system({ 'ps', '-p', pid, '-o', 'ppid=', }) +  -- Remove trailing whitespace. +  name = string.gsub(name, '%s+$', '') +  ppid = string.gsub(ppid, '%s+$', '') +  ppid = tonumber(ppid) == nil and -1 or tonumber(ppid) +  return { +    name = name, +    pid = pid, +    ppid = ppid, +  } +end + +-- Gets process children from the `pgrep` command. +-- Used by nvim_get_proc_children() as a fallback. +local function _os_proc_children(ppid) +  if ppid == nil or ppid <= 0 or type(ppid) ~= 'number' then +    error('invalid ppid') +  end +  local cmd = { 'pgrep', '-P', ppid, } +  local err, rv = _system(cmd) +  if 1 == err and string.gsub(rv, '%s*', '') == '' then +    return {}  -- Process not found. +  elseif 0 ~= err then +    local args_str = vim.api.nvim_call_function('string', { cmd }) +    error('command failed: '..args_str) +  end +  local children = {} +  for s in string.gmatch(rv, '%S+') do +    local i = tonumber(s) +    if i ~= nil then +      table.insert(children, i) +    end +  end +  return children +end +  -- TODO(ZyX-I): Create compatibility layer.  --{{{1 package.path updater function  -- Last inserted paths. Used to clear out items from package.[c]path when they @@ -58,7 +117,12 @@ local function _update_package_paths()    end    last_nvim_paths = cur_nvim_paths  end ---{{{1 Module definition -return { + +local module = {    _update_package_paths = _update_package_paths, +  _os_proc_children = _os_proc_children, +  _os_proc_info = _os_proc_info, +  _system = _system,  } + +return module  | 
