How to handle tab.name() for certain plugins (Overseer / Aerial etc)
Closed this issue · 6 comments
Hi,
I was wondering if there's a way we can set the tab name to vim.bo.filetype
instead of using [No Name]
on certain window like Overseer
or Aerial
for example ?
Please see actually tab name when openning Overseer
:
Actually tabby
config :
require("tabby.tabline").set(function(line)
return {
{
{ " ", hl = { fg = colors.green, bg = colors.none, style = "bold" } },
line.sep(" ", { bg = colors.none }, { bg = colors.none }),
},
line.tabs().foreach(function(tab)
local hl = tab.is_current() and "TabLineSel" or "TabLine"
return {
line.sep("", hl, { bg = colors.none }),
tab.is_current() and "" or "",
tab.name(),
tab.close_btn(""),
line.sep("", hl, { bg = colors.none }),
hl = hl,
margin = " ",
}
end),
line.spacer(),
line.wins_in_tab(line.api.get_current_tab()).foreach(function(win)
return {
line.sep("", "TabLine", { bg = colors.none }),
win.is_current() and " " or " ",
line.sep("", "TabLine", { bg = colors.none }),
hl = { bg = colors.bg_dark, fg = colors.fg },
margin = " ",
}
end),
hl = { bg = colors.none },
}
end)
Actually, I ended up doing something like this :
EDIT : Edited code after some tweaks, ended up with something comfortable for me; but still gave me a headache. Is there any easier solution for this ?
local getTabName = function(tab)
local tabTail = vim.fn.fnamemodify(tab.name(), "%:t")
local tabName = ""
if string.len(tabTail) > 25 then
local fileExt = string.match(tabTail, "[^.]+$")
tabName = string.sub(tabTail, 0, 22 - string.len(fileExt)) .. "..." .. fileExt
end
if string.find(tabTail, "Floating") then
if vim.bo.filetype == "" then
local tail = vim.fn.expand("%:t")
if string.find(tail, "toggleterm") then
local pID = string.gsub(tail, "%d+:", "")
tabName = string.gsub(pID, ";#toggleterm#%d+", "")
end
if string.find(tail, "npm") then
tabName = string.gsub(tail, "%d+:", "")
end
else
tabName = vim.bo.filetype
end
end
if string.find(tab.name(), "%[%No Name]%[%d+%+%]") and string.find(vim.bo.filetype, "Overseer") then
tabName = vim.bo.filetype
end
if tabName == "" then
tabName = tab.name()
end
return tabName
end
But I feel like it's an endless fight. Is there any solution I can achieve this or not really ?
For now, the better way to set it is to add the option line option. You can find windows from tabid. and get the file type from the window ID.
{
tab_name = {
name_fallback = function()
local winid = vim.api.nvim_get_current_tabpage()
local bufid = vim.api.nvim_win_get_buf(winid)
local file_type = vim.api.nvim_buf_get_option(bufid, "filetype")
if file_type == "Overseer" or file_type == "Aerial" then
return file_type
end
return "[NO Name]"
end,
},
}
Welcome to more feedback and discussion.
I plan to refactor the documentation to add more instructions and some cookbooks. That will make this more easy to use.
@nanozuki Thanks for your reply. Unfortunately, the solution you provide leads me to a bug :
E5108: Error executing lua /home/ls-devs/.config/nvim/lua/ls-devs/plugins/ui/tabby.lua:7: Invalid window id: 1
I'm sorry I use a wrong api, the code should be:
{
tab_name = {
name_fallback = function(tabid)
local winid = vim.api.nvim_tabpage_get_win(tabid)
local bufid = vim.api.nvim_win_get_buf(winid)
local file_type = vim.api.nvim_buf_get_option(bufid, "filetype")
if file_type == "Overseer" or file_type == "Aerial" then
return file_type
end
return "[No Name]"
end,
},
}
I'm sorry I use a wrong api, the code should be:
{ tab_name = { name_fallback = function(tabid) local winid = vim.api.nvim_tabpage_get_win(tabid) local bufid = vim.api.nvim_win_get_buf(winid) local file_type = vim.api.nvim_buf_get_option(bufid, "filetype") if file_type == "Overseer" or file_type == "Aerial" then return file_type end return "[No Name]" end, }, }
Can confirm it's working. Thanks for the help !