summaryrefslogtreecommitdiff
path: root/mut/neovim/pack/plugins/start/blink.cmp/lua/blink/cmp/sources/cmdline/help.lua
blob: bae4988e120fc092556c238dfab74a5f782c5c46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
local async = require('blink.cmp.lib.async')

local help = {}

--- Processes a help file and returns a list of tags asynchronously
--- @param file string
--- @return blink.cmp.Task
--- TODO: rewrite using async lib, shared as a library in lib/fs.lua
local function read_tags_from_file(file)
  return async.task.new(function(resolve)
    vim.uv.fs_open(file, 'r', 438, function(err, fd)
      if err or fd == nil then return resolve({}) end

      -- Read file content
      vim.uv.fs_fstat(fd, function(stat_err, stat)
        if stat_err or stat == nil then
          vim.uv.fs_close(fd)
          return resolve({})
        end

        vim.uv.fs_read(fd, stat.size, 0, function(read_err, data)
          vim.uv.fs_close(fd)

          if read_err or data == nil then return resolve({}) end

          -- Process the file content
          local tags = {}
          for line in data:gmatch('[^\r\n]+') do
            local tag = line:match('^([^\t]+)')
            if tag then table.insert(tags, tag) end
          end

          resolve(tags)
        end)
      end)
    end)
  end)
end

--- @param arg_prefix string
function help.get_completions(arg_prefix)
  local help_files = vim.api.nvim_get_runtime_file('doc/tags', true)

  return async.task
    .await_all(vim.tbl_map(read_tags_from_file, help_files))
    :map(function(tags_arrs) return require('blink.cmp.lib.utils').flatten(tags_arrs) end)
    :map(function(tags)
      -- TODO: remove after adding support for fuzzy matching on custom range
      return vim.tbl_filter(function(tag) return vim.startswith(tag, arg_prefix) end, tags)
    end)
end

return help