aboutsummaryrefslogtreecommitdiffstats
path: root/lua/lspconfig/server_configurations/clangd.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lspconfig/server_configurations/clangd.lua')
-rw-r--r--lua/lspconfig/server_configurations/clangd.lua73
1 files changed, 73 insertions, 0 deletions
diff --git a/lua/lspconfig/server_configurations/clangd.lua b/lua/lspconfig/server_configurations/clangd.lua
new file mode 100644
index 00000000..9b4a31c7
--- /dev/null
+++ b/lua/lspconfig/server_configurations/clangd.lua
@@ -0,0 +1,73 @@
+local util = require 'lspconfig/util'
+
+-- https://clangd.llvm.org/extensions.html#switch-between-sourceheader
+local function switch_source_header(bufnr)
+ bufnr = util.validate_bufnr(bufnr)
+ local params = { uri = vim.uri_from_bufnr(bufnr) }
+ vim.lsp.buf_request(
+ bufnr,
+ 'textDocument/switchSourceHeader',
+ params,
+ util.compat_handler(function(err, result)
+ if err then
+ error(tostring(err))
+ end
+ if not result then
+ print 'Corresponding file cannot be determined'
+ return
+ end
+ vim.api.nvim_command('edit ' .. vim.uri_to_fname(result))
+ end)
+ )
+end
+
+local root_pattern = util.root_pattern('compile_commands.json', 'compile_flags.txt', '.git')
+
+local default_capabilities = vim.tbl_deep_extend(
+ 'force',
+ util.default_config.capabilities or vim.lsp.protocol.make_client_capabilities(),
+ {
+ textDocument = {
+ completion = {
+ editsNearCursor = true,
+ },
+ },
+ offsetEncoding = { 'utf-8', 'utf-16' },
+ }
+)
+
+return {
+ default_config = {
+ cmd = { 'clangd', '--background-index' },
+ filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
+ root_dir = function(fname)
+ local filename = util.path.is_absolute(fname) and fname or util.path.join(vim.loop.cwd(), fname)
+ return root_pattern(filename)
+ end,
+ single_file_support = true,
+ capabilities = default_capabilities,
+ },
+ commands = {
+ ClangdSwitchSourceHeader = {
+ function()
+ switch_source_header(0)
+ end,
+ description = 'Switch between source/header',
+ },
+ },
+ docs = {
+ description = [[
+https://clangd.llvm.org/installation.html
+
+**NOTE:** Clang >= 9 is recommended! See [this issue for more](https://github.com/neovim/nvim-lsp/issues/23).
+
+clangd relies on a [JSON compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html) specified
+as compile_commands.json or, for simpler projects, a compile_flags.txt.
+For details on how to automatically generate one using CMake look [here](https://cmake.org/cmake/help/latest/variable/CMAKE_EXPORT_COMPILE_COMMANDS.html). Alternatively, you can use [Bear](https://github.com/rizsotto/Bear).
+]],
+ default_config = {
+ root_dir = [[root_pattern("compile_commands.json", "compile_flags.txt", ".git") or dirname]],
+ capabilities = [[default capabilities, with offsetEncoding utf-8]],
+ },
+ },
+}