aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/lspinfo.lua
blob: 958b27ae957829c1492f1be82b1ca94e02c38ce7 (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
125
126
127
128
129
130
131
132
133
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), ', '),
    "Neovim logs at: "..(vim.lsp.get_log_path()),
    "",
    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)
    local server_specific_info = ""
    if client.config.lspinfo then
      server_specific_info = client.config.lspinfo(client.config)
    end
    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),
      indent.."\t"..server_specific_info,
      ""
    }
  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.api.nvim_buf_set_option(bufnr,'filetype','lspinfo')
  local configs_pattern = '\\%(' .. table.concat(vim.tbl_keys(configs), '\\|') .. '\\)'
  vim.cmd('syntax match Title /\\%(Client\\|Config\\):.*\\zs' .. configs_pattern .. '/')
  vim.cmd('syntax match Identifier /filetypes:.*\\zs\\<' .. 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;