kevinhwang91 / nvim-ufo

Not UFO in the sky, but an ultra fold in Neovim.
BSD 3-Clause "New" or "Revised" License
2.34k stars 49 forks source link

Customize folding using different source #16

Closed ray-x closed 2 years ago

ray-x commented 2 years ago

Feature description

Would be great to provide an API and allow the binding of different folding expressions. One scenario is a very large (auto-generated) code (100k ~ 200k LOC per file) I am using.

Describe the solution you'd like

e.g.

if filetype = 'go' then
  if  filesize < 6M then
   api.nvim_win_set_option(current_window, 'foldexpr', 'ufo#foldexpr()')
  elseif  filesize < 10M then
   api.nvim_win_set_option(current_window, 'foldexpr', 'tsfold#foldexpr()')
  else
   api.nvim_win_set_option(current_window, 'foldexpr', 'tsfold#foldexpr()')
  end
end
if filetype = 'lua' then
  api.nvim_win_set_option(current_window, 'foldexpr', 'treesitter#foldexpr()')
end

Additional context

No response

kevinhwang91 commented 2 years ago

keep your other fold expr and use provider_selector to disable ufo when you want.

https://github.com/kevinhwang91/nvim-ufo/blob/a11c899ae12cc66b2d7f1c7bc99c506a5db113eb/doc/example.lua#L3-L18

ray-x commented 2 years ago

well, I find the disable is not really working for me

  -- only enable for following filetypes
  local whitelist = {
    ["gotmpl"] = "indent",
    ["python"] = "lsp",
    ["html"] = "indent",
  }
  require("ufo").setup({
    fold_virt_text_handler = handler,
    provider_selector = function(bufnr, filetype)
      if whitelist[filetype] then
        return whitelist[filetype]
      end
      return ""  -- everything not listed in whitelist should be disabled
    end,
  })

When I edit lua code, ufo still enabled.

kevinhwang91 commented 2 years ago

can't reproduce. Run UfoInspect, will output:

Buffer: 19
Fold Status: start
Main provider: 
Selected provider: nil
ray-x commented 2 years ago
image

From the screen shot, I think ufo is disabled in config but not disable when I press za/zm

kevinhwang91 commented 2 years ago

If selected provider is set after the foldingRanges come back, make sure the folds are applied by ufo. No idea why your remap za/zm will make ufo request folding. Make sure that your foldmethod value is expected. The window opt will be inherent as unexpected. You can enable debug mode by UFO_LOG=debug nvim and tail log tail -f ~/.cache/nvim/ufo.log

ray-x commented 2 years ago

logs:

[22-06-20 19:07:20] [DEBUG] fold.lua:137 : attach bufnr: 1
[22-06-20 19:07:20] [DEBUG] fold.lua:137 : attach bufnr: 1
[22-06-20 19:07:20] [DEBUG] fold.lua:137 : attach bufnr: 2
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:20] [DEBUG] fold.lua:137 : attach bufnr: 5
[22-06-20 19:07:20] [DEBUG] fold.lua:137 : attach bufnr: 2
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:20] [DEBUG] decorator.lua:151 : folded: {}
...
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:169 : need add/update folded: 84
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:26] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:27] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: {}
[22-06-20 19:07:28] [DEBUG] decorator.lua:151 : folded: { 84 }

And also

image
kevinhwang91 commented 2 years ago

Do you mean disable virtual text? I can't see any data returned by providers from the log and your image.

kevinhwang91 commented 2 years ago

fold.lua:81 : requestFoldingRange({ "lsp", "indent" }, 1) has elapsed: 136ms like this.

ray-x commented 2 years ago

The setup : fold_virt_text_handler = handler, But if ufo is not enabled, will virtual_text enable?

kevinhwang91 commented 2 years ago

no selector ufo still enables virtual text. need detach. use UfoDetach and reset your foldtext option. If a buffer is detached, ufo does nothing for the buffer (only for the detached buffer). Disable will disable all features.

ray-x commented 2 years ago

ok, that make sense.