templates.lua 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. local M = {}
  2. local Log = require "lvim.core.log"
  3. local utils = require "lvim.utils"
  4. local lvim_lsp_utils = require "lvim.lsp.utils"
  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. local skipped_filetypes = lvim.lsp.automatic_configuration.skipped_filetypes
  14. local skipped_servers = lvim.lsp.automatic_configuration.skipped_servers
  15. ---Check if we should skip generating an ftplugin file based on the server_name
  16. ---@param server_name string name of a valid language server
  17. local function should_skip(server_name)
  18. return vim.tbl_contains(skipped_servers, server_name)
  19. end
  20. ---Generates an ftplugin file based on the server_name in the selected directory
  21. ---@param server_name string name of a valid language server, e.g. pyright, gopls, tsserver, etc.
  22. ---@param dir string the full path to the desired directory
  23. function M.generate_ftplugin(server_name, dir)
  24. if should_skip(server_name) then
  25. return
  26. end
  27. -- get the supported filetypes and remove any ignored ones
  28. local filetypes = vim.tbl_filter(function(ft)
  29. return not vim.tbl_contains(skipped_filetypes, ft)
  30. end, lvim_lsp_utils.get_supported_filetypes(server_name) or {})
  31. if not filetypes then
  32. return
  33. end
  34. for _, filetype in ipairs(filetypes) do
  35. filetype = filetype:match "%.([^.]*)$" or filetype
  36. local filename = join_paths(dir, filetype .. ".lua")
  37. local setup_cmd = string.format([[require("lvim.lsp.manager").setup(%q)]], server_name)
  38. -- print("using setup_cmd: " .. setup_cmd)
  39. -- overwrite the file completely
  40. utils.write_file(filename, setup_cmd .. "\n", "a")
  41. end
  42. end
  43. ---Generates ftplugin files based on a list of server_names
  44. ---The files are generated to a runtimepath: "$LUNARVIM_RUNTIME_DIR/site/after/ftplugin/template.lua"
  45. ---@param servers_names? table list of servers to be enabled. Will add all by default
  46. function M.generate_templates(servers_names)
  47. servers_names = servers_names or lvim_lsp_utils.get_supported_servers()
  48. Log:debug "Templates installation in progress"
  49. M.remove_template_files()
  50. -- create the directory if it didn't exist
  51. if not utils.is_directory(lvim.lsp.templates_dir) then
  52. vim.fn.mkdir(ftplugin_dir, "p")
  53. end
  54. for _, server in ipairs(servers_names) do
  55. M.generate_ftplugin(server, ftplugin_dir)
  56. end
  57. Log:debug "Templates installation is complete"
  58. end
  59. return M