kevinhwang91/nvim-ufo

How can I make it look equal to its configuration

CRAG666 opened this issue ยท 61 comments

Currently my line looks like this and I would like it to be seen as yours
screen-1655388054

  1. vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]
  2. vim.o.foldcolumn = '1'
  3. need this PR neovim/neovim#17446 , this PR only changes a few lines, but you must compile the code by yourself.

I will add the note under demo later.

Actually I haven't used that PR, I hacked myself a long ago, and found that PR recently.

diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 2ee7cd44f..8982bd2ee 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -1931,12 +1931,8 @@ static size_t fill_foldcolumn(char_u *p, win_T *wp, foldinfo_T foldinfo, linenr_
     if (foldinfo.fi_lnum == lnum
         && first_level + i >= foldinfo.fi_low_level) {
       symbol = wp->w_p_fcs_chars.foldopen;
-    } else if (first_level == 1) {
-      symbol = wp->w_p_fcs_chars.foldsep;
-    } else if (first_level + i <= 9) {
-      symbol = '0' + first_level + i;
     } else {
-      symbol = '>';
+      symbol = wp->w_p_fcs_chars.foldsep;
     }
 
     len = utf_char2bytes(symbol, (char *)&p[char_counter]);

Tanks

@CRAG666 @kevinhwang91 How to remove the number '2' sign in the image above?

For now, must compile Neovim source code.

How to remove the number '2' sign in the image above?

@hisamafahri
You need to modify the file src/nvim/screen.c in source code with the diff sample above #4 (comment) and recompile.
The indent level number indicator will be gone.

I have found a temporary workaround for this issue, if you set foldcolumn='5' (or some other higher number than 1), it will not show the digits for lower level folds.

Only this way you have to live with the bigger column on the left side, which I actually kind of like since it also shows you the fold levels by shifting the little markers correctly.

What font have you used?
The icon is just too small to clickable
image

What font have you used? The icon is just too small to clickable image

cat alacritty.yml

font:
  normal:
    family: Hack Nerd Font

Search chevron in https://www.nerdfonts.com/cheat-sheet

thanks a lot

p00f commented

โ–ผ for foldopen and โต for foldclose are unicode (work without nerd fonts)

How do I change the color of filechars?

How do I change the color of filechars?

h FoldColumn

I am trying my best to imp #24 which I think is better than VSCode UI. Suggestions are welcome.

if you set foldnestmax to a number equal or lower than the foldcolumn (i.e. both to 2) it won't show the ugly numbers

I thought the number displayed is a bug. After reading this, I understand it is a feature.

Yes, it is a feature. However, at least for me, the problem is that there isn't seem to be a way to configure the fold columns to resize dynamically as they are needed. You either have:

  • As many columns as possible folds in the file: This means that in a file with 7 levels of folds, when you open it it will show 7 fold columns despite only having symbols in the first column (folds are closed).

  • A fixed number of columns: This means that the numbers in the fold columns will appear unless you also limit the number of folds in the file to the number of fold columns.

If I am wrong about this please anybody let me know :)

@kevinhwang91 hey! if i don't want to recompile nvim, can i disable foldcolumn until PR is merged? i tried to set it to 0, and on starting screen it is 0, but when entering some file buffer it resets to 1 with those fold levels in digits :(

@kevinhwang91 hey! if i don't want to recompile nvim, can i disable foldcolumn until PR is merged? i tried to set it to 0, and on starting screen it is 0, but when entering some file buffer it resets to 1 with those fold levels in digits :(

Sure. 0 is recommended if don't compile nvim. Write down o.foldcolumn = '0' in init.lua and check out which script changes your foldcolumn.

i did that, tho i thought it was your plugin who does this :D even tho i didn't find such code in repo...okay, thank you, i will try to use some rg in plugins dir to find who is changing that, thank you!

Update of the patch from above:

From b9de2d3eddac3cc9bd2c03f8adaca13b0da14fef Mon Sep 17 00:00:00 2001
From: WhiteBlackGoose <wbg@angouri.org>
Date: Sat, 3 Dec 2022 21:47:29 +0300
Subject: [PATCH] folding UI made nicer

---
 src/nvim/screen.c | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 865520657..52d619fff 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -215,12 +215,8 @@ size_t fill_foldcolumn(char_u *p, win_T *wp, foldinfo_T foldinfo, linenr_T lnum)
     if (foldinfo.fi_lnum == lnum
         && first_level + i >= foldinfo.fi_low_level) {
       symbol = wp->w_p_fcs_chars.foldopen;
-    } else if (first_level == 1) {
-      symbol = wp->w_p_fcs_chars.foldsep;
-    } else if (first_level + i <= 9) {
-      symbol = '0' + first_level + i;
     } else {
-      symbol = '>';
+      symbol = wp->w_p_fcs_chars.foldsep;
     }
 
     len = utf_char2bytes(symbol, (char *)&p[char_counter]);
-- 
2.38.1

FWIW I decided to maintain my fork of neovim. If I'm not lazy, I will make it autorelease

@alex-popov-tech in case you're still lazy to build it yourself :P

image

I have found a temporary workaround for this issue, if you set foldcolumn='5' (or some other higher number than 1), it will not show the digits for lower level folds.

Only this way you have to live with the bigger column on the left side, which I actually kind of like since it also shows you the fold levels by shifting the little markers correctly.

Yeah Nah.

  1. vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]

    1. vim.o.foldcolumn = '1'

    2. need this PR feat(folds): add 'foldoptions' option neovim/neovim#17446 , this PR only changes a few lines, but you must compile the code by yourself.

That PR just got closed because 'statuscolumn' got merged in Oct: neovim/neovim#17446 (comment)

Any possibility of ufo getting refactored so that PR won't be necessary? I love the plugin but having to use a fork just for it isn't really feasible if there's no hope of the necessary changes being ever included in neovim.

  1. vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]

    1. vim.o.foldcolumn = '1'
    2. need this PR feat(folds): add 'foldoptions' option neovim/neovim#17446 , this PR only changes a few lines, but you must compile the code by yourself.

That PR just got closed because 'statuscolumn' got merged in Oct: neovim/neovim#17446 (comment)

Any possibility of ufo getting refactored so that PR won't be necessary? I love the plugin but having to use a fork just for it isn't really feasible if there's no hope of the necessary changes being ever included in neovim.

Look like you should extend statuscolumn option. I don't trace nightly for now. Maybe someone can help.

Hi all. How do we achieve the same results with neovim 9 since statuscolumn is now merged? TY

Hi all. How do we achieve the same results with neovim 9 since statuscolumn is now merged? TY

Should be able to use a custom expression that follows the 'statusline' syntax. See neovim/neovim#17446 (comment)

I tried it out and got the following: Screenshot 2023-01-10 at 16 48 28

While this works fine, highlighting of the FoldColumn is not respected. CursorLineNr highlights are applied.
image

While this works fine, highlighting of the FoldColumn is not respected. CursorLineNr highlights are applied.

The expression you pulled out from that comment is not accurate.

In this expression vim.o.statuscolumn = '%=%l%s%{foldlevel(v:lnum) > foldlevel(v:lnum - 1) ? (foldclosed(v:lnum) == -1 ? "โ–ผ" : "โต") : " " }', the fold column item (i.e., %C) is not specified, and instead it simulates the fold signs by the last part %{...}. That's why FoldColumn highlight group has no effect. If you set it normally like vim.o.statuscolumn = '%=%l%s%C, you will see the fold column is highlighted as expected.

One workaround is using # to set the highlight group as what statusline does.
lua vim.o.statuscolumn = '%=%l%s%#FoldColumn#%{foldlevel(v:lnum) > foldlevel(v:lnum - 1) ? (foldclosed(v:lnum) == -1 ? "โ–ผ" : "โต") : " " }%*'

I tweaked the last one to use the same characters as #4 (comment) , and it fight too tight without any trailing space:

vim.o.statuscolumn = '%=%l%s%#FoldColumn#%{foldlevel(v:lnum) > foldlevel(v:lnum - 1) ? (foldclosed(v:lnum) == -1 ? "๏‘ผ " : "๏‘  ") : "  " }%*'

CleanShot 2023-01-10 at 16 24 18@2x

@technicalpickles You could insert any number of spaces you want between any two items.

Thanks @rockyzhang24! To me it seems that with statuscolumn it's possible to replicate the appearance of the foldcolumn as seen in the demo, and then some. Unfortunately statuscolumn also messes up pretty much every other plugin because it gets drawn where there didn't use to be any line numbers ๐Ÿ˜… But such is life when running the nightly builds. And the good news is that this issue can probably be closed when 0.9 is released.

We can use some fold indication as we already have foldcolumn taking our space (based on #4 (comment)):

vim.o.statuscolumn = '%s%=%l %#FoldColumn#%{'
  .. 'foldlevel(v:lnum) > foldlevel(v:lnum - 1)'
    .. '? foldclosed(v:lnum) == -1'
      .. '? "-"'
      .. ': "+"'
    .. ': foldlevel(v:lnum) == 0'
      .. '? " "'
      .. ': "ยท"'
..'} '

- - open, + - closed, ยท - fold body, - no fold. Adjust to your needs.

image

NOTE: I'm not using nvim-ufo.

I was able to figure out a way to not show line numbers when they've been turned off for a buffer:

CleanShot 2023-01-12 at 11 13 26

vim.o.statuscolumn = '%= '
  .. '%s' -- sign column FIXME: figure out how to put on the other side without having to do a lot of shifting
  .. '%{%' -- evaluate this, and then evaluate what it returns
    .. '&number ?'
      .. '(v:relnum ?'
	    .. 'printf("%"..len(line("$")).."s", v:relnum)' -- when showing relative numbers, make sure to pad so things don't shift as you move the cursor
      .. ':'
		.. 'v:lnum'
      .. ')'
	.. ':'
      .. '""'
	.. ' ' -- space between lines and fold
  .. '%}'
  .. '%= '
  .. '%#FoldColumn#' -- highlight group for fold
  .. '%{' -- expression for showing fold expand/colapse
    .. 'foldlevel(v:lnum) > foldlevel(v:lnum - 1)' -- any folds?
      .. '? (foldclosed(v:lnum) == -1' -- currently open?
        .. '? "๏‘ผ"' -- point down
        .. ':  "๏‘ "' -- point to right
  	.. ')'
  	.. ': " "' -- blank for no fold, or inside fold
  .. '}'
  .. '%= ' -- spacing between end of column and start of text

The only issue I have right now is about the signcolumn, where it can shift around a bit especially if there's multiple diagnostics on one line but that might be more configuration in diagnostics/signcolumn.

Seems 'statuscolumn' has been abused. It should be used for arranging items, not introducing complicated logics which may bring extra performance overhead. Mimicking a foldcolumn looking by an expression instead of the real item %C is not a good idea. Because that is not a real foldcolumn, some features provided by ufo become unavailable (e.g., the click feature). We should have a choice to config what should be shown on the foldcolumn (like this closed PR neovim/neovim#17446) and then use %C directly in 'statuscolumn'.

https://user-images.githubusercontent.com/17562139/212465689-fbc3e667-914d-4ea3-9969-83d949f0c594.mp4
The left pane is using statuscolumn and the right pane hack Neovim by changing source code.

The perf is not an issue. But need a module with hundreds of LOC , simple expr is buggy.
TBH, statuscolumn is unproductive and unconsidered, there are some issues. However, I'm not interested in it. Just telling guys ufo can finish this feature with statuscolumn .

@kevinhwang91 not sure what you meant with the last comment.

But need a module with hundreds of LOC , simple expr is buggy.

A module with hundreds lines of code? What, where?

TBH, statuscolumn is unproductive and unconsidered, there are some issues. However, I'm not interested in it.

  • Unproductive
    • How come?
  • Unconsidered
    • By whom?
  • There are some issues
    • True. That is somewhat expected from a new feature in a nightly build.
  • I'm not interested in it
    • Again, not sure what you mean with this

If you meant to say that emulating fold column with status column is a dirty hack, you're absolutely right. There really should be a way to configure the fold column appearance separately and just use statuscolumn as a format string for status column components instead of evaluating complex expressions. But before we get that, statuscolumn hacks can be used to simulate fold column without having to use a self compiled fork of neovim.

Sorry if I come out as aggressive or confrontational, that's absolutely not my intent. Just trying to figure out what you meant by that last comment.

@okuuva: If you didn't notice @kevinhwang91 is the owner of this repo, so I think he is talking about lack of plans for implementing statuscolumn hacks in nvim-ufo, as he finds it unproductive.

I believe we need a better solution for configuring it in neovim itself, but we can get pretty decent output using those "hacks" for now :P

@okuuva

A module with hundreds lines of code? What, where?

Local, don't want to open it now, I just give statuscolumn a try to make it work perfectly with ufo.

You should think about why statuscolumn didn't merge into Vim and how to get better perf for this opt, so you can understand why I say it's unproductive and unconsidered. I'm not interested in the issue about statuscolumn, I just make sure ufo is fantastic and keep the users away from trouble.

If statuscolumn will not be changed, I just give an expr API for VSCode like fold column, user doesn't need to write any module and just invoke this API will work perfectly. If statuscolumn becomes easy to use and gets high perf, fold expr should write by users instead of ufo.

@EtiamNullam

If you didn't notice @kevinhwang91 is the owner of this repo, so I think he is talking about lack of plans for implementing statuscolumn hacks in nvim-ufo, as he finds it unproductive.

I did, I just asked to clarify things for myself since I don't want to assume anything.

@kevinhwang91

Local, don't want to open it now, I just give statuscolumn a try to make it work perfectly with ufo.

Ok, got it now. Thank you for your awesome work ๐Ÿ™๐Ÿผ

One thing I've noticed is using the foldlevel of the current line and the previous line is not sufficient when there are 2 different folds (one ending and one immediately starting) of the same level it is unable to tell that the previous fold has finished. The original image shared in this issue is a good example of several level 2 folds in a row.

This makes the statuscolumn extremely insufficient at identifying folds without the addition of new functions

Racle commented

luukvbaal/statuscol.nvim#3

One of the easiest solutions.

Here's quick config which works for me:

    -- packer
    use {
      "kevinhwang91/nvim-ufo",
      requires = {
        "kevinhwang91/promise-async",
        {
          "luukvbaal/statuscol.nvim",
          config = function()
            local builtin = require("statuscol.builtin")
            require("statuscol").setup(
              {
                relculright = true,
                segments = {
                  {text = {builtin.foldfunc}, click = "v:lua.ScFa"},
                  {text = {"%s"}, click = "v:lua.ScSa"},
                  {text = {builtin.lnumfunc, " "}, click = "v:lua.ScLa"}
                }
              }
            )
          end

        }
      }
    }

and

vim.o.foldcolumn = "1" -- '0' is not bad
vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value
vim.o.foldlevelstart = 99
vim.o.foldenable = true
vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]

-- these are "extra", change them as you like
vim.keymap.set("n", "zR", require("ufo").openAllFolds)
vim.keymap.set("n", "zM", require("ufo").closeAllFolds)

-- Option 3: treesitter as a main provider instead
-- Only depend on `nvim-treesitter/queries/filetype/folds.scm`,
-- performance and stability are better than `foldmethod=nvim_treesitter#foldexpr()`
require("ufo").setup(
  {
    provider_selector = function(bufnr, filetype, buftype)
      return {"treesitter", "indent"}
    end
  }
)

Hi, how do I enable the vertical indentation/folding level indicators?

@rsdubtso Put set foldcolumn=1 in your nvim config. For lua, use vim.o.foldcolumn = '1' instead. For more details, see :h foldcolumn.

If this is not what you need, may I ask what you mean by vertical indentation/folding level indicator? Can you attach a pic please?

Thanks! Sorry, I should have been more clear, I mean the vertical indicators inside the text, like on this picture:
image

Racle commented

@rsdubtso I've been using indent-blankline.nvim with folliwing config:

require("indent_blankline").setup {
  char = "โ–",
  buftype_exclude = {"terminal"},
  show_trailing_blankline_indent = false,
  show_current_context = true,
  filetype_exclude = {"help", "terminal"},
  -- default : {'class', 'function', 'method'}
  context_patterns = {
    "class",
    "function",
    "method",
    "^if",
    "^while",
    "^for",
    "^object",
    "^table",
    "^type",
    "^import",
    "block",
    "arguments"
  }
  -- disabled now for performance hit.
  -- use_treesitter = true
}

@rsdubtso That's implemented by other plugins, not nvim-ufo. Please check indentLine, or indent-blankline.

D'oh! Thanks a lot!. Hope this discussion is at least somewhat useful for future readers...

neovim v0.9.0 src/nvim/screen.c --> src/nvim/drawline.c.

About line 421.

 418   for (i = 0; i < MIN(fdc, level); i++) {
 419     if (foldinfo.fi_lnum == lnum
 420         && first_level + i >= foldinfo.fi_low_level) {
 421       symbol = wp->w_p_fcs_chars.foldopen;
 422     } else if (first_level == 1) {
 423       symbol = wp->w_p_fcs_chars.foldsep;
 424     } else if (first_level + i <= 9) {
 425       symbol = '0' + first_level + i;
 426     } else {
 427       symbol = '>';
 428     }

@kevinhwang91 Now that Neovim 0.9.0 is out, what is the right way to enable this look?

@pedropombeiro Now the plugin statuscol.nvim is stable enough and is worth a trying. The alternative approach is to change the code in screen.c (that was refactored and renamed to drawline.c) directly and build neovim by yourself.

Here is my entire UFO + Folding preview config, just in case someone needs this.

  1. Setup folding option
-- UFO folding
vim.o.foldcolumn = "1" -- '0' is not bad
vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value
vim.o.foldlevelstart = 99
vim.o.foldenable = true
vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]
  1. Install the plugin with lazy.nvim
return {
  -- UFO folding
  {
    "kevinhwang91/nvim-ufo",
    dependencies = {
      "kevinhwang91/promise-async",
      {
        "luukvbaal/statuscol.nvim",
        config = function()
          local builtin = require("statuscol.builtin")
          require("statuscol").setup({
            relculright = true,
            segments = {
              { text = { builtin.foldfunc }, click = "v:lua.ScFa" },
              { text = { "%s" }, click = "v:lua.ScSa" },
              { text = { builtin.lnumfunc, " " }, click = "v:lua.ScLa" },
            },
          })
        end,
      },
    },
    event = "BufReadPost",
    opts = {
      provider_selector = function()
        return { "treesitter", "indent" }
      end,
    },

    init = function()
      vim.keymap.set("n", "zR", function()
        require("ufo").openAllFolds()
      end)
      vim.keymap.set("n", "zM", function()
        require("ufo").closeAllFolds()
      end)
    end,
  },
  -- Folding preview, by default h and l keys are used.
  -- On first press of h key, when cursor is on a closed fold, the preview will be shown.
  -- On second press the preview will be closed and fold will be opened.
  -- When preview is opened, the l key will close it and open fold. In all other cases these keys will work as usual.
  { "anuvyklack/fold-preview.nvim", dependencies = "anuvyklack/keymap-amend.nvim", config = true },
}

Demo:
https://gyazo.com/f5d5019313deed7c01faed43aa6e064f.gif

Let me join the party and share my config with one small extra "feature" of displaying the number of hidden rows near the colorcolumn or window edge (whichever is smaller).

return {
  "kevinhwang91/nvim-ufo",
  dependencies = "kevinhwang91/promise-async",
  event = "VeryLazy",
  opts = {
    -- INFO: Uncomment to use treeitter as fold provider, otherwise nvim lsp is used
    -- provider_selector = function(bufnr, filetype, buftype)
    --   return { "treesitter", "indent" }
    -- end,
    open_fold_hl_timeout = 400,
    close_fold_kinds = { "imports", "comment" },
    preview = {
      win_config = {
        border = { "", "โ”€", "", "", "", "โ”€", "", "" },
        -- winhighlight = "Normal:Folded",
        winblend = 0,
      },
      mappings = {
        scrollU = "<C-u>",
        scrollD = "<C-d>",
        jumpTop = "[",
        jumpBot = "]",
      },
    },
  },
  init = function()
    vim.o.fillchars = [[eob: ,fold: ,foldopen:๏‘ผ,foldsep: ,foldclose:๏‘ ]]
    vim.o.foldcolumn = "1" -- '0' is not bad
    vim.o.foldlevel = 99 -- Using ufo provider need a large value, feel free to decrease the value
    vim.o.foldlevelstart = 99
    vim.o.foldenable = true
  end,
  config = function(_, opts)
    local handler = function(virtText, lnum, endLnum, width, truncate)
      local newVirtText = {}
      local totalLines = vim.api.nvim_buf_line_count(0)
      local foldedLines = endLnum - lnum
      local suffix = (" ๏• %d %d%%"):format(foldedLines, foldedLines / totalLines * 100)
      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
      local rAlignAppndx =
        math.max(math.min(vim.opt.textwidth["_value"], width - 1) - curWidth - sufWidth, 0)
      suffix = (" "):rep(rAlignAppndx) .. suffix
      table.insert(newVirtText, { suffix, "MoreMsg" })
      return newVirtText
    end
    opts["fold_virt_text_handler"] = handler
    require("ufo").setup(opts)
    vim.keymap.set("n", "zR", require("ufo").openAllFolds)
    vim.keymap.set("n", "zM", require("ufo").closeAllFolds)
    vim.keymap.set("n", "zr", require("ufo").openFoldsExceptKinds)
    vim.keymap.set("n", "K", function()
      local winid = require("ufo").peekFoldedLinesUnderCursor()
      if not winid then
        -- vim.lsp.buf.hover()
        vim.cmd [[ Lspsaga hover_doc ]]
      end
    end)
  end,
}

Examples:
2023-04-19_145514
2023-04-19_145601

@awerebea thats just amazing.

However the arrow and percentage for me appear where the code ends not and the end of the window like yours. How did you modify the 'hidden' data to be at the end of the window?

Hey @sudoCompetence! Glad you like it.

How did you modify... ?

Well, I just took the example from Customize fold text and modified it to take into account the textwidth property, so in my implementation, the position actually depends on texdtwidth but not on colorcolumn, sorry for the confusion.

This is the diff of the changes made:
image

Idk if it's just me, but on nightly I had to change my statuscol config to include disable_ft = { 'trouble' }, else Neovim crashes with a 134 exit code. Curious to know if anyone else experienced something similar.

@awerebea thats just amazing.

However the arrow and percentage for me appear where the code ends not and the end of the window like yours. How did you modify the 'hidden' data to be at the end of the window?

Sorry for commenting on this again but also wanted to make it so that the fold was all the way to the right so for those in the future that want this here. You can do it by doing the below:
#4 (comment)

replace this line:

local rAlignAppndx = math.max(math.min(vim.opt.textwidth["_value"], width - 1) - curWidth - sufWidth, 0)

with

local rAlignAppndx = math.max(math.min(vim.api.nvim_win_get_width(0), width - 1) - curWidth - sufWidth, 0)

This will put the fold text as far width-wise as your buffer is

Example:
28cf1c538b6970e74ebc76a3de326c52

Hi @nick22985,
Well, please feel free to change this snippet this way if you prefer this implementation. ๐Ÿ˜‰
But for me personally, my original way looks better.

The proposed change only affects the display in a wide window, but I'm just used to limiting the width of the text in the window (99 characters for the Lua file type in this example). So it doesn't make much sense for me to place the fold text as far in width as the window of my current buffer.

I set the colorcolumn value equal to +1 for clarity in the following screenshots.
wide window:
proposed change
ufo_0
current
ufo_1
tight window:
ufo_2
really long line with fold:
ufo_3

Again, it's just a matter of taste. In my opinion, all these cases are better covered by my current implementation, but it's obviously up to you to decide which way to use for yourself.

Thank you for your participation!

I have this minimal config for nvim-ufo and it looks amazing to me.
Screenshot from 2024-07-20 at 21:55:13

Additional - adding vim.o.foldcolumn = 'auto:9' will remove the annoying random number on foldcolumn and also adjust the foldcolumn size/width accordingly. Just simply add this on your config.

vim.o.foldcolumn = 'auto:9'