From 12ce7a91fe9dab694d077ed2e3be422c89d445ac Mon Sep 17 00:00:00 2001 From: "Vito G. Graffagnino" Date: Fri, 3 Jun 2022 17:10:13 +0100 Subject: Added LSP setting files, added these files to the lsp-installer. Also added lua.lua to enable the key binding gf to recognise lua pathnames --- init.lua | 1 + lua/user/lsp/lsp-installer.lua | 25 +++++++++++++ lua/user/lsp/settings/awk_ls.lua | 10 +++++ lua/user/lsp/settings/bashls.lua | 11 ++++++ lua/user/lsp/settings/clangd.lua | 10 +++++ lua/user/lsp/settings/cmake.lua | 12 ++++++ lua/user/lsp/settings/html.lua | 18 +++++++++ lua/user/lua.lua | 79 ++++++++++++++++++++++++++++++++++++++++ lua/user/treesitter.lua | 2 +- 9 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 lua/user/lsp/settings/awk_ls.lua create mode 100644 lua/user/lsp/settings/bashls.lua create mode 100644 lua/user/lsp/settings/clangd.lua create mode 100644 lua/user/lsp/settings/cmake.lua create mode 100644 lua/user/lsp/settings/html.lua create mode 100644 lua/user/lua.lua diff --git a/init.lua b/init.lua index ff1e2e2..1f5163e 100644 --- a/init.lua +++ b/init.lua @@ -7,3 +7,4 @@ require "user.lsp" require "user.telescope" require "user.treesitter" require "user.autopairs" +require "user.lua" diff --git a/lua/user/lsp/lsp-installer.lua b/lua/user/lsp/lsp-installer.lua index f539050..ac8f40c 100644 --- a/lua/user/lsp/lsp-installer.lua +++ b/lua/user/lsp/lsp-installer.lua @@ -26,6 +26,31 @@ lsp_installer.on_server_ready(function(server) opts = vim.tbl_deep_extend("force", pyright_opts, opts) end + if server.name == "awk_ls" then + local awk_opts = require("user.lsp.settings.awk_ls") + opts = vim.tbl_deep_extend("force", awk_opts, opts) + end + + if server.name == "bashls" then + local bash_opts = require("user.lsp.settings.bashls") + opts = vim.tbl_deep_extend("force", bash_opts, opts) + end + + if server.name == "clangd" then + local clangd_opts = require("user.lsp.settings.clangd") + opts = vim.tbl_deep_extend("force", clangd_opts, opts) + end + + if server.name == "cmake" then + local cmake_opts = require("user.lsp.settings.cmake") + opts = vim.tbl_deep_extend("force", cmake_opts, opts) + end + + if server.name == "html" then + local html_opts = require("user.lsp.settings.html") + opts = vim.tbl_deep_extend("force", html_opts, opts) + end + -- This setup() function is exactly the same as lspconfig's setup function. -- Refer to https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md server:setup(opts) diff --git a/lua/user/lsp/settings/awk_ls.lua b/lua/user/lsp/settings/awk_ls.lua new file mode 100644 index 0000000..9d4a2da --- /dev/null +++ b/lua/user/lsp/settings/awk_ls.lua @@ -0,0 +1,10 @@ +return { + settings = { + + awk = { + filetypes = { 'awk' }, + single_file_support = true, + } + } +} + diff --git a/lua/user/lsp/settings/bashls.lua b/lua/user/lsp/settings/bashls.lua new file mode 100644 index 0000000..72f8409 --- /dev/null +++ b/lua/user/lsp/settings/bashls.lua @@ -0,0 +1,11 @@ +return { + settings = { + + bash = { + cmd_env = {GLOB_PATTERN = "*@(.sh|.inc|.bash|.command)" }, + filetypes = { 'sh' }, + single_file_support = true, + } + } +} + diff --git a/lua/user/lsp/settings/clangd.lua b/lua/user/lsp/settings/clangd.lua new file mode 100644 index 0000000..55798a1 --- /dev/null +++ b/lua/user/lsp/settings/clangd.lua @@ -0,0 +1,10 @@ +return { + settings = { + + clangd = { + filetypes = { "c","cpp" }, + single_file_support = true, + } + } +} + diff --git a/lua/user/lsp/settings/cmake.lua b/lua/user/lsp/settings/cmake.lua new file mode 100644 index 0000000..c81df8a --- /dev/null +++ b/lua/user/lsp/settings/cmake.lua @@ -0,0 +1,12 @@ +return { + settings = { + + cmake = { + whitelist = {"cmake" }, + initialization_Options = { + buildDirectory = {"build"}, + }, + } + } +} + diff --git a/lua/user/lsp/settings/html.lua b/lua/user/lsp/settings/html.lua new file mode 100644 index 0000000..fb161a9 --- /dev/null +++ b/lua/user/lsp/settings/html.lua @@ -0,0 +1,18 @@ +return { + settings = { + + html = { + filetypes = { 'html' }, + init_options = { + configurationSection = {"html", "css", "javascript" }, + embeddedLanguages = { + css = true, + javascript = true, + }, + provideFormatter = true + }, + single_file_support = true, + } + } +} + diff --git a/lua/user/lua.lua b/lua/user/lua.lua new file mode 100644 index 0000000..c97c178 --- /dev/null +++ b/lua/user/lua.lua @@ -0,0 +1,79 @@ +local fmt = string.format + +-- Iterator that splits a string o a given delimiter +local function split(str, delim) + delim = delim or "%s" + return string.gmatch(str, fmt('[^%s]+', delim)) +end + +-- Find the proper directory separator depending +-- on lua installation or OS. +local function dir_separator() + -- Look at package.config for directory separator string (it's the first line) + if package.config then + return string.match(package.config, '^[^\n]') + elseif vim.fn.has('win32') == 1 then + return '\\' + else + return '/' + end +end + +-- Search for lua traditional include paths. +-- This mimics how require internally works. +local function include_paths(fname, ext) + ext = ext or "lua" + local sep = dir_separator() + local paths = string.gsub(package.path, '%?', fname) + for path in split(paths, "%;") do + if vim.fn.filereadable(path) == 1 then + return path + end + end +end + +-- Search for nvim lua include paths +local function include_rtpaths(fname, ext) + ext = ext or "lua" + local sep = dir_separator() + local rtpaths = vim.api.nvim_list_runtime_paths() + local modfile, initfile = fmt('%s.%s', fname, ext), fmt('init.%s', ext) + for _, path in ipairs(rtpaths) do + -- Look on runtime path for 'lua/*.lua' files + local path1 = table.concat({path, ext, modfile}, sep) + if vim.fn.filereadable(path1) == 1 then + return path1 + end + -- Look on runtime path for 'lua/*/init.lua' files + local path2 = table.concat({path, ext, fname, initfile}, sep) + if vim.fn.filereadable(path2) == 1 then + return path2 + end + end +end + +-- Global function that searches the path for the required file +function find_required_path(module) + -- Look at package.config for directory separator string (it's the first line) + local sep = string.match(package.config, '^[^\n]') + -- Properly change '.' to separator (probably '/' on *nix and '\' on Windows) + local fname = vim.fn.substitute(module, "\\.", sep, "g") + local f + ---- First search for lua modules + f = include_paths(fname, 'lua') + if f then return f end + -- This part is just for nvim modules + f = include_rtpaths(fname, 'lua') + if f then return f end + ---- Now search for Fennel modules + f = include_paths(fname, 'fnl') + if f then return f end + -- This part is just for nvim modules + f = include_rtpaths(fname, 'fnl') + if f then return f end +end + + +-- Set options to open require with gf +vim.opt_local.include = [=[\v<((do|load)file|require)\s*\(?['"]\zs[^'"]+\ze['"]]=] +vim.opt_local.includeexpr = "v:lua.find_required_path(v:fname)" \ No newline at end of file diff --git a/lua/user/treesitter.lua b/lua/user/treesitter.lua index b840ccd..ce57664 100644 --- a/lua/user/treesitter.lua +++ b/lua/user/treesitter.lua @@ -14,7 +14,7 @@ local configs = require("nvim-treesitter.configs") configs.setup { - ensure_installed = "maintained", + ensure_installed = {"python","lua","json"}, sync_install = false, ignore_install = { "" }, -- List of parsers to ignore installing autopairs = { -- cgit v1.2.3