From d4e314928da9ba0956f32199bea18aa44899cbad Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 24 Oct 2021 15:10:28 -0700 Subject: [PATCH 01/13] feat(config): add new config file * Added efm formatter options * Auto install lsp servers --- init.lua | 6 +- lua/cosmic/config.lua | 13 +++++ lua/cosmic/lsp/providers/defaults.lua | 2 + lua/cosmic/lsp/providers/efm.lua | 84 +++++++++++++++++++++++++-- lua/cosmic/lsp/providers/init.lua | 56 ++++++++++++++---- 5 files changed, 145 insertions(+), 16 deletions(-) create mode 100644 lua/cosmic/config.lua diff --git a/init.lua b/init.lua index 853b79b..49d2e1b 100644 --- a/init.lua +++ b/init.lua @@ -1 +1,5 @@ -require('cosmic') +local ok, err = pcall(require, 'cosmic') + +if not ok then + error(string.format('Error loading core...\n\n%s', err)) +end diff --git a/lua/cosmic/config.lua b/lua/cosmic/config.lua new file mode 100644 index 0000000..d7bda51 --- /dev/null +++ b/lua/cosmic/config.lua @@ -0,0 +1,13 @@ +local config = { + lsp = { + format_on_save = true, + servers = { + eslint = nil, + efm = { + -- disable_formatters = {'eslint'} + } + } + } +} + +return config diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index 3d81fa5..7b46185 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -45,4 +45,6 @@ M.root_dir = function(fname) or util.root_pattern('tsconfig.json')(fname) end +M.autostart = true + return M diff --git a/lua/cosmic/lsp/providers/efm.lua b/lua/cosmic/lsp/providers/efm.lua index 942cbf2..4bfb13f 100644 --- a/lua/cosmic/lsp/providers/efm.lua +++ b/lua/cosmic/lsp/providers/efm.lua @@ -1,17 +1,28 @@ local util = require('lspconfig').util +local config = require('cosmic.config') +local formatters = {} -local stylua = { +formatters.stylua = { formatCommand = 'stylua -s --quote-style AutoPreferSingle --indent-type Spaces --indent-width 2 -', formatStdin = true, } -local prettier = { +formatters.eslint = { + lintCommand = 'eslint_d -f unix --stdin --stdin-filename ${INPUT}', + lintStdin = true, + lintFormats = { '%f:%l:%c: %m' }, + lintIgnoreExitCode = true, + formatCommand = 'eslint_d --stdin --fix-to-stdout --stdin-filename=${INPUT}', + formatStdin = true, +} + +formatters.prettier = { -- formatCommand = 'prettier --stdin-filepath ${INPUT}', formatCommand = 'prettierd "${INPUT}"', formatStdin = true, } -local filetypes = { +--[[ local filetypes = { css = { prettier }, html = { prettier }, lua = { stylua }, @@ -23,8 +34,71 @@ local filetypes = { typescript = { prettier }, typescriptreact = { prettier }, yaml = { prettier }, +} ]] +local filetype_defaults = { + css = {}, + html = {}, + lua = {}, + javascript = {}, + javascriptreact = {}, + json = {}, + markdown = {}, + scss = {}, + typescript = {}, + typescriptreact = {}, + yaml = {}, } +formatters.defaults = { + eslint = { + 'javascript', + 'javascriptreact', + 'json', + 'typescriptreact', + 'typescript', + }, + prettier = { + 'css', + 'html', + 'javascript', + 'javascriptreact', + 'json', + 'typescriptreact', + 'typescript', + 'markdown', + 'scss', + 'yaml', + }, + stylua = { 'lua' } +} + +local function is_formatter_disabled(formatter) + if config.lsp.servers.efm.disable_formatters then + for i in pairs(config.lsp.servers.efm.disable_formatters) do + local disabled = config.lsp.servers.efm.disable_formatters[i] + if disabled == formatter then + return true + end + end + end + return false +end + +local languages = {} +for formatter, filetypes in pairs(formatters.defaults) do + if not is_formatter_disabled(formatter) then + -- print(formatter) + for i in pairs(formatters.defaults[formatter]) do + local filetype = formatters.defaults[formatter][i] + -- print(filetype) + languages[filetype] = languages[filetype] or {} + table.insert(languages[filetype], { [formatter] = formatters[formatter] }) + end + end +end + +-- print(vim.inspect(languages)) + return { init_options = { documentFormatting = true, codeAction = true }, root_dir = function(fname) @@ -34,6 +108,6 @@ return { or util.root_pattern('.eslintrc.js')(fname) or util.root_pattern('tsconfig.json')(fname) end, - filetypes = vim.tbl_keys(filetypes), - settings = { languages = filetypes }, + filetype_defaults = vim.tbl_keys(filetype_defaults), + settings = { languages = languages }, } diff --git a/lua/cosmic/lsp/providers/init.lua b/lua/cosmic/lsp/providers/init.lua index 93e2e6c..7f98f1e 100644 --- a/lua/cosmic/lsp/providers/init.lua +++ b/lua/cosmic/lsp/providers/init.lua @@ -1,4 +1,5 @@ local default_config = require('cosmic.lsp.providers.defaults') +local config = require('cosmic.config') local lsp_installer = require('nvim-lsp-installer') lsp_installer.settings({ @@ -16,24 +17,59 @@ lsp_installer.settings({ }, }) +-- initial default serverse +local requested_servers = { + 'eslint', + 'efm', + 'tsserver', + 'sumneko_lua', + 'jsonls', + 'cssls', + 'html', + -- 'intelephense', + -- 'pyright', + -- 'gopls', +} + +-- add servers set in config to requested_servers table +for config_server in pairs(config.lsp.servers) do + if requested_servers[config_server] == nil then + table.insert(requested_servers, config_server) + end +end + +-- go through requested_servers and ensure installation +local lsp_installer_servers = require('nvim-lsp-installer.servers') +for server in pairs(requested_servers) do + local requested_server = requested_servers[server] + + local ok, serv = lsp_installer_servers.get_server(requested_server) + if ok then + if not serv:is_installed() then + serv:install() + end + end +end + +--[[ Auto-format *.rs (rust) files prior to saving them + autocmd BufWritePre *.rs lua vim.lsp.buf.formatting_sync(nil, 1000) ]] + lsp_installer.on_server_ready(function(server) local opts = default_config + --[[ if config.lsp.servers[server.name] == nil then + opts.autostart = false + end ]] if server.name == 'sumneko_lua' then - local config = require('cosmic.lsp.providers.lua') - opts = vim.tbl_deep_extend('force', opts, config) + opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.lua')) elseif server.name == 'tsserver' then - local config = require('cosmic.lsp.providers.tsserver') - opts = vim.tbl_deep_extend('force', opts, config) + opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.tsserver')) elseif server.name == 'efm' then - local config = require('cosmic.lsp.providers.efm') - opts = vim.tbl_deep_extend('force', opts, config) + opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.efm')) elseif server.name == 'jsonls' then - local config = require('cosmic.lsp.providers.jsonls') - opts = vim.tbl_deep_extend('force', opts, config) + opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.jsonls')) elseif server.name == 'eslint' then - local config = require('cosmic.lsp.providers.eslint') - opts = vim.tbl_deep_extend('force', opts, config) + opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.eslint')) end -- This setup() function is exactly the same as lspconfig's setup function (:help lspconfig-quickstart) From ce86cc1f6e1dfd43636363c6117d6cc5b3211bdd Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 24 Oct 2021 16:02:56 -0700 Subject: [PATCH 02/13] fix(efm): fix formatting config settings --- lua/cosmic/config.lua | 21 ++++++++++----------- lua/cosmic/lsp/init.lua | 7 +++++++ lua/cosmic/lsp/providers/efm.lua | 26 ++++++-------------------- lua/cosmic/lsp/providers/init.lua | 28 +++++++++++++++++----------- 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/lua/cosmic/config.lua b/lua/cosmic/config.lua index d7bda51..a8afb86 100644 --- a/lua/cosmic/config.lua +++ b/lua/cosmic/config.lua @@ -1,13 +1,12 @@ -local config = { - lsp = { - format_on_save = true, - servers = { - eslint = nil, - efm = { - -- disable_formatters = {'eslint'} - } - } - } -} +local config = {} +-- config.lsp = { + -- format_on_save = true, + -- servers = { + -- eslint = false, + -- efm = { + -- disable_formatters = {'eslint', 'prettier', 'stylua'} + -- } + -- } +-- } return config diff --git a/lua/cosmic/lsp/init.lua b/lua/cosmic/lsp/init.lua index 5064203..e028df6 100644 --- a/lua/cosmic/lsp/init.lua +++ b/lua/cosmic/lsp/init.lua @@ -1,3 +1,4 @@ +local config = require('cosmic.config') require('cosmic.lsp.providers') require('cosmic.lsp.diagnostics').init() @@ -5,3 +6,9 @@ vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.s vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single', }) + +if config.lsp and config.lsp.format_on_save then + vim.cmd([[ + autocmd BufWritePre * lua vim.lsp.buf.formatting() + ]]) +end diff --git a/lua/cosmic/lsp/providers/efm.lua b/lua/cosmic/lsp/providers/efm.lua index 4bfb13f..7254c60 100644 --- a/lua/cosmic/lsp/providers/efm.lua +++ b/lua/cosmic/lsp/providers/efm.lua @@ -22,19 +22,6 @@ formatters.prettier = { formatStdin = true, } ---[[ local filetypes = { - css = { prettier }, - html = { prettier }, - lua = { stylua }, - javascript = { prettier }, - javascriptreact = { prettier }, - json = { prettier }, - markdown = { prettier }, - scss = { prettier }, - typescript = { prettier }, - typescriptreact = { prettier }, - yaml = { prettier }, -} ]] local filetype_defaults = { css = {}, html = {}, @@ -73,7 +60,7 @@ formatters.defaults = { } local function is_formatter_disabled(formatter) - if config.lsp.servers.efm.disable_formatters then + if config.lsp and config.lsp.servers and config.lsp.servers.efm and config.lsp.servers.efm.disable_formatters then for i in pairs(config.lsp.servers.efm.disable_formatters) do local disabled = config.lsp.servers.efm.disable_formatters[i] if disabled == formatter then @@ -87,17 +74,16 @@ end local languages = {} for formatter, filetypes in pairs(formatters.defaults) do if not is_formatter_disabled(formatter) then - -- print(formatter) - for i in pairs(formatters.defaults[formatter]) do - local filetype = formatters.defaults[formatter][i] - -- print(filetype) + for i in pairs(filetypes) do + local filetype = filetypes[i] languages[filetype] = languages[filetype] or {} - table.insert(languages[filetype], { [formatter] = formatters[formatter] }) + table.insert(languages[filetype], formatters[formatter]) end end end -- print(vim.inspect(languages)) +-- print(vim.inspect(languages['javascript']['prettier'])) return { init_options = { documentFormatting = true, codeAction = true }, @@ -108,6 +94,6 @@ return { or util.root_pattern('.eslintrc.js')(fname) or util.root_pattern('tsconfig.json')(fname) end, - filetype_defaults = vim.tbl_keys(filetype_defaults), + filetypes = vim.tbl_keys(filetype_defaults), settings = { languages = languages }, } diff --git a/lua/cosmic/lsp/providers/init.lua b/lua/cosmic/lsp/providers/init.lua index 7f98f1e..bf5c2f6 100644 --- a/lua/cosmic/lsp/providers/init.lua +++ b/lua/cosmic/lsp/providers/init.lua @@ -26,15 +26,19 @@ local requested_servers = { 'jsonls', 'cssls', 'html', - -- 'intelephense', - -- 'pyright', - -- 'gopls', } --- add servers set in config to requested_servers table -for config_server in pairs(config.lsp.servers) do - if requested_servers[config_server] == nil then - table.insert(requested_servers, config_server) +-- get disabled servers from config +local disabled_servers = {} +if config.lsp and config.lsp.servers then + for config_server, config_opt in pairs(config.lsp.servers) do + if config_opt == false then + for server in pairs(requested_servers) do + if (requested_servers[server] == config_server) then + table.insert(disabled_servers, requested_servers[server]) + end + end + end end end @@ -51,14 +55,16 @@ for server in pairs(requested_servers) do end end ---[[ Auto-format *.rs (rust) files prior to saving them - autocmd BufWritePre *.rs lua vim.lsp.buf.formatting_sync(nil, 1000) ]] +-- print(vim.inspect(requested_servers)) +-- print(vim.inspect(disabled_servers)) lsp_installer.on_server_ready(function(server) local opts = default_config - --[[ if config.lsp.servers[server.name] == nil then + + opts.autostart = true + if vim.tbl_contains(disabled_servers, server.name) then opts.autostart = false - end ]] + end if server.name == 'sumneko_lua' then opts = vim.tbl_deep_extend('force', opts, require('cosmic.lsp.providers.lua')) From aa32ac00b972cba2a99e78108cdf20b338926b47 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 24 Oct 2021 16:27:25 -0700 Subject: [PATCH 03/13] fix(lsp): install if defined on config --- lua/cosmic/lsp/providers/efm.lua | 10 +++------- lua/cosmic/lsp/providers/init.lua | 10 +++++----- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/lua/cosmic/lsp/providers/efm.lua b/lua/cosmic/lsp/providers/efm.lua index 7254c60..c671972 100644 --- a/lua/cosmic/lsp/providers/efm.lua +++ b/lua/cosmic/lsp/providers/efm.lua @@ -61,11 +61,8 @@ formatters.defaults = { local function is_formatter_disabled(formatter) if config.lsp and config.lsp.servers and config.lsp.servers.efm and config.lsp.servers.efm.disable_formatters then - for i in pairs(config.lsp.servers.efm.disable_formatters) do - local disabled = config.lsp.servers.efm.disable_formatters[i] - if disabled == formatter then - return true - end + if vim.tbl_contains(config.lsp.servers.efm.disable_formatters, formatter) then + return true end end return false @@ -74,8 +71,7 @@ end local languages = {} for formatter, filetypes in pairs(formatters.defaults) do if not is_formatter_disabled(formatter) then - for i in pairs(filetypes) do - local filetype = filetypes[i] + for _, filetype in pairs(filetypes) do languages[filetype] = languages[filetype] or {} table.insert(languages[filetype], formatters[formatter]) end diff --git a/lua/cosmic/lsp/providers/init.lua b/lua/cosmic/lsp/providers/init.lua index bf5c2f6..b9bc2df 100644 --- a/lua/cosmic/lsp/providers/init.lua +++ b/lua/cosmic/lsp/providers/init.lua @@ -33,11 +33,11 @@ local disabled_servers = {} if config.lsp and config.lsp.servers then for config_server, config_opt in pairs(config.lsp.servers) do if config_opt == false then - for server in pairs(requested_servers) do - if (requested_servers[server] == config_server) then - table.insert(disabled_servers, requested_servers[server]) - end - end + table.insert(disabled_servers, config_server) + elseif not vim.tbl_contains(requested_servers, config_server) then + -- add additonally defined servers to be installed + -- todo: how to handle non-default server opts? + table.insert(requested_servers, config_server) end end end From cd5cee0342273a4695fe7b3e4d22776890b24f68 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 24 Oct 2021 22:02:14 -0700 Subject: [PATCH 04/13] feat(config): move format to better place --- lua/cosmic/lsp/init.lua | 6 ------ lua/cosmic/lsp/providers/defaults.lua | 7 +++++++ lua/cosmic/lsp/providers/init.lua | 10 ++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lua/cosmic/lsp/init.lua b/lua/cosmic/lsp/init.lua index e028df6..6fc2f10 100644 --- a/lua/cosmic/lsp/init.lua +++ b/lua/cosmic/lsp/init.lua @@ -1,4 +1,3 @@ -local config = require('cosmic.config') require('cosmic.lsp.providers') require('cosmic.lsp.diagnostics').init() @@ -7,8 +6,3 @@ vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single', }) -if config.lsp and config.lsp.format_on_save then - vim.cmd([[ - autocmd BufWritePre * lua vim.lsp.buf.formatting() - ]]) -end diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index 7b46185..7123f7a 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -1,3 +1,4 @@ +local config = require('cosmic.config') local M = {} function M.on_attach(client, bufnr) @@ -12,6 +13,12 @@ function M.on_attach(client, bufnr) if vim.tbl_contains(formatting_servers, client.name) then client.resolved_capabilities.document_formatting = true client.resolved_capabilities.document_range_formatting = true + if config.lsp and config.lsp.format_on_save then + -- todo: don't run more than once + vim.cmd([[ + autocmd BufWritePre * lua vim.lsp.buf.formatting() + ]]) + end else client.resolved_capabilities.document_formatting = false client.resolved_capabilities.document_range_formatting = false diff --git a/lua/cosmic/lsp/providers/init.lua b/lua/cosmic/lsp/providers/init.lua index b9bc2df..72271ba 100644 --- a/lua/cosmic/lsp/providers/init.lua +++ b/lua/cosmic/lsp/providers/init.lua @@ -44,13 +44,11 @@ end -- go through requested_servers and ensure installation local lsp_installer_servers = require('nvim-lsp-installer.servers') -for server in pairs(requested_servers) do - local requested_server = requested_servers[server] - - local ok, serv = lsp_installer_servers.get_server(requested_server) +for _, requested_server in pairs(requested_servers) do + local ok, server = lsp_installer_servers.get_server(requested_server) if ok then - if not serv:is_installed() then - serv:install() + if not server:is_installed() then + server:install() end end end From 554593e5261f4af24b05fc170f18fdbf21cc4b08 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 24 Oct 2021 22:15:29 -0700 Subject: [PATCH 05/13] feat(config): default config --- lua/cosmic/{ => config}/config.lua | 0 lua/cosmic/config/init.lua | 15 +++++++++++++++ 2 files changed, 15 insertions(+) rename lua/cosmic/{ => config}/config.lua (100%) create mode 100644 lua/cosmic/config/init.lua diff --git a/lua/cosmic/config.lua b/lua/cosmic/config/config.lua similarity index 100% rename from lua/cosmic/config.lua rename to lua/cosmic/config/config.lua diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua new file mode 100644 index 0000000..3bd77db --- /dev/null +++ b/lua/cosmic/config/init.lua @@ -0,0 +1,15 @@ +local config = require('cosmic.config.config') + +local default_config = { + lsp = { + format_on_save = false, + servers = { + eslint = true, + efm = { + disable_formatters = { 'eslint', }, + }, + }, + }, +} + +return vim.tbl_deep_extend('force', default_config, config) From 10b52b8835461210644ceb01bf5d63d81da38fd0 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 06:34:53 -0700 Subject: [PATCH 06/13] fix(lsp): run autoformat command just once --- lua/cosmic/config/config.lua | 18 +++++++++--------- lua/cosmic/config/init.lua | 2 +- lua/cosmic/lsp/providers/defaults.lua | 5 +++-- lua/cosmic/lsp/providers/efm.lua | 13 ++----------- lua/cosmic/lsp/providers/init.lua | 16 +++++++--------- 5 files changed, 22 insertions(+), 32 deletions(-) diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index a8afb86..fb138e2 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -1,12 +1,12 @@ local config = {} --- config.lsp = { - -- format_on_save = true, - -- servers = { - -- eslint = false, - -- efm = { - -- disable_formatters = {'eslint', 'prettier', 'stylua'} - -- } - -- } --- } +--[[ config.lsp = { + format_on_save = true, + servers = { + eslint = false, + efm = { + disable_formatters = {'eslint', 'prettier', 'stylua'} + } + } +} ]] return config diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua index 3bd77db..f4d4a3b 100644 --- a/lua/cosmic/config/init.lua +++ b/lua/cosmic/config/init.lua @@ -6,7 +6,7 @@ local default_config = { servers = { eslint = true, efm = { - disable_formatters = { 'eslint', }, + disable_formatters = { 'eslint' }, }, }, }, diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index 7123f7a..b6fece3 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -1,6 +1,7 @@ local config = require('cosmic.config') local M = {} +local auto_format_lock = false; function M.on_attach(client, bufnr) local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) @@ -13,8 +14,8 @@ function M.on_attach(client, bufnr) if vim.tbl_contains(formatting_servers, client.name) then client.resolved_capabilities.document_formatting = true client.resolved_capabilities.document_range_formatting = true - if config.lsp and config.lsp.format_on_save then - -- todo: don't run more than once + if config.lsp.format_on_save and not auto_format_lock then + auto_format_lock = true -- just run autocommand once vim.cmd([[ autocmd BufWritePre * lua vim.lsp.buf.formatting() ]]) diff --git a/lua/cosmic/lsp/providers/efm.lua b/lua/cosmic/lsp/providers/efm.lua index c671972..428f1c4 100644 --- a/lua/cosmic/lsp/providers/efm.lua +++ b/lua/cosmic/lsp/providers/efm.lua @@ -56,21 +56,12 @@ formatters.defaults = { 'scss', 'yaml', }, - stylua = { 'lua' } + stylua = { 'lua' }, } -local function is_formatter_disabled(formatter) - if config.lsp and config.lsp.servers and config.lsp.servers.efm and config.lsp.servers.efm.disable_formatters then - if vim.tbl_contains(config.lsp.servers.efm.disable_formatters, formatter) then - return true - end - end - return false -end - local languages = {} for formatter, filetypes in pairs(formatters.defaults) do - if not is_formatter_disabled(formatter) then + if not vim.tbl_contains(config.lsp.servers.efm.disable_formatters, formatter) then for _, filetype in pairs(filetypes) do languages[filetype] = languages[filetype] or {} table.insert(languages[filetype], formatters[formatter]) diff --git a/lua/cosmic/lsp/providers/init.lua b/lua/cosmic/lsp/providers/init.lua index 72271ba..ce042a1 100644 --- a/lua/cosmic/lsp/providers/init.lua +++ b/lua/cosmic/lsp/providers/init.lua @@ -30,15 +30,13 @@ local requested_servers = { -- get disabled servers from config local disabled_servers = {} -if config.lsp and config.lsp.servers then - for config_server, config_opt in pairs(config.lsp.servers) do - if config_opt == false then - table.insert(disabled_servers, config_server) - elseif not vim.tbl_contains(requested_servers, config_server) then - -- add additonally defined servers to be installed - -- todo: how to handle non-default server opts? - table.insert(requested_servers, config_server) - end +for config_server, config_opt in pairs(config.lsp.servers) do + if config_opt == false then + table.insert(disabled_servers, config_server) + elseif not vim.tbl_contains(requested_servers, config_server) then + -- add additonally defined servers to be installed + -- todo: how to handle non-default server opts? + table.insert(requested_servers, config_server) end end From ea2b4f0ca14ee3b0800d4c2d482f6dc156e077e4 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 07:13:42 -0700 Subject: [PATCH 07/13] feat(config): add helper function for formatters --- lua/cosmic/config/config.lua | 6 +++++- lua/cosmic/config/init.lua | 21 ++++++++++++++++---- lua/cosmic/lsp/providers/defaults.lua | 5 +++-- lua/cosmic/lsp/providers/efm.lua | 28 +++++++++++++-------------- 4 files changed, 38 insertions(+), 22 deletions(-) diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index fb138e2..85a4443 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -4,8 +4,12 @@ local config = {} servers = { eslint = false, efm = { + format = false -- disable formatting all together disable_formatters = {'eslint', 'prettier', 'stylua'} - } + }, + tsserver = { + format = false, + } } } ]] diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua index f4d4a3b..ce23f57 100644 --- a/lua/cosmic/config/init.lua +++ b/lua/cosmic/config/init.lua @@ -1,15 +1,28 @@ -local config = require('cosmic.config.config') +local user_config = require('cosmic.config.config') +-- these settings will be merged with any settings definined in config.lua local default_config = { lsp = { format_on_save = false, servers = { - eslint = true, + eslint = false, efm = { - disable_formatters = { 'eslint' }, + format = true, + disable_formatters = {}, -- e.g. 'eslint', 'prettier', 'stylua' }, + tsserver = { + format = false, + } }, }, } -return vim.tbl_deep_extend('force', default_config, config) +local config = vim.tbl_deep_extend('force', default_config, user_config) + +-- default servers that can be formatted +local formatting_servers = { 'efm', 'eslint', 'tsserver', 'sumneko_lua', 'rust_analyzer', 'gopls', 'pyright' } +function default_config.lsp.can_client_format(client_name) + return (config.lsp.servers[client_name] and config.lsp.servers[client_name].format and vim.tbl_contains(formatting_servers, client_name)) +end + +return config diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index b6fece3..d04fdbb 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -2,6 +2,7 @@ local config = require('cosmic.config') local M = {} local auto_format_lock = false; + function M.on_attach(client, bufnr) local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) @@ -10,10 +11,10 @@ function M.on_attach(client, bufnr) -- Enable completion triggered by buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') - local formatting_servers = { 'efm', 'eslint' } - if vim.tbl_contains(formatting_servers, client.name) then + if config.lsp.can_client_format(client.name) then client.resolved_capabilities.document_formatting = true client.resolved_capabilities.document_range_formatting = true + -- auto format on save if config.lsp.format_on_save and not auto_format_lock then auto_format_lock = true -- just run autocommand once vim.cmd([[ diff --git a/lua/cosmic/lsp/providers/efm.lua b/lua/cosmic/lsp/providers/efm.lua index 428f1c4..0990bce 100644 --- a/lua/cosmic/lsp/providers/efm.lua +++ b/lua/cosmic/lsp/providers/efm.lua @@ -23,17 +23,17 @@ formatters.prettier = { } local filetype_defaults = { - css = {}, - html = {}, - lua = {}, - javascript = {}, - javascriptreact = {}, - json = {}, - markdown = {}, - scss = {}, - typescript = {}, - typescriptreact = {}, - yaml = {}, + 'css', + 'html', + 'lua', + 'javascript', + 'javascriptreact', + 'json', + 'markdown', + 'scss', + 'typescript', + 'typescriptreact', + 'yaml', } formatters.defaults = { @@ -61,6 +61,7 @@ formatters.defaults = { local languages = {} for formatter, filetypes in pairs(formatters.defaults) do + -- disable specific formatters if not vim.tbl_contains(config.lsp.servers.efm.disable_formatters, formatter) then for _, filetype in pairs(filetypes) do languages[filetype] = languages[filetype] or {} @@ -69,9 +70,6 @@ for formatter, filetypes in pairs(formatters.defaults) do end end --- print(vim.inspect(languages)) --- print(vim.inspect(languages['javascript']['prettier'])) - return { init_options = { documentFormatting = true, codeAction = true }, root_dir = function(fname) @@ -81,6 +79,6 @@ return { or util.root_pattern('.eslintrc.js')(fname) or util.root_pattern('tsconfig.json')(fname) end, - filetypes = vim.tbl_keys(filetype_defaults), + filetypes = filetype_defaults, settings = { languages = languages }, } From 01af4f41ce297fede6c250510052eca9220f32af Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 07:33:41 -0700 Subject: [PATCH 08/13] feat(config): add editor config --- lua/cosmic/config/config.lua | 11 ++++++++--- lua/cosmic/config/editor.lua | 6 ++++++ lua/cosmic/config/init.lua | 28 +++++++++++++++++++++------- lua/cosmic/init.lua | 7 +++++++ 4 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 lua/cosmic/config/editor.lua diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index 85a4443..1ac54ba 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -1,16 +1,21 @@ +-- Override Cosmic configuration options + +--[[ local config = {} ---[[ config.lsp = { +config.lsp = { format_on_save = true, servers = { eslint = false, efm = { format = false -- disable formatting all together - disable_formatters = {'eslint', 'prettier', 'stylua'} + disable_formatters = {}, -- e.g. 'eslint', 'prettier', 'lua' }, tsserver = { format = false, } } -} ]] +} return config +]] + diff --git a/lua/cosmic/config/editor.lua b/lua/cosmic/config/editor.lua new file mode 100644 index 0000000..9a53945 --- /dev/null +++ b/lua/cosmic/config/editor.lua @@ -0,0 +1,6 @@ +-- Override Cosmic editor options + +--[[ local opt = vim.opt +opt.tabstop = 4 +opt.softtabstop = 4 +opt.shiftwidth = 4 ]] diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua index ce23f57..18dcc9c 100644 --- a/lua/cosmic/config/init.lua +++ b/lua/cosmic/config/init.lua @@ -1,28 +1,42 @@ -local user_config = require('cosmic.config.config') +local ok, user_config = pcall(require, 'cosmic.config.config') + +if not ok then + error(string.format('Error loading user config...\n\n%s', user_config)) + error('No user config, using default instead...') +end + +if user_config == true then + user_config = {} +end -- these settings will be merged with any settings definined in config.lua local default_config = { lsp = { format_on_save = false, servers = { - eslint = false, + eslint = true, efm = { format = true, - disable_formatters = {}, -- e.g. 'eslint', 'prettier', 'stylua' + disable_formatters = { 'eslint' }, -- e.g. 'eslint', 'prettier', 'stylua' }, tsserver = { format = false, - } + }, }, }, } -local config = vim.tbl_deep_extend('force', default_config, user_config) - +local config = vim.tbl_deep_extend('force', default_config, user_config) -- default servers that can be formatted local formatting_servers = { 'efm', 'eslint', 'tsserver', 'sumneko_lua', 'rust_analyzer', 'gopls', 'pyright' } +local user_servers = vim.tbl_keys(config.lsp.servers) + function default_config.lsp.can_client_format(client_name) - return (config.lsp.servers[client_name] and config.lsp.servers[client_name].format and vim.tbl_contains(formatting_servers, client_name)) + if not user_servers[client_name] or vim.tbl_contains(formatting_servers, client_name) then + return false + end + + return (user_servers[client_name].format == true) end return config diff --git a/lua/cosmic/init.lua b/lua/cosmic/init.lua index 1de6634..b5928b5 100644 --- a/lua/cosmic/init.lua +++ b/lua/cosmic/init.lua @@ -3,3 +3,10 @@ require('cosmic.pluginsInit') require('cosmic.compiled') require('cosmic.mappings') require('cosmic.editor') + +do + local ok, err = pcall(require, 'cosmic.config.editor') + if not ok then + error(string.format('Error loading custor editor settings...\n\n%s', err)) + end +end From 6306ed7293a7b8067f89ef02d2b3eb1644de67fd Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 08:02:19 -0700 Subject: [PATCH 09/13] feat(config): additional mappings config --- lua/cosmic/config/mappings.lua | 6 ++++++ lua/cosmic/init.lua | 9 ++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 lua/cosmic/config/mappings.lua diff --git a/lua/cosmic/config/mappings.lua b/lua/cosmic/config/mappings.lua new file mode 100644 index 0000000..8a882ff --- /dev/null +++ b/lua/cosmic/config/mappings.lua @@ -0,0 +1,6 @@ +-- Additional remaps +--[[ +local map = require('cosmic.utils').map + +map('i', 'jj', '', { noremap = true, silent = true }) +]] diff --git a/lua/cosmic/init.lua b/lua/cosmic/init.lua index b5928b5..73173f2 100644 --- a/lua/cosmic/init.lua +++ b/lua/cosmic/init.lua @@ -7,6 +7,13 @@ require('cosmic.editor') do local ok, err = pcall(require, 'cosmic.config.editor') if not ok then - error(string.format('Error loading custor editor settings...\n\n%s', err)) + error(string.format('Error loading custom editor settings...\n\n%s', err)) + end +end + +do + local ok, err = pcall(require, 'cosmic.config.mappings') + if not ok then + error(string.format('Error loading custom mapping settings...\n\n%s', err)) end end From fb512d00367c982e5c248b4dd2911592783bcbb4 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 08:13:34 -0700 Subject: [PATCH 10/13] fix(plugins): sync and install on first run --- lua/cosmic/config/config.lua | 8 +++----- lua/cosmic/packer.lua | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index 1ac54ba..55f630a 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -1,13 +1,12 @@ -- Override Cosmic configuration options ---[[ -local config = {} +--[[ local config = {} config.lsp = { format_on_save = true, servers = { eslint = false, efm = { - format = false -- disable formatting all together + format = false, -- disable formatting all together disable_formatters = {}, -- e.g. 'eslint', 'prettier', 'lua' }, tsserver = { @@ -17,5 +16,4 @@ config.lsp = { } return config -]] - + ]] diff --git a/lua/cosmic/packer.lua b/lua/cosmic/packer.lua index 90c2373..e77bd81 100644 --- a/lua/cosmic/packer.lua +++ b/lua/cosmic/packer.lua @@ -24,6 +24,8 @@ if not present then if present then print('Packer cloned successfully.') + packer.sync() + packer.compile() else error("Couldn't clone packer !\nPacker path: " .. packer_path .. '\n' .. packer) end From 9e72bafe0f386f5d90041a7e73ec6d85e07b5f1a Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 08:41:36 -0700 Subject: [PATCH 11/13] chore(configs): clean up --- lua/cosmic/config/config.lua | 24 +++++++++++++++++++----- lua/cosmic/config/init.lua | 11 ++++++----- lua/cosmic/lsp/providers/defaults.lua | 14 ++++++++++---- 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index 55f630a..99d378c 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -1,19 +1,33 @@ -- Override Cosmic configuration options ---[[ local config = {} +--[[ +local config = {} + config.lsp = { - format_on_save = true, + + -- true/false or table of filetypes {'.ts', '.js',} + format_on_save = false, + servers = { + + -- enable/disable server eslint = false, + + -- enable non-default servers (todo: support for custom server configs) + rust_analyzer = true, + efm = { - format = false, -- disable formatting all together - disable_formatters = {}, -- e.g. 'eslint', 'prettier', 'lua' + -- specifc to efm, e.g. 'eslint', 'prettier', 'lua' + disable_formatters = {}, }, + tsserver = { + -- disable formatting all together format = false, } + } } return config - ]] +]] diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua index 18dcc9c..f75c83a 100644 --- a/lua/cosmic/config/init.lua +++ b/lua/cosmic/config/init.lua @@ -12,15 +12,16 @@ end -- these settings will be merged with any settings definined in config.lua local default_config = { lsp = { - format_on_save = false, + format_on_save = false, -- true/false or table of filetypes {'.ts', '.js',} servers = { - eslint = true, + eslint = true, -- enable/disable server + -- rust_analyzer = true, -- enable non-default servers (todo: support for custom server configs) efm = { - format = true, + format = true, -- true or false disable_formatters = { 'eslint' }, -- e.g. 'eslint', 'prettier', 'stylua' }, tsserver = { - format = false, + format = false, -- disable formatting all together }, }, }, @@ -31,7 +32,7 @@ local config = vim.tbl_deep_extend('force', default_config, user_config) local formatting_servers = { 'efm', 'eslint', 'tsserver', 'sumneko_lua', 'rust_analyzer', 'gopls', 'pyright' } local user_servers = vim.tbl_keys(config.lsp.servers) -function default_config.lsp.can_client_format(client_name) +function config.lsp.can_client_format(client_name) if not user_servers[client_name] or vim.tbl_contains(formatting_servers, client_name) then return false end diff --git a/lua/cosmic/lsp/providers/defaults.lua b/lua/cosmic/lsp/providers/defaults.lua index d04fdbb..265eccb 100644 --- a/lua/cosmic/lsp/providers/defaults.lua +++ b/lua/cosmic/lsp/providers/defaults.lua @@ -14,12 +14,18 @@ function M.on_attach(client, bufnr) if config.lsp.can_client_format(client.name) then client.resolved_capabilities.document_formatting = true client.resolved_capabilities.document_range_formatting = true - -- auto format on save + -- check user config to see if we can format on save if config.lsp.format_on_save and not auto_format_lock then auto_format_lock = true -- just run autocommand once - vim.cmd([[ - autocmd BufWritePre * lua vim.lsp.buf.formatting() - ]]) + local format_filetypes = '' + if (vim.tbl_islist(config.lsp.format_on_save)) then + for _, ft in pairs(config.lsp.format_on_save) do + format_filetypes = format_filetypes .. '*' .. ft + end + else + format_filetypes = '*' + end + vim.cmd(string.format('autocomd BufWritePre %s lua vim.lsp.buf.formatting()', format_filetypes)) end else client.resolved_capabilities.document_formatting = false From 7566c5552731c7fe04b8e07c35202487938bb316 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 08:45:18 -0700 Subject: [PATCH 12/13] feat(readme): update w/config --- readme.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/readme.md b/readme.md index 6f33ede..989f67e 100644 --- a/readme.md +++ b/readme.md @@ -52,20 +52,20 @@ _While CosmicNvim is geared specifically toward TypeScript/JavaScript developmen ``` $ cd ~/.config $ git clone git@github.com:mattleong/CosmicNvim.git nvim + $ nvim . ``` -You will need to set up Packers compiled file via the steps below: - -1. Start NVIM -2. Run `PackerUpdate` & `PackerCompile` -3. Restart NVIM -4. Install LSP servers, `:LspInstallInfo` (hit enter to install) - Additional Cosmic installation [details](https://github.com/mattleong/CosmicNvim/wiki/Installation). Additional LSP server installation [details](https://github.com/mattleong/CosmicNvim/wiki/Installing-LSP-servers). -## Mappings +## Configuration + +[Cosmic configurations](./lua/cosmic/config/config.lua) +[Add additional mappings](./lua/cosmic/config/mappings.lua) +[Add addtional vim options](./lua/cosmic/config/editor.lua) + +## Default Mappings [File Navigation](./lua/cosmic/core/navigation/mappings.lua) From 4444126a837724e4ea6907d3a58c6b1735739ef1 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Mon, 25 Oct 2021 08:52:54 -0700 Subject: [PATCH 13/13] feat(config): settable main icon --- lua/cosmic/config/config.lua | 4 ++++ lua/cosmic/config/init.lua | 3 +++ lua/cosmic/core/statusline/init.lua | 7 +++++-- readme.md | 4 +++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lua/cosmic/config/config.lua b/lua/cosmic/config/config.lua index 99d378c..b7357a6 100644 --- a/lua/cosmic/config/config.lua +++ b/lua/cosmic/config/config.lua @@ -3,6 +3,10 @@ --[[ local config = {} +config.statusline = { + main_icon = '★', +} + config.lsp = { -- true/false or table of filetypes {'.ts', '.js',} diff --git a/lua/cosmic/config/init.lua b/lua/cosmic/config/init.lua index f75c83a..be08c8c 100644 --- a/lua/cosmic/config/init.lua +++ b/lua/cosmic/config/init.lua @@ -11,6 +11,9 @@ end -- these settings will be merged with any settings definined in config.lua local default_config = { + statusline = { + main_icon = require('cosmic.core.theme.icons').ghost, + }, lsp = { format_on_save = false, -- true/false or table of filetypes {'.ts', '.js',} servers = { diff --git a/lua/cosmic/core/statusline/init.lua b/lua/cosmic/core/statusline/init.lua index 78f97f6..e963faa 100644 --- a/lua/cosmic/core/statusline/init.lua +++ b/lua/cosmic/core/statusline/init.lua @@ -7,6 +7,9 @@ local utils = require('cosmic.utils') local colors = require('cosmic.core.theme.colors') local highlight = utils.highlight local icons = require('cosmic.core.theme.icons') +local config = require('cosmic.config') + +local main_icon = config.statusline.main_icon local get_mode = function() local mode_colors = { @@ -93,7 +96,7 @@ gls.left = { }, { Ghost = { - provider = BracketProvider(icons.ghost, true), + provider = BracketProvider(main_icon, true), highlight = 'GalaxyViModeInv', }, }, @@ -380,7 +383,7 @@ gls.short_line_left = { }, { GhostShort = { - provider = BracketProvider(icons.ghost, true), + provider = BracketProvider(main_icon, true), highlight = { colors.bg, colors.white }, }, }, diff --git a/readme.md b/readme.md index 989f67e..c125f0a 100644 --- a/readme.md +++ b/readme.md @@ -30,7 +30,7 @@ Full featured native LSP functionality! - Explore files with [nvim-tree](https://github.com/kyazdani42/nvim-tree.lua) - Fuzzy finder and some LSP actions with [Telescope](https://github.com/nvim-telescope/telescope.nvim) - Floating terminal with [vim-floaterm](https://github.com/voldikss/vim-floaterm) -- Easy LSP installation with [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer) +- Auto LSP installation with [nvim-lsp-installer](https://github.com/williamboman/nvim-lsp-installer) - Autocompletion provided by [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) - Snippet support via [LuaSnip](https://github.com/L3MON4D3/LuaSnip) - Session management with [auto-session](https://github.com/rmagatti/auto-session) @@ -62,7 +62,9 @@ Additional LSP server installation [details](https://github.com/mattleong/Cosmic ## Configuration [Cosmic configurations](./lua/cosmic/config/config.lua) + [Add additional mappings](./lua/cosmic/config/mappings.lua) + [Add addtional vim options](./lua/cosmic/config/editor.lua) ## Default Mappings