diff --git a/init.lua b/init.lua index 3841689..f790dbe 100644 --- a/init.lua +++ b/init.lua @@ -31,3 +31,4 @@ require("user.dressing") require("user.cybu") require("user.autocommands") require("user.gps") +require("user.ufo") diff --git a/lua/user/keymaps.lua b/lua/user/keymaps.lua index 122782d..a50101f 100644 --- a/lua/user/keymaps.lua +++ b/lua/user/keymaps.lua @@ -98,6 +98,10 @@ keymap("n", "u", ":UndotreeToggle", opts) -- Legendary keymap("n", "", ":lua require('legendary').find()", opts) +-- UFO +keymap("n", "zR", ":lua require('ufo').openAllFolds", opts) +keymap("n", "zM", ":lua require('ufo').closeAllFolds", opts) + -- Insert -- -- Visual -- diff --git a/lua/user/lsp/handlers.lua b/lua/user/lsp/handlers.lua index 98a2394..18450a1 100644 --- a/lua/user/lsp/handlers.lua +++ b/lua/user/lsp/handlers.lua @@ -80,8 +80,13 @@ M.on_attach = function(client, bufnr) attach_navic(client, bufnr) end +-- Define Capabilities local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities.textDocument.completion.completionItem.snippetSupport = true +capabilities.textDocument.foldingRange = { + dynamicRegistration = false, + lineFoldingOnly = true +} local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp") diff --git a/lua/user/options.lua b/lua/user/options.lua index a6eae2f..0208880 100644 --- a/lua/user/options.lua +++ b/lua/user/options.lua @@ -37,6 +37,11 @@ vim.opt.colorcolumn = "120" vim.opt.list = true vim.opt.listchars:append("lead:.") vim.opt.winbar = "%{%v:lua.require'user.winbar'.get_winbar()%}" +vim.opt.foldcolumn = "2" +vim.opt.foldlevel = 99 +vim.opt.foldlevelstart = -1 +vim.opt.foldenable = true +vim.opt.fillchars = [[eob: ,fold: ,foldopen:,foldsep: ,foldclose:]] vim.cmd("set whichwrap+=<,>,[,],h,l") vim.cmd([[set iskeyword+=-]]) diff --git a/lua/user/plugins.lua b/lua/user/plugins.lua index 6ffb5d9..74e41a7 100644 --- a/lua/user/plugins.lua +++ b/lua/user/plugins.lua @@ -46,6 +46,7 @@ return packer.startup(function(use) use("nvim-lua/plenary.nvim") use("kyazdani42/nvim-web-devicons") use("antoinemadec/FixCursorHold.nvim") + use("kevinhwang91/promise-async") -- Themes use("shaunsingh/nord.nvim") @@ -79,6 +80,7 @@ return packer.startup(function(use) use("glepnir/lspsaga.nvim") use("Maan2003/lsp_lines.nvim") use("SmiteshP/nvim-navic") + use("kevinhwang91/nvim-ufo") -- Telescope use("nvim-telescope/telescope.nvim") diff --git a/lua/user/ufo.lua b/lua/user/ufo.lua new file mode 100644 index 0000000..484b68d --- /dev/null +++ b/lua/user/ufo.lua @@ -0,0 +1,39 @@ +local status_ok, ufo = pcall(require, "ufo") +if not status_ok then + return +end + +local handler = function(virtText, lnum, endLnum, width, truncate) + local newVirtText = {} + local suffix = ("  %d "):format(endLnum - lnum) + local sufWidth = vim.fn.strdisplaywidth(suffix) + local targetWidth = width - sufWidth + local curWidth = 0 + for _, chunk in ipairs(virtText) do + local chunkText = chunk[1] + local chunkWidth = vim.fn.strdisplaywidth(chunkText) + if targetWidth > curWidth + chunkWidth then + table.insert(newVirtText, chunk) + else + chunkText = truncate(chunkText, targetWidth - curWidth) + local hlGroup = chunk[2] + table.insert(newVirtText, { chunkText, hlGroup }) + chunkWidth = vim.fn.strdisplaywidth(chunkText) + -- str width returned from truncate() may less than 2nd argument, need padding + if curWidth + chunkWidth < targetWidth then + suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth) + end + break + end + curWidth = curWidth + chunkWidth + end + table.insert(newVirtText, { suffix, "MoreMsg" }) + return newVirtText +end + +ufo.setup({ + provider_selector = function() + return { "lsp", "indent" } + end, + fold_virt_text_handler = handler, +})