@ 260802.2
current
local telescope = require 'telescope.builtin'

vim.lsp.config('ty', {
  cmd = { '/home/andrew/bin/astral/run-ty-server' },
  trace = 'verbose',
  init_options = {
    logLevel = 'debug',
    logFile = '/tmp/neovim-ty-tracing.log',
  },
  settings = {
    ty = {
      completions = {
        autoImport = true,
      },
      inlayHints = {
        variableTypes = true,
      },
    },
  },
})

vim.lsp.config('rust_analyzer', {
  cmd = { '/home/andrew/bin/rust-analyzer-wrapper' },
  filetypes = { 'rust' },
  settings = {
    ['rust-analyzer'] = {
      cargo = {
        targetDir = '/home/andrew/tmp/target-rust-analyzer',
      },
      completion = {
        callable = {
          snippets = 'none',
        },
      },
      diagnostics = {
        enable = true,
        disabled = {
          'inactive-code',
          'incorrect-ident-case',
          'unlinked-file',
          'unresolved-macro-call',
          'unresolved-proc-macro',
        },
      },
      procMacro = {
        enable = true,
      },
      semanticHighlighting = {
        comments = {
          enable = false,
        },
        doc = {
          comment = {
            inject = {
              enable = false;
            },
          },
        },
        nonStandardTokens = false;
        operator = {
          enable = false,
        },
        strings = {
          enable = false,
        },
      },
    }
  },
})

vim.lsp.config('lua_ls', {
  -- N.B. This is not quite right, but I only really use Lua these days inside
  -- neovim. So just recognize my `init.lua` as the root of my workspace.
  root_markers = {'init.lua'},
  on_init = function(client)
    client.config.settings.Lua = vim.tbl_deep_extend(
      'force',
      client.config.settings.Lua, {
        runtime = {
          -- Tell the language server which version of Lua you're using (most
          -- likely LuaJIT in the case of Neovim)
          version = 'LuaJIT',
          -- Tell the language server how to find Lua modules same way as Neovim
          -- (see `:h lua-module-load`)
          path = {
            'lua/?.lua',
            'lua/?/init.lua',
          },
        },
        -- Make the server aware of Neovim runtime files
        workspace = {
          checkThirdParty = false,
          library = {
            vim.env.VIMRUNTIME,
          },
        },
      }
    )
  end,
  settings = {
    Lua = {},
  },
})

vim.lsp.config("bashls", {
  cmd = { "bash-language-server", "start" },
  filetypes = { "sh", "bash", "zsh" },
})

vim.lsp.config('clangd', {})
vim.lsp.config('ts_ls', {})

-- Hide all semantic highlights. Maybe I'll enable this some day, but
-- as of right now, I don't like it.
for _, group in ipairs(vim.fn.getcompletion('@lsp', 'highlight')) do
  vim.api.nvim_set_hl(0, group, {})
end

-- Function for conveniently restarting the LSP. Why isn't this built
-- into neovim???
function RestartLSP()
    print('Restarting all attached LSP clients and reloading buffer...')
    for _, client in ipairs(vim.lsp.get_clients()) do
      client:stop()
    end
    vim.cmd('write')
    vim.cmd('edit')
end

-- Get rid of the default keybindings.
-- I had configured my own (that are
-- very similar to these) when I used
-- CoC, and I don't feel like re-learning
-- them.
vim.keymap.del('n', 'grn')
vim.keymap.del('n', 'gra')
vim.keymap.del('n', 'grr')
vim.keymap.del('n', 'gri')
vim.keymap.del('n', 'grt')
vim.keymap.del('n', 'gO')

-- Define the keybindings I used for CoC.
-- Nice thing is that this should work for
-- all LSP servers.
vim.keymap.set('n', [[\grn]], vim.lsp.buf.rename)
-- vim.keymap.set('n', [[\grr]], vim.lsp.buf.references)
vim.keymap.set('n', [[\grr]], telescope.lsp_references)
vim.keymap.set('n', [[\ga]], vim.lsp.buf.code_action)
-- vim.keymap.set('n', [[\gi]], vim.lsp.buf.implementation)
vim.keymap.set('n', [[\gi]], telescope.lsp_implementations)
-- vim.keymap.set('n', [[\gt]], vim.lsp.buf.type_definition)
vim.keymap.set('n', [[\gf]], telescope.lsp_definitions)
vim.keymap.set('n', [[\gt]], telescope.lsp_type_definitions)
vim.keymap.set('n', [[\gl]], vim.lsp.buf.declaration)
vim.keymap.set('n', [[\gO]], vim.lsp.buf.document_symbol)
vim.keymap.set('n', [[\gs]], vim.lsp.buf.signature_help)
-- vim.keymap.set('n', [[\gd]], vim.diagnostic.open_float)
vim.keymap.set('n', [[\gd]], function()
  telescope.diagnostics()
end)
vim.keymap.set('n', [[<C-d>]], vim.diagnostic.open_float)
vim.keymap.set('n', [[\gh]], vim.lsp.buf.typehierarchy)
vim.keymap.set('n', [[\gri]], function()
  vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled())
end)

vim.lsp.enable('ty')
vim.lsp.enable('rust_analyzer')
vim.lsp.enable('lua_ls')
vim.lsp.enable("bashls")
vim.lsp.enable('clangd')
vim.lsp.enable('ts_ls')