First of, very nifty little plugin, it pairs wonderfully with nvim-treesitter-context and they complement each other well~
However I have one small grudge with it at the moment.
I have set my config to display a thin line as my statusline using fillchars, since I prefer using winbar
Here's the config in question, I put it in my plugin spec for coloful-winsep.nvim because I thought that's how it made the most sense, given the nature of said plugin.
---@type LazyPluginSpec
local splitborders = {
"nvim-zh/colorful-winsep.nvim",
event = "WinLeave",
init = function()
-- Make the horizontal split separator be a thin straight line
-- We override whatever has been set in order to make it look nice with this plugin.
-- Did you set fillchars somewhere else but they kept getting overridden and you have been looking for minutes,
-- hours, days, years even? You have come to the right place and I'm sorry.
vim.opt.fillchars:append { stl = "─", stlnc = "─"}
-- Couldn't find a way to do this in "pure lua"
vim.cmd [[highlight! link StatusLine WinSeparator]]
end,
config = true,
}
return splitborders
Problem is: Using fillchars=...stl:─,stlnc:─ with nvim-navic ends up being very ugly and hardly legible.
To fix this issue, I've made it so my hook to attach nvim-navic to a buffer overrides these values again with a whitespace if the LSP supports documentSymbolProvider and thus navic gets required and attached... But!
I would like to keep the thin line after the displayed location so I also made the hook build a """simple""" status line with 1. location, 2. a repeated sequence of whatever the fillchar originally was:
---@type table<string, LspHookFunction>
local hooks = {
format_on_save = function(client, buffer)
if client.supports_method "textDocument/formatting" then
vim.api.nvim_create_autocmd("BufWritePre", {
group = vim.api.nvim_create_augroup("FormatOnSave", {}),
buffer = buffer,
callback = function()
-- TODO: Find some better way than using _G.
-- Sadly, I couldn't get it to work yet.
-- Probably some module with a local state variable + a getter/setter pair ?
--
-- selene: allow(global_usage)
_G["PLF_SHOULD_OPEN_PICKER"] = false
require("plf").format {
async = false,
}
-- selene: allow(global_usage)
_G["PLF_SHOULD_OPEN_PICKER"] = true
end,
})
end
end,
statusline_context = function(client, buffer)
if client.server_capabilities.documentSymbolProvider then
require("nvim-navic").attach(client, buffer)
local location = "v:lua.require'nvim-navic'.get_location()"
local locationlen = string.format("len(%s)", location)
local fillchars = vim.opt.fillchars:get()
local filling = fillchars.stl or fillchars.stlnc or "─"
local fillerlen = string.format("%d - %s", vim.o.columns - 1, locationlen)
local filler = string.format("repeat('%s', %s)", filling, fillerlen)
local status = "%#Title#%{%" .. location .. "%}"
.. " %#StatusLine#%{"
.. filler
.. "}"
vim.opt.fillchars:remove { "stl", "stlnc" }
vim.o.statusline = status
end
end,
}
---@type LspHookFunction
local function default_on_attach(client, buffer)
vim
.iter(pairs(hooks))
:each(function(_, on_attach) on_attach(client, buffer) end)
end
return default_on_attach
Great, that looks fantastic, I am very pleased! Here's the catch, though: VimScript len() or lua # operator both return the number of bytes in the string, and it doesn't correspond to the actual number of columns the string takes: it's bigger.
For instance, when nvim-navic says get_fillchar, doing :lua vim.print(#require'nvim-navic'.get_location()) or echo len(v:lua.require'nvim-navic'.get_location()) respond with 17, whereas the actual column width is in fact 14.
The result is this:
The bar gets shrunk noticeably.
I think it can make integrations more easy, and surely be a welcome feature for all hackers like me out there who like to style their UI manually.
Thank you for your time (and the plugin) ! :heart:
First of, very nifty little plugin, it pairs wonderfully with
nvim-treesitter-context
and they complement each other well~However I have one small grudge with it at the moment. I have set my config to display a thin line as my
statusline
using fillchars, since I prefer usingwinbar
Here's the config in question, I put it in my plugin spec forcoloful-winsep.nvim
because I thought that's how it made the most sense, given the nature of said plugin.Problem is: Using
fillchars=...stl:─,stlnc:─
withnvim-navic
ends up being very ugly and hardly legible.To fix this issue, I've made it so my hook to attach
nvim-navic
to a buffer overrides these values again with a whitespace if the LSP supportsdocumentSymbolProvider
and thusnavic
gets required and attached... But! I would like to keep the thin line after the displayed location so I also made the hook build a """simple""" status line with 1. location, 2. a repeated sequence of whatever the fillchar originally was:Great, that looks fantastic, I am very pleased! Here's the catch, though: VimScript
len()
or lua#
operator both return the number of bytes in the string, and it doesn't correspond to the actual number of columns the string takes: it's bigger. For instance, whennvim-navic
says get_fillchar
, doing:lua vim.print(#require'nvim-navic'.get_location())
orecho len(v:lua.require'nvim-navic'.get_location())
respond with 17, whereas the actual column width is in fact 14.The result is this: The bar gets shrunk noticeably.
It would be nice if we could do something like
I think it can make integrations more easy, and surely be a welcome feature for all hackers like me out there who like to style their UI manually. Thank you for your time (and the plugin) ! :heart: