diff --git a/README.md b/README.md index be7bf7d..e976922 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ You can also merge updates/changes from the repo back into your fork, to keep up ### Docs * [Git in Neovim (Neogit + Diffview)](doc/git.md) +* [IDE setup (Coc.nvim + ALE)](doc/coc-ale.md) #### Example: Adding an autopairs plugin diff --git a/coc-settings.json b/coc-settings.json new file mode 100644 index 0000000..3a304e4 --- /dev/null +++ b/coc-settings.json @@ -0,0 +1,38 @@ +{ + "diagnostic.displayByAle": true, + "suggest.insertMode": "insert", + "inlayHint.display": true, + "inlayHint.enableParameter": true, + "typescript.inlayHints.parameterNames.enabled": "all", + "typescript.inlayHints.parameterTypes.enabled": true, + "typescript.inlayHints.variableTypes.enabled": true, + "typescript.inlayHints.propertyDeclarationTypes.enabled": true, + "typescript.inlayHints.functionLikeReturnTypes.enabled": true, + "typescript.inlayHints.enumMemberValues.enabled": true, + "javascript.inlayHints.parameterNames.enabled": "all", + "javascript.inlayHints.parameterTypes.enabled": true, + "javascript.inlayHints.variableTypes.enabled": true, + "javascript.inlayHints.propertyDeclarationTypes.enabled": true, + "javascript.inlayHints.functionLikeReturnTypes.enabled": true, + "javascript.inlayHints.enumMemberValues.enabled": true, + "rust-analyzer.inlayHints": { + "bindingModeHints": { "enable": true }, + "chainingHints": { "enable": true }, + "closingBraceHints": { "enable": true }, + "closureReturnTypeHints": { "enable": "always" }, + "lifetimeElisionHints": { "enable": "always", "useParameterNames": true }, + "parameterHints": { "enable": true }, + "typeHints": { "enable": true } + }, + "go.goplsOptions": { + "hints": { + "assignVariableTypes": true, + "compositeLiteralFields": true, + "compositeLiteralTypes": true, + "constantValues": true, + "functionTypeParameters": true, + "parameterNames": true, + "rangeVariableTypes": true + } + } +} diff --git a/doc/coc-ale.md b/doc/coc-ale.md new file mode 100644 index 0000000..fe49dae --- /dev/null +++ b/doc/coc-ale.md @@ -0,0 +1,59 @@ +# IDE setup (Coc.nvim + ALE) + +This config uses: + +- **coc.nvim** for language servers, completion, code actions, rename, etc. +- **ALE** for linting/fixing and displaying diagnostics (Coc sends diagnostics to ALE). + +## Where things are configured + +- Plugin + keymaps: `lua/coldboot/plugins/coc_ale.lua` +- Coc settings (inlay hints, insert/replace mode, etc): `coc-settings.json` + +## Keymaps (kept from the previous LSP setup) + +Navigation / actions: + +- `gd` definition +- `gD` declaration +- `gI` implementation +- `gr` references +- `K` hover +- `` signature help +- `rn` rename +- `ca` code action (normal/visual) +- `D` type definition +- `ds` document symbols (`:CocList outline`) +- `ws` workspace symbols (`:CocList -I symbols`) + +Formatting: + +- `f` format buffer (Coc format, falls back to `:ALEFix`) +- `:Format` same as above +- `:ColdbootFormatToggle` toggles ALE fix-on-save + +## Completion (IntelliJ-like) + +In insert mode: + +- `` / ``: if completion menu is visible, move selection; otherwise trigger completion. +- ``: accept completion **without overwriting** text to the right of the caret (“insert”). +- ``: accept completion and **overwrite** the word to the right of the caret (“replace”). + +## Inlay hints + +Inlay hints are enabled via `coc-settings.json`. + +- Toggle for the current buffer: `:CocCommand document.toggleInlayHint` + +## Useful commands + +- `:CocInfo` show Coc status +- `:CocConfig` edit Coc settings +- `:ALEInfo` show ALE status +- `:Mason` install/update LSP binaries (this config auto-installs `gopls`, `rust-analyzer`, `pyright`) + +## Notes on external tools + +ALE fixers/linters call external binaries (e.g. `eslint`, `prettier`, `golangci-lint`, `rustfmt`, `black`, `ruff`). +Install them per project (recommended) or globally so ALE can run them. diff --git a/lua/coldboot/plugins/autoformat.lua b/lua/coldboot/plugins/autoformat.lua deleted file mode 100644 index 3a1b89e..0000000 --- a/lua/coldboot/plugins/autoformat.lua +++ /dev/null @@ -1,74 +0,0 @@ --- autoformat.lua --- --- Use your language server to automatically format your code on save. --- Adds additional commands as well to manage the behavior - -return { - 'neovim/nvim-lspconfig', - config = function() - -- Switch for controlling whether you want autoformatting. - -- Use :ColdbootFormatToggle to toggle autoformatting on or off - local format_is_enabled = true - vim.api.nvim_create_user_command('ColdbootFormatToggle', function() - format_is_enabled = not format_is_enabled - print('Setting autoformatting to: ' .. tostring(format_is_enabled)) - end, {}) - - -- Create an augroup that is used for managing our formatting autocmds. - -- We need one augroup per client to make sure that multiple clients - -- can attach to the same buffer without interfering with each other. - local _augroups = {} - local get_augroup = function(client) - if not _augroups[client.id] then - local group_name = 'coldboot-lsp-format-' .. client.name - local id = vim.api.nvim_create_augroup(group_name, { clear = true }) - _augroups[client.id] = id - end - - return _augroups[client.id] - end - - -- Whenever an LSP attaches to a buffer, we will run this function. - -- - -- See `:help LspAttach` for more information about this autocmd event. - vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('coldboot-lsp-attach-format', { clear = true }), - -- This is where we attach the autoformatting for reasonable clients - callback = function(args) - local client_id = args.data.client_id - local client = vim.lsp.get_client_by_id(client_id) - local bufnr = args.buf - - -- Only attach to clients that support document formatting - if not client.server_capabilities.documentFormattingProvider then - return - end - - -- Tsserver usually works poorly. Sorry you work with bad languages - -- You can remove this line if you know what you're doing :) - if client.name == 'tsserver' then - return - end - - -- Create an autocmd that will run *before* we save the buffer. - -- Run the formatting command for the LSP that has just attached. - vim.api.nvim_create_autocmd('BufWritePre', { - group = get_augroup(client), - buffer = bufnr, - callback = function() - if not format_is_enabled then - return - end - - vim.lsp.buf.format { - async = false, - filter = function(c) - return c.id == client.id - end, - } - end, - }) - end, - }) - end, -} diff --git a/lua/coldboot/plugins/coc_ale.lua b/lua/coldboot/plugins/coc_ale.lua new file mode 100644 index 0000000..267b199 --- /dev/null +++ b/lua/coldboot/plugins/coc_ale.lua @@ -0,0 +1,167 @@ +return { + { + 'neoclide/coc.nvim', + branch = 'release', + init = function() + vim.g.coc_global_extensions = { + 'coc-tsserver', + 'coc-eslint', + 'coc-prettier', + 'coc-json', + 'coc-pyright', + 'coc-go', + 'coc-rust-analyzer', + } + + local map = function(mode, lhs, rhs, desc, opts) + opts = opts or {} + opts.silent = opts.silent ~= false + opts.remap = opts.remap ~= false + opts.desc = desc + vim.keymap.set(mode, lhs, rhs, opts) + end + + local term = function(keys) + return vim.api.nvim_replace_termcodes(keys, true, false, true) + end + + local delete_keyword_suffix = function() + local line = vim.api.nvim_get_current_line() + local col = vim.fn.col '.' + local suffix_len = 0 + + local i = col + while i <= #line do + local ch = line:sub(i, i) + if ch:match '[%w_]' then + suffix_len = suffix_len + 1 + i = i + 1 + else + break + end + end + + if suffix_len == 0 then + return '' + end + + return string.rep(term '', suffix_len) + end + + map('n', 'gd', '(coc-definition)', 'Goto definition') + map('n', 'gD', '(coc-declaration)', 'Goto declaration') + map('n', 'gI', '(coc-implementation)', 'Goto implementation') + map('n', 'gr', '(coc-references)', 'Goto references') + map('n', 'rn', '(coc-rename)', 'Rename') + map('n', 'ca', '(coc-codeaction)', 'Code action') + map('x', 'ca', '(coc-codeaction-selected)', 'Code action (selection)') + map('n', 'D', '(coc-type-definition)', 'Type definition') + map('n', 'ds', 'CocList outline', 'Document symbols', { remap = false }) + map('n', 'ws', 'CocList -I symbols', 'Workspace symbols', { remap = false }) + + map('n', 'K', function() + if vim.fn.exists '*CocActionAsync' == 1 then + vim.fn.CocActionAsync 'doHover' + else + vim.cmd 'normal! K' + end + end, 'Hover') + + map('n', '', '(coc-signature-help)', 'Signature help') + + -- Completion: IntelliJ-like acceptance + -- - Enter: accept with "insert" behavior (doesn't overwrite suffix) + -- - Tab: accept with "replace" behavior (delete suffix, then confirm) + vim.keymap.set('i', '', [[coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\"]], { + silent = true, + expr = true, + }) + + vim.keymap.set('i', '', function() + if vim.fn['coc#pum#visible']() == 1 then + return delete_keyword_suffix() .. vim.fn['coc#pum#confirm']() + end + return term '' + end, { silent = true, expr = true }) + + vim.keymap.set('i', '', function() + if vim.fn['coc#pum#visible']() == 1 then + return vim.fn['coc#pum#prev'](1) + end + return term '' + end, { silent = true, expr = true }) + + vim.keymap.set('i', '', function() + if vim.fn['coc#pum#visible']() == 1 then + return vim.fn['coc#pum#next'](1) + end + vim.fn['coc#refresh']() + return '' + end, { silent = true, expr = true }) + + vim.keymap.set('i', '', function() + if vim.fn['coc#pum#visible']() == 1 then + return vim.fn['coc#pum#prev'](1) + end + vim.fn['coc#refresh']() + return '' + end, { silent = true, expr = true }) + + map('n', 'f', function() + if vim.fn.exists '*CocActionAsync' == 1 then + vim.fn.CocActionAsync 'format' + return + end + if vim.fn.exists ':ALEFix' == 2 then + vim.cmd 'ALEFix' + end + end, 'Format buffer', { remap = false }) + + vim.api.nvim_create_user_command('Format', function() + if vim.fn.exists '*CocActionAsync' == 1 then + vim.fn.CocActionAsync 'format' + return + end + if vim.fn.exists ':ALEFix' == 2 then + vim.cmd 'ALEFix' + end + end, { desc = 'Format current buffer (Coc/ALE)' }) + end, + }, + { + 'dense-analysis/ale', + init = function() + vim.g.ale_disable_lsp = 1 + vim.g.ale_use_neovim_diagnostics_api = 1 + vim.g.ale_completion_enabled = 0 + + vim.g.ale_fix_on_save = 1 + vim.g.ale_fixers = { + go = { 'gofmt', 'goimports' }, + javascript = { 'eslint', 'prettier' }, + typescript = { 'eslint', 'prettier' }, + javascriptreact = { 'eslint', 'prettier' }, + typescriptreact = { 'eslint', 'prettier' }, + rust = { 'rustfmt' }, + python = { 'isort', 'black' }, + } + + vim.g.ale_linters = { + go = { 'golangci-lint' }, + javascript = { 'eslint' }, + typescript = { 'eslint' }, + javascriptreact = { 'eslint' }, + typescriptreact = { 'eslint' }, + rust = { 'clippy' }, + python = { 'ruff' }, + } + + local format_is_enabled = vim.g.ale_fix_on_save == 1 + vim.api.nvim_create_user_command('ColdbootFormatToggle', function() + format_is_enabled = not format_is_enabled + vim.g.ale_fix_on_save = format_is_enabled and 1 or 0 + print('Setting autoformatting to: ' .. tostring(format_is_enabled)) + end, {}) + end, + }, +} diff --git a/lua/coldboot/plugins/completion.lua b/lua/coldboot/plugins/completion.lua deleted file mode 100644 index 7206a64..0000000 --- a/lua/coldboot/plugins/completion.lua +++ /dev/null @@ -1,88 +0,0 @@ -return { - { - -- Autocompletion - 'hrsh7th/nvim-cmp', - event = 'InsertEnter', - dependencies = { -- Snippet Engine & its associated nvim-cmp source - 'hrsh7th/cmp-nvim-lsp', -- Add LSP completion path - 'hrsh7th/cmp-buffer', - 'hrsh7th/cmp-path', - }, - opts = function() - vim.api.nvim_set_hl(0, 'CmpGhostText', { link = 'Comment', default = true }) - - -- See `:help cmp` - local cmp = require 'cmp' - local defaults = require 'cmp.config.default'() - local auto_select = true - - return { - auto_brackets = {}, -- configure any filetype to auto add brackets - - completion = { - completeopt = 'menu,menuone,noinsert' .. (auto_select and '' or ',noselect'), - }, - - preselect = auto_select and cmp.PreselectMode.Item or cmp.PreselectMode.None, - - -- For an understanding of why these mappings were - -- chosen, you will need to read `:help ins-completion` - -- - -- No, but seriously. Please read `:help ins-completion`, it is really good! - mapping = cmp.mapping.preset.insert { - -- Select the [n]ext item - [''] = cmp.mapping.select_next_item(), - -- Select the [p]revious item - [''] = cmp.mapping.select_prev_item(), - - -- Scroll the documentation window [b]ack / [f]orward - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - - -- Accept ([y]es) the completion. - -- This will auto-import if your LSP supports it. - -- This will expand snippets if the LSP sent a snippet. - [''] = cmp.mapping.confirm { select = true }, - - -- Manually trigger a completion from nvim-cmp. - -- Generally you don't need this, because nvim-cmp will display - -- completions whenever it has completion options available. - [''] = cmp.mapping.complete {}, - - [''] = cmp.mapping.confirm { - behavior = cmp.ConfirmBehavior.Replace, - select = true, - }, - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - else - fallback() - end - end, { 'i', 's' }), - [''] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - else - fallback() - end - end, { 'i', 's' }), - }, - sources = cmp.config.sources({ - { name = 'nvim_lsp' }, - { name = 'path' }, - -- { name = 'copilot' }, -- Copilot disabled - }, { - { name = 'buffer' }, - }), - experimental = { - -- only show ghost text when we show ai completions - ghost_text = vim.g.ai_cmp and { - hl_group = 'CmpGhostText', - } or false, - }, - sorting = defaults.sorting, - } - end, - }, -} diff --git a/lua/coldboot/plugins/conform.lua b/lua/coldboot/plugins/conform.lua deleted file mode 100644 index b0b3022..0000000 --- a/lua/coldboot/plugins/conform.lua +++ /dev/null @@ -1,70 +0,0 @@ -return { - { - 'stevearc/conform.nvim', - cmd = 'ConformInfo', - keys = { - { - -- Customize or remove this keymap to your liking - 'f', - function() - require('conform').format { - async = true, - lsp_fallback = true, - } - end, - mode = '', - desc = 'Format buffer', - }, - }, - -- Everything in opts will be passed to setup() - opts = { - -- Define your formatters - formatters_by_ft = { - lua = { 'stylua' }, - python = { 'isort', 'black' }, - javascript = { 'prettier' }, - typescript = { 'prettier' }, - javascriptreact = { 'prettier' }, - typescriptreact = { 'prettier' }, - vue = { 'prettier' }, - css = { 'prettier' }, - scss = { 'prettier' }, - less = { 'prettier' }, - html = { 'prettier' }, - json = { 'prettier' }, - jsonc = { 'prettier' }, - yaml = { 'prettier' }, - markdown = { 'prettier' }, - graphql = { 'prettier' }, - handlebars = { 'prettier' }, - go = { 'goimports', 'gofmt' }, - rust = { 'rustfmt' }, - sh = { 'shfmt' }, - bash = { 'shfmt' }, - zsh = { 'shfmt' }, - fish = { 'fish_indent' }, - toml = { 'taplo' }, - terraform = { 'terraform_fmt' }, - hcl = { 'terraform_fmt' }, - dockerfile = { 'dockerfmt' }, - sql = { 'sqlformat' }, - xml = { 'xmlformat' }, - }, - -- Set up format-on-save - format_on_save = { - timeout_ms = 500, - lsp_fallback = true, - }, - -- Customize formatters - formatters = { - shfmt = { - prepend_args = { '-i', '2' }, - }, - }, - }, - init = function() - -- If you want the formatexpr, here is the place to set it - vim.o.formatexpr = "v:lua.require'conform'.formatexpr()" - end, - }, -} diff --git a/lua/coldboot/plugins/debug.lua b/lua/coldboot/plugins/debug.lua index d475a33..e0309e3 100644 --- a/lua/coldboot/plugins/debug.lua +++ b/lua/coldboot/plugins/debug.lua @@ -21,6 +21,9 @@ return { }, { 'jay-babu/mason-nvim-dap.nvim', + dependencies = { + 'williamboman/mason.nvim', + }, opts = { -- Makes a best effort to setup the various debuggers with -- reasonable debug configurations diff --git a/lua/coldboot/plugins/lsp.lua b/lua/coldboot/plugins/lsp.lua deleted file mode 100644 index eaa9feb..0000000 --- a/lua/coldboot/plugins/lsp.lua +++ /dev/null @@ -1,171 +0,0 @@ -return { - { - -- LSP Configuration & Plugins - 'neovim/nvim-lspconfig', - dependencies = { - -- Automatically install LSPs to stdpath for neovim - { - 'williamboman/mason.nvim', - config = true, - }, - { - 'williamboman/mason-lspconfig.nvim', - }, - -- Useful status updates for LSP - { - 'j-hui/fidget.nvim', - tag = 'legacy', - opts = {}, - }, - -- Additional lua configuration, makes nvim stuff amazing! - 'folke/neodev.nvim', - -- CMP LSP capabilities - 'hrsh7th/cmp-nvim-lsp', - }, - config = function() - -- Setup neovim lua configuration - require('neodev').setup() - - -- Global LSP keymaps via LspAttach (universal, recommended pattern) - local lsp_keys_grp = vim.api.nvim_create_augroup('UserLspKeys', { clear = true }) - vim.api.nvim_create_autocmd('LspAttach', { - group = lsp_keys_grp, - callback = function(args) - local bufnr = args.buf - local nmap = function(keys, func, desc) - if desc then - desc = 'LSP: ' .. desc - end - vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) - end - - local fzf_lua = require 'fzf-lua' - - nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') - nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') - nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') - nmap('gr', fzf_lua.lsp_references, '[G]oto [R]eferences') - nmap('gI', fzf_lua.lsp_implementations, '[G]oto [I]mplementation') - nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') - nmap('ds', fzf_lua.lsp_document_symbols, '[D]ocument [S]ymbols') - nmap('ws', fzf_lua.lsp_live_workspace_symbols, '[W]orkspace [S]ymbols') - nmap('K', vim.lsp.buf.hover, 'Hover Documentation') - nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') - nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') - end, - }) - - -- LSP attach function - local on_attach = function(client, bufnr) - local nmap = function(keys, func, desc) - if desc then - desc = 'LSP: ' .. desc - end - vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) - end - - local fzf_lua = require 'fzf-lua' - - nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') - nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') - nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') - nmap('gr', fzf_lua.lsp_references, '[G]oto [R]eferences') - nmap('gI', fzf_lua.lsp_implementations, '[G]oto [I]mplementation') - nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') - nmap('ds', fzf_lua.lsp_document_symbols, '[D]ocument [S]ymbols') - nmap('ws', fzf_lua.lsp_live_workspace_symbols, '[W]orkspace [S]ymbols') - nmap('K', vim.lsp.buf.hover, 'Hover Documentation') - nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') - nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') - nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') - nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') - nmap('wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, '[W]orkspace [L]ist Folders') - - -- Create a command `:Format` local to the LSP buffer - vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) - vim.lsp.buf.format() - end, { desc = 'Format current buffer with LSP' }) - end - - -- Enable the following language servers - local servers = { - -- languages - gopls = {}, -- golang - eslint = {}, -- javascript - ts_ls = {}, -- typescript - pyright = {}, -- python - rust_analyzer = { - ['rust-analyzer'] = { - imports = { - granularity = { - group = 'module', - }, - prefix = 'self', - }, - cargo = { - buildScripts = { - enable = true, - }, - }, - procMacro = { - enable = true, - }, - }, - }, -- rust - lua_ls = { - Lua = { - workspace = { checkThirdParty = false }, - telemetry = { enable = false }, - }, - }, -- lua - - -- others - sqlls = {}, - marksman = {}, -- markdown - yamlls = {}, - jsonls = { - init_options = { - provideFormatter = true, - }, - }, - taplo = {}, -- toml - html = {}, - -- infrastructure - dockerls = {}, - helm_ls = {}, - terraformls = {}, - } - - -- nvim-cmp supports additional completion capabilities, so broadcast that to servers - local capabilities = vim.lsp.protocol.make_client_capabilities() - capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) - - -- Set up mason-lspconfig to handle installation and setup - local mlsp_ok, mason_lspconfig = pcall(require, 'mason-lspconfig') - if not mlsp_ok then - vim.notify('mason-lspconfig not available', vim.log.levels.ERROR) - return - end - - mason_lspconfig.setup { - ensure_installed = vim.tbl_keys(servers), - automatic_installation = false, - handlers = { - function(server_name) - local server_settings = servers[server_name] or {} - local opts = { - capabilities = capabilities, - on_attach = on_attach, - } - if next(server_settings) ~= nil then - opts.settings = server_settings - end - require('lspconfig')[server_name].setup(opts) - end, - }, - } - end, - }, -} diff --git a/lua/coldboot/plugins/mason.lua b/lua/coldboot/plugins/mason.lua new file mode 100644 index 0000000..bd1b5cb --- /dev/null +++ b/lua/coldboot/plugins/mason.lua @@ -0,0 +1,51 @@ +return { + { + 'williamboman/mason.nvim', + cmd = { 'Mason', 'MasonLog' }, + opts = { + ui = { + border = 'rounded', + }, + }, + config = function(_, opts) + local ok, mason = pcall(require, 'mason') + if not ok then + return + end + + mason.setup(opts) + + local registry_ok, registry = pcall(require, 'mason-registry') + if not registry_ok then + return + end + + -- Keep this list small: just the server binaries Coc commonly uses. + local ensure_installed = { + 'gopls', + 'rust-analyzer', + 'pyright', + } + + local function install(pkg_name) + local pkg = registry.get_package(pkg_name) + if pkg:is_installed() then + return + end + pkg:install() + end + + if registry.refresh then + registry.refresh(function() + for _, pkg_name in ipairs(ensure_installed) do + pcall(install, pkg_name) + end + end) + else + for _, pkg_name in ipairs(ensure_installed) do + pcall(install, pkg_name) + end + end + end, + }, +} diff --git a/lua/coldboot/plugins/rustaceanvim.lua b/lua/coldboot/plugins/rustaceanvim.lua deleted file mode 100644 index e83b95f..0000000 --- a/lua/coldboot/plugins/rustaceanvim.lua +++ /dev/null @@ -1,8 +0,0 @@ -return { - -- Rustacean.nvim is a plugin that provides Rust-specific utilities for Vim. - { - 'mrcjkb/rustaceanvim', - version = '^4', -- Recommended - ft = { 'rust' }, - }, -}