diff --git a/lua/custom/plugins/folding.lua b/lua/custom/plugins/folding.lua new file mode 100644 index 00000000..c6cf7c21 --- /dev/null +++ b/lua/custom/plugins/folding.lua @@ -0,0 +1,27 @@ +return { + { + 'kevinhwang91/nvim-ufo', + dependencies = { + 'kevinhwang91/promise-async', + }, + event = 'VeryLazy', + init = function() + vim.o.foldcolumn = '1' + vim.o.foldlevel = 99 + vim.o.foldlevelstart = 99 + vim.o.foldenable = true + end, + opts = { + provider_selector = function(_, _, _) + return { 'treesitter', 'indent' } + end, + }, + config = function(_, opts) + local ufo = require 'ufo' + ufo.setup(opts) + + vim.keymap.set('n', 'zR', ufo.openAllFolds, { desc = 'Open all folds' }) + vim.keymap.set('n', 'zM', ufo.closeAllFolds, { desc = 'Close all folds' }) + end, + }, +} diff --git a/lua/custom/plugins/lint.lua b/lua/custom/plugins/lint.lua index 2c194f59..08494844 100644 --- a/lua/custom/plugins/lint.lua +++ b/lua/custom/plugins/lint.lua @@ -53,47 +53,71 @@ return { -- lint.linters_by_ft['terraform'] = nil -- lint.linters_by_ft['text'] = nil + local function executable_cmd(cmd) + if type(cmd) == 'function' then + local ok, value = pcall(cmd) + if not ok then + return nil + end + return value + end + return cmd + end + + local function available_linters_for(ft) + local configured = lint.linters_by_ft[ft] or {} + local available = {} + for _, linter_name in ipairs(configured) do + local linter = lint.linters[linter_name] + local cmd = linter and executable_cmd(linter.cmd) + if cmd == nil or cmd == '' or vim.fn.executable(cmd) == 1 then + table.insert(available, linter_name) + end + end + return available + end + + local function trigger_lint() + if vim.bo.modifiable then + local linters = available_linters_for(vim.bo.filetype) + if #linters > 0 then + lint.try_lint(linters) + end + end + end + + -- Toggle lint on/off + local lint_enabled = true + vim.keymap.set('n', 'tl', function() + lint_enabled = not lint_enabled + if not lint_enabled then + local cleared = {} + for _, linters in pairs(lint.linters_by_ft) do + for _, linter_name in ipairs(linters) do + local ns = lint.get_namespace(linter_name) + if not cleared[ns] then + vim.diagnostic.reset(ns) + cleared[ns] = true + end + end + end + else + trigger_lint() + end + vim.notify('Lint ' .. (lint_enabled and 'enabled' or 'disabled')) + end, { desc = '[T]oggle [L]int' }) + -- Create autocommand which carries out the actual linting -- on the specified events. local lint_augroup = vim.api.nvim_create_augroup('lint', { clear = true }) vim.api.nvim_create_autocmd({ 'BufEnter', 'BufWritePost', 'InsertLeave' }, { group = lint_augroup, + -- Only run the linter in buffers that you can modify in order to + -- avoid superfluous noise, notably within the handy LSP pop-ups that + -- describe the hovered symbol using Markdown. callback = function() - local function executable_cmd(cmd) - if type(cmd) == 'function' then - local ok, value = pcall(cmd) - if not ok then - return nil - end - return value - end - return cmd - end - - local function available_linters_for(ft) - local configured = lint.linters_by_ft[ft] or {} - local available = {} - - for _, linter_name in ipairs(configured) do - local linter = lint.linters[linter_name] - local cmd = linter and executable_cmd(linter.cmd) - if cmd == nil or cmd == '' or vim.fn.executable(cmd) == 1 then - table.insert(available, linter_name) - end - end - - return available - end - - -- Only run the linter in buffers that you can modify in order to - -- avoid superfluous noise, notably within the handy LSP pop-ups that - -- describe the hovered symbol using Markdown. - if vim.bo.modifiable then - local filetype = vim.bo.filetype - local linters = available_linters_for(filetype) - if #linters > 0 then - lint.try_lint(linters) - end + if lint_enabled then + trigger_lint() end end, })