---@diagnostic disable: param-type-mismatch ---@diagnostic disable: missing-fields local M = {} M.setup = function() require("blink.cmp").setup({ keymap = { preset = "default", [""] = {}, [""] = {}, }, completion = { list = { selection = { preselect = false, auto_insert = true } }, }, snippets = { preset = "mini_snippets" }, cmdline = { enabled = false }, appearance = { nerd_font_variant = "normal", }, sources = { default = { "lsp", "path", "snippets", "buffer" }, providers = { buffer = { min_keyword_length = function(ctx) return ctx.trigger.initial_kind == "manual" and 0 or 3 end, opts = { get_bufnrs = vim.api.nvim_list_bufs }, }, snippets = { should_show_items = function(ctx) return ctx.trigger.initial_kind ~= "trigger_character" end, }, }, }, fuzzy = { implementation = "prefer_rust" }, signature = { enabled = true }, }) end ---@param data string ---@param _opts { hl: string, status: "running"|"success"|"failed", id: (integer|string)?, fast: boolean } ---@return integer|string|nil local function show_status(data, _opts) local opts = vim.tbl_extend( "keep", _opts, { hl = "Normal", status = "running", fast = false } ) local fn = function() return vim.api.nvim_echo({ { data, opts.hl } }, false, { id = opts.id, kind = "progress", title = "Building blink-cmp", status = opts.status, }) end if opts.fast then return fn() end vim.schedule(fn) return nil end M.build_rust = function() local blink_pack = vim.pack.get({ "blink.cmp" })[1] if blink_pack == nil then return end local msg_id = show_status( "Starting", { hl = "Comment", status = "running", fast = true } ) local uv = vim.uv local stdout = uv.new_pipe() local stderr = uv.new_pipe() local on_exit = function(code, signal) show_status( ("Finished build (code=%s, signal=%s)"):format(code, signal), { hl = "Comment", status = code == 0 and "success" or "failed", id = msg_id, fast = false, } ) end local on_stdout = function(err, data) assert(not err, err) if data then show_status(data, { hl = "Normal", status = "running", id = msg_id, fast = false, }) end end local on_stderr = function(err, data) assert(not err, err) if data then show_status(data, { hl = "Comment", status = "running", id = msg_id, fast = false, }) end end uv.spawn("cargo", { args = { "build", "--release" }, stdio = { nil, stdout, stderr }, cwd = blink_pack.path, }, on_exit) uv.read_start(stdout, on_stdout) uv.read_start(stderr, on_stderr) end return M