diff --git a/lua/blink-cmp-ghostty.lua b/lua/blink-cmp-ghostty.lua index 9eb94ce..17f659d 100644 --- a/lua/blink-cmp-ghostty.lua +++ b/lua/blink-cmp-ghostty.lua @@ -85,7 +85,18 @@ function M.bash_completion_path() end ---@return table -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 diff --git a/spec/ghostty_spec.lua b/spec/ghostty_spec.lua index 5ef7a2a..d0ad426 100644 --- a/spec/ghostty_spec.lua +++ b/spec/ghostty_spec.lua @@ -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