aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/lspinfo.lua
blob: a21dd44bc690151fd9e040d103df7de53bbb3063 (plain) (blame)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
local configs = require 'lspconfig/configs'
local lspui = require 'lspconfig/_lspui'

return function ()
  -- These options need to be cached before switching to the floating
  -- buffer.
  local buf_clients = vim.lsp.buf_get_clients()
  local clients = vim.lsp.get_active_clients()
  local buffer_filetype = vim.bo.filetype
  local buffer_dir = vim.fn.expand('%:p:h')

  local win_info = lspui.percentage_range_window(0.8, 0.7)
  local bufnr, win_id = win_info.bufnr, win_info.win_id

  local buf_lines = {}

  local buf_client_names = {}
  for _, client in ipairs(buf_clients) do
    table.insert(buf_client_names, client.name)
  end

  local header = {
    "Configured servers: "..table.concat(vim.tbl_keys(configs), ', '),
    "",
    tostring(#buf_clients).." client(s) attached to this buffer: "..table.concat(buf_client_names, ', '),
  }
  vim.list_extend(buf_lines, header)

  local function trim_whitespace(cmd)
    local trimmed_cmd = {}
    for _, str in ipairs(cmd) do
      table.insert(trimmed_cmd, str:match'^%s*(.*)')
    end
    return trimmed_cmd
  end

  local function remove_newlines(cmd)
    cmd = trim_whitespace(cmd)
    cmd = table.concat(cmd, ' ')
    cmd = vim.split(cmd, '\n')
    cmd = trim_whitespace(cmd)
    cmd = table.concat(cmd, ' ')
    return cmd
  end

  local indent = "  "
  local function make_client_info(client)
    return {
      "",
      indent.."Client: "..client.name.." (id "..tostring(client.id)..")",
      indent.."\troot:      "..client.workspaceFolders[1].name,
      indent.."\tfiletypes: "..table.concat(client.config.filetypes or {}, ', '),
      indent.."\tcmd:       "..remove_newlines(client.config.cmd),
    }
  end

  for _, client in ipairs(buf_clients) do
     local client_info = make_client_info(client)
     vim.list_extend(buf_lines, client_info)
  end

  local active_section_header = {
    "",
    tostring(#clients).." active client(s): ",
  }
  vim.list_extend(buf_lines, active_section_header)
  for _, client in ipairs(clients) do
     local client_info = make_client_info(client)
     vim.list_extend(buf_lines, client_info)
  end
  local matching_config_header = {
    "",
    "Clients that match the filetype "..buffer_filetype..":",
  }
  local cmd_not_found_msg = "False. Please check your path and ensure the server is installed"
  vim.list_extend(buf_lines, matching_config_header)
  for _, config in pairs(configs) do
    local cmd_is_executable, cmd
    if config.cmd then
      cmd = remove_newlines(config.cmd)
      if vim.fn.executable(config.cmd[1]) == 1 then
        cmd_is_executable = "True"
      else
        cmd_is_executable = cmd_not_found_msg
      end
    else
      cmd = "cmd not defined"
      cmd_is_executable = cmd
    end
    if config.filetypes then
      for _, filetype_match in ipairs(config.filetypes) do
        if buffer_filetype == filetype_match then
          local matching_config_info = {
            indent.."",
            indent.."Config: "..config.name,
            indent.."\tcmd:               "..cmd,
            indent.."\tcmd is executable: ".. cmd_is_executable,
            indent.."\tidentified root:   "..(config.get_root_dir(buffer_dir) or "None"),
            indent.."\tcustom handlers:   "..table.concat(vim.tbl_keys(config.handlers), ", "),
          }
         vim.list_extend(buf_lines, matching_config_info)
        end
      end
    else
        local matching_config_info = {
          "",
          "Config: "..config.name,
          "\tfiletype: ".."No filetypes defined, please define filetypes in setup().",
        }
       vim.list_extend(buf_lines, matching_config_info)
    end
  end
  buf_lines = vim.lsp.util._trim_and_pad(buf_lines, { pad_left = 2, pad_top = 1})
  vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, buf_lines )
  vim.api.nvim_buf_set_option(bufnr,'modifiable',false)
  vim.fn.matchadd("Title", table.concat(vim.tbl_keys(configs), '\\|'))
  vim.fn.matchadd("Title", buffer_filetype)
  vim.fn.matchadd("Error",
    "No filetypes defined, please define filetypes in setup().\\|"..
    "cmd not defined\\|" ..
    cmd_not_found_msg)
  vim.api.nvim_buf_set_keymap(bufnr, 'n', '<esc>', '<cmd>bd<CR>', { noremap = true})
  vim.lsp.util.close_preview_autocmd({"BufHidden", "BufLeave"}, win_id)
end;