Compare commits

..

No commits in common. "main" and "v0.1.0" have entirely different histories.
main ... v0.1.0

2 changed files with 27 additions and 77 deletions

View file

@ -85,7 +85,18 @@ function M.bash_completion_path()
end
---@return table<string, string[]>
local function parse_enums(content)
local function parse_enums()
local path = M.bash_completion_path()
if not path then
return {}
end
local fd = io.open(path, 'r')
if not fd then
return {}
end
local content = fd:read('*a')
fd:close()
local enums = {}
for key, values in content:gmatch('%-%-([a-z][a-z0-9-]*)%) [^\n]* compgen %-W "([^"]+)"') do
local vals = {}
@ -151,56 +162,17 @@ function M:get_completions(ctx, callback)
pending[#pending + 1] = { ctx = ctx, callback = callback }
if not loading then
loading = true
local config_out, enums_content
local remaining = 2
local function on_all_done()
remaining = remaining - 1
if remaining > 0 then
return
end
vim.system({ 'ghostty', '+show-config', '--docs' }, {}, function(result)
vim.schedule(function()
keys_cache = parse_keys(config_out)
enums_cache = parse_enums(enums_content)
keys_cache = parse_keys(result.stdout or '')
enums_cache = parse_enums()
loading = false
for _, p in ipairs(pending) do
respond(p.ctx, p.callback)
end
pending = {}
end)
end
vim.system({ 'ghostty', '+show-config', '--docs' }, {}, function(result)
config_out = result.stdout or ''
on_all_done()
end)
local path = M.bash_completion_path()
if not path then
enums_content = ''
on_all_done()
else
vim.uv.fs_open(path, 'r', 438, function(err, fd)
if err or not fd then
enums_content = ''
on_all_done()
return
end
vim.uv.fs_fstat(fd, function(err2, stat)
if err2 or not stat then
vim.uv.fs_close(fd)
enums_content = ''
on_all_done()
return
end
vim.uv.fs_read(fd, stat.size, 0, function(_, data)
vim.uv.fs_close(fd)
enums_content = data or ''
on_all_done()
end)
end)
end)
end
end
return function() end
end

View file

@ -55,15 +55,10 @@ local function mock_system()
end
end
local MOCK_FD = 99
local function mock_enums()
local original_exepath = vim.fn.exepath
local original_realpath = vim.uv.fs_realpath
local original_fs_open = vim.uv.fs_open
local original_fs_fstat = vim.uv.fs_fstat
local original_fs_read = vim.uv.fs_read
local original_fs_close = vim.uv.fs_close
local original_open = io.open
vim.fn.exepath = function(name)
if name == 'ghostty' then
@ -77,41 +72,24 @@ local function mock_enums()
end
return original_realpath(path)
end
vim.uv.fs_open = function(path, flags, mode, callback)
-- selene: allow(incorrect_standard_library_use)
io.open = function(path, mode)
if path:match('ghostty%.bash$') then
callback(nil, MOCK_FD)
return
return {
read = function()
return BASH_COMPLETION
end,
close = function() end,
}
end
return original_fs_open(path, flags, mode, callback)
end
vim.uv.fs_fstat = function(fd, callback)
if fd == MOCK_FD then
callback(nil, { size = #BASH_COMPLETION })
return
end
return original_fs_fstat(fd, callback)
end
vim.uv.fs_read = function(fd, size, offset, callback)
if fd == MOCK_FD then
callback(nil, BASH_COMPLETION)
return
end
return original_fs_read(fd, size, offset, callback)
end
vim.uv.fs_close = function(fd, ...)
if fd == MOCK_FD then
return true
end
return original_fs_close(fd, ...)
return original_open(path, mode)
end
return function()
vim.fn.exepath = original_exepath
vim.uv.fs_realpath = original_realpath
vim.uv.fs_open = original_fs_open
vim.uv.fs_fstat = original_fs_fstat
vim.uv.fs_read = original_fs_read
vim.uv.fs_close = original_fs_close
-- selene: allow(incorrect_standard_library_use)
io.open = original_open
end
end