templates.lua 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. local M = {}
  2. local Log = require "core.log"
  3. local utils = require "utils"
  4. local get_supported_filetypes = require("lsp.utils").get_supported_filetypes
  5. local ftplugin_dir = lvim.lsp.templates_dir
  6. local join_paths = _G.join_paths
  7. function M.remove_template_files()
  8. -- remove any outdated files
  9. for _, file in ipairs(vim.fn.glob(ftplugin_dir .. "/*.lua", 1, 1)) do
  10. vim.fn.delete(file)
  11. end
  12. end
  13. ---Checks if a server is ignored by default because of a conflict
  14. ---Only TSServer is enabled by default for the javascript-family
  15. ---@param server_name string
  16. function M.is_ignored(server_name, filetypes)
  17. --TODO: this is easy to be made configurable once stable
  18. filetypes = filetypes or get_supported_filetypes(server_name)
  19. if vim.tbl_contains(filetypes, "javascript") then
  20. if server_name == "tsserver" then
  21. return false
  22. else
  23. return true
  24. end
  25. end
  26. local blacklist = {
  27. "jedi_language_server",
  28. "pylsp",
  29. "sqlls",
  30. "sqls",
  31. "angularls",
  32. "ansiblels",
  33. }
  34. return vim.tbl_contains(blacklist, server_name)
  35. end
  36. ---Generates an ftplugin file based on the server_name in the selected directory
  37. ---@param server_name string name of a valid language server, e.g. pyright, gopls, tsserver, etc.
  38. ---@param dir string the full path to the desired directory
  39. function M.generate_ftplugin(server_name, dir)
  40. -- we need to go through lspconfig to get the corresponding filetypes currently
  41. local filetypes = get_supported_filetypes(server_name) or {}
  42. if not filetypes then
  43. return
  44. end
  45. if M.is_ignored(server_name, filetypes) then
  46. return
  47. end
  48. -- print("got associated filetypes: " .. vim.inspect(filetypes))
  49. for _, filetype in ipairs(filetypes) do
  50. local filename = join_paths(dir, filetype .. ".lua")
  51. local setup_cmd = string.format([[require("lsp.manager").setup(%q)]], server_name)
  52. -- print("using setup_cmd: " .. setup_cmd)
  53. -- overwrite the file completely
  54. utils.write_file(filename, setup_cmd .. "\n", "a")
  55. end
  56. end
  57. ---Generates ftplugin files based on a list of server_names
  58. ---The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua"
  59. ---@param servers_names table list of servers to be enabled. Will add all by default
  60. function M.generate_templates(servers_names)
  61. servers_names = servers_names or {}
  62. Log:debug "Templates installation in progress"
  63. M.remove_template_files()
  64. if vim.tbl_isempty(servers_names) then
  65. local available_servers = require("nvim-lsp-installer.servers").get_available_servers()
  66. for _, server in pairs(available_servers) do
  67. table.insert(servers_names, server.name)
  68. end
  69. end
  70. -- create the directory if it didn't exist
  71. if not utils.is_directory(lvim.lsp.templates_dir) then
  72. vim.fn.mkdir(ftplugin_dir, "p")
  73. end
  74. for _, server in ipairs(servers_names) do
  75. M.generate_ftplugin(server, ftplugin_dir)
  76. end
  77. Log:debug "Templates installation is complete"
  78. end
  79. return M