diff options
Diffstat (limited to 'lsp/oxfmt.lua')
| -rw-r--r-- | lsp/oxfmt.lua | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/lsp/oxfmt.lua b/lsp/oxfmt.lua new file mode 100644 index 00000000..9e560b36 --- /dev/null +++ b/lsp/oxfmt.lua @@ -0,0 +1,55 @@ +--- @brief +--- +--- https://github.com/oxc-project/oxc +--- https://oxc.rs/docs/guide/usage/formatter.html +--- +--- `oxfmt` is a Prettier-compatible code formatter that supports multiple languages +--- including JavaScript, TypeScript, JSON, YAML, HTML, CSS, Markdown, and more. +--- It can be installed via `npm`: +--- +--- ```sh +--- npm i -g oxfmt +--- ``` + +local util = require 'lspconfig.util' + +---@type vim.lsp.Config +return { + cmd = function(dispatchers, config) + local cmd = 'oxfmt' + local local_cmd = (config or {}).root_dir and config.root_dir .. '/node_modules/.bin/oxfmt' + if local_cmd and vim.fn.executable(local_cmd) == 1 then + cmd = local_cmd + end + return vim.lsp.rpc.start({ cmd, '--lsp' }, dispatchers) + end, + filetypes = { + 'javascript', + 'javascriptreact', + 'typescript', + 'typescriptreact', + 'toml', + 'json', + 'jsonc', + 'json5', + 'yaml', + 'html', + 'vue', + 'handlebars', + 'css', + 'scss', + 'less', + 'graphql', + 'markdown', + }, + workspace_required = true, + root_dir = function(bufnr, on_dir) + local fname = vim.api.nvim_buf_get_name(bufnr) + + -- Oxfmt resolves configuration by walking upward and using the nearest config file + -- to the file being processed. We therefore compute the root directory by locating + -- the closest `.oxfmtrc.json` / `.oxfmtrc.jsonc` (or `package.json` fallback) above the buffer. + local root_markers = util.insert_package_json({ '.oxfmtrc.json', '.oxfmtrc.jsonc' }, 'oxfmt', fname) + on_dir(vim.fs.dirname(vim.fs.find(root_markers, { path = fname, upward = true })[1])) + end, +} |
