feat(providers): Support independent configs for each provider to handle

Closes #58
This commit is contained in:
hedy
2024-03-16 08:12:50 +08:00
parent 8c6b11e4c2
commit b64c0c66d4
7 changed files with 39 additions and 6 deletions

View File

@@ -93,6 +93,10 @@
the file and jumping elsewhere. the file and jumping elsewhere.
- If auto-preview is enabled the preview window will automatically resize and - If auto-preview is enabled the preview window will automatically resize and
reposition reposition
- Each provider can now handle its own configuration via the
`providers["provider-name"]` table. The first provider to make use of this will
be the markdown provider, which looks at `providers.markdown.filetypes` for
the list of filetypes to be supported for markdown outline symbols.
### Fixes ### Fixes

View File

@@ -359,10 +359,15 @@ Pass a table to the setup call with your configuration options.
providers = { providers = {
priority = { 'lsp', 'coc', 'markdown', 'norg' }, priority = { 'lsp', 'coc', 'markdown', 'norg' },
-- Configuration for each provider (3rd party providers are supported)
lsp = { lsp = {
-- Lsp client names to ignore -- Lsp client names to ignore
blacklist_clients = {}, blacklist_clients = {},
}, },
markdown = {
-- List of supported ft's to use the markdown provider
filetypes = {'markdown'},
},
}, },
symbols = { symbols = {
@@ -494,10 +499,14 @@ path, for use as a provider.
External providers from plugins should define the provider module at External providers from plugins should define the provider module at
`lua/outline/providers/<name>.lua` with these functions: `lua/outline/providers/<name>.lua` with these functions:
- `supports_buffer(bufnr: integer) -> boolean` - `supports_buffer(bufnr: integer, config: table?) -> boolean`
This function could check buffer filetype, existence of required modules, etc. This function could check buffer filetype, existence of required modules, etc.
The config table comes from the user's configuration in the
`providers['provider-name']` table where `provider-name` is the
`require('outline.providers.<name>').name`.
- `get_status() -> string[]` (optional) - `get_status() -> string[]` (optional)
Return a list of lines to be included in `:OutlineStatus` as supplementary Return a list of lines to be included in `:OutlineStatus` as supplementary

View File

@@ -94,6 +94,9 @@ M.defaults = {
lsp = { lsp = {
blacklist_clients = {}, blacklist_clients = {},
}, },
markdown = {
filetypes = { 'markdown' },
},
}, },
symbols = { symbols = {
---@type outline.FilterConfig? ---@type outline.FilterConfig?
@@ -325,6 +328,8 @@ function M.resolve_config()
map[client] = true map[client] = true
end end
M.o.providers.lsp.blacklist_clients = map M.o.providers.lsp.blacklist_clients = map
----- LSP PROVIDER CONFIG NAME -----
M.o.providers['nvim-lsp'] = M.o.providers.lsp
end end
---Ensure l is either table, false, or nil. If not, print warning using given ---Ensure l is either table, false, or nil. If not, print warning using given

View File

@@ -3,6 +3,8 @@ local import_prefix = 'outline/providers/'
---@return outline.Provider?, table? ---@return outline.Provider?, table?
function M.find_provider() function M.find_provider()
local configs = require('outline.config').o.providers
if not M.providers then if not M.providers then
M.providers = vim.tbl_map(function(p) M.providers = vim.tbl_map(function(p)
return import_prefix .. p return import_prefix .. p
@@ -11,7 +13,7 @@ function M.find_provider()
for _, path in ipairs(M.providers) do for _, path in ipairs(M.providers) do
local provider = require(path) local provider = require(path)
local ok, info = provider.supports_buffer(0) local ok, info = provider.supports_buffer(0, configs[provider.name])
if ok then if ok then
return provider, info return provider, info
end end

View File

@@ -15,9 +15,19 @@ local M = {
name = 'markdown', name = 'markdown',
} }
---@param bufnr integer
---@param config table?
---@return boolean ft_is_markdown ---@return boolean ft_is_markdown
function M.supports_buffer(bufnr) function M.supports_buffer(bufnr, config)
return vim.api.nvim_buf_get_option(bufnr, 'ft') == 'markdown' local ft = vim.api.nvim_buf_get_option(bufnr, 'ft')
if config and config.filetypes then
for _, ft_check in ipairs(config.filetypes) do
if ft_check == ft then
return true
end
end
end
return ft == "markdown"
end end
-- Parses markdown files and returns a table of SymbolInformation[] which is -- Parses markdown files and returns a table of SymbolInformation[] which is

View File

@@ -18,7 +18,9 @@ local M = {
]], ]],
} }
function M.supports_buffer(bufnr) ---@param bufnr integer
---@param config table?
function M.supports_buffer(bufnr, config)
if vim.api.nvim_buf_get_option(bufnr, 'ft') ~= 'norg' then if vim.api.nvim_buf_get_option(bufnr, 'ft') ~= 'norg' then
return false return false
end end

View File

@@ -63,8 +63,9 @@
---@class outline.Provider ---@class outline.Provider
---@field name string ---@field name string
---@field config table?
---@field get_status? fun(info:table?):string[] ---@field get_status? fun(info:table?):string[]
---@field supports_buffer fun(bufnr:integer):boolean,table? ---@field supports_buffer fun(bufnr:integer, config:table?):boolean,table?
---@field request_symbols fun(on_symbols:fun(symbols?:outline.ProviderSymbol[], opts:table?, provider_info:table?), opts:table?) ---@field request_symbols fun(on_symbols:fun(symbols?:outline.ProviderSymbol[], opts:table?, provider_info:table?), opts:table?)
---@field show_hover? fun(sidebar:outline.Sidebar):boolean ---@field show_hover? fun(sidebar:outline.Sidebar):boolean
---@field rename_symbol? fun(sidebar:outline.Sidebar):boolean ---@field rename_symbol? fun(sidebar:outline.Sidebar):boolean