nanozuki / tabby.nvim

A declarative, highly configurable, and neovim style tabline plugin. Use your nvim tabs as a workspace multiplexer!
MIT License
570 stars 20 forks source link

File icon #35

Closed EpsilonKu closed 1 year ago

EpsilonKu commented 2 years ago

How can I config to show file icon on tabs.

nanozuki commented 2 years ago

For now, you can use nvim-web-devicons to add file icon.

and you should get filename and extension from tabid. Overall, the code will looks like:

local focus_win = vim.api.nvim_tabpage_get_win(tabid)
local filename = require("tabby.filename").tail(focus_win)
local extension =   local fname = vim.fn.fnamemodify(name, ':e')
local icon = require'nvim-web-devicons'.get_icon(filename, extension)
nanozuki commented 2 years ago

A little survey: Is it helpful to add a helper function to get the file icon in tabby.nvim?

EpsilonKu commented 2 years ago

Yeah, will be good.

Maddin-619 commented 2 years ago

Even more important is the buf modified sign. What do u thing about this:

local function win_label(winid, top)
  local icon = top and '' or ''
  local fname = require("tabby.filename").tail(winid)
  local extension = vim.fn.fnamemodify(fname, ':e')
  local fileIcon = require'nvim-web-devicons'.get_icon(filename, extension)
  local buid = vim.api.nvim_win_get_buf(winid)
  local is_modified = vim.api.nvim_buf_get_option(buid, 'modified')
  local modifiedIcon = is_modified and '' or ''
  return string.format(' %s  %s %s %s', icon, fileIcon, filename.unique(winid), modifiedIcon)
end
nanozuki commented 2 years ago

I think this is workable. I plan to improve the configuration experience, use less code to configure these things. I will update in this issue if that is completed.

EpsilonKu commented 2 years ago

Let me share my way.

local function buffer_render (bufid, is_current)
    local buftype = vim.bo[bufid].buftype
    local modified = vim.bo[bufid].modified
    local modified_icon = modified and '' or ' '
    local path = vim.fn.bufname(bufid);
    local extension = vim.fn.fnamemodify(path, ":e")
    local filename = vim.fn.fnamemodify(path, ":t")
    local fileicon = require'nvim-web-devicons'.get_icon (filename, extension, { default = true})
    local buf_name = ' ' .. fileicon .. ' ' .. filename ..' ' .. modified_icon .. ' '
    local buf_color = is_current and active_tab_hl or inactive_tab_hl
    return {
        type = 'text',
        text = {
            string.format(' %s ', buf_name) ,
                hl = buf_color,
            }
    }
end
local components = function()
    local cur_bufid = vim.api.nvim_get_current_buf()
    for _, bufid in ipairs(vim.api.nvim_list_bufs()) do
        if vim.api.nvim_buf_is_valid(bufid) and vim.bo[bufid].buflisted then
            local is_current = false;
            if bufid == cur_bufid then
                is_current = true
            end
            local buf_render = buffer_render (bufid,is_current)
            table.insert(coms, buf_render)
            table.insert(coms,
                {
                    type = 'text',
                    text = {
                        ' ',
                        hl = 'TabLineFill'
                    }
                }
            )
        end
    end
        --- etc
end
nanozuki commented 1 year ago

I rewrite the config API in case to easily add helper functions. For example in setup, you can add a file icon by win object:

line.wins_in_tab(line.api.get_current_tab()).foreach(function(win)
  return {
    line.sep('', theme.win, theme.fill),
    win.is_current() and '' or '',
    win.file_icon(),
    win.buf_name(),
    line.sep('', theme.win, theme.fill),
    hl = theme.win,
    margin = ' ',
  }
end),

Detail: https://github.com/nanozuki/tabby.nvim#win