1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
local M = {}
M.title = function(bufnr)
local file = vim.fn.bufname(bufnr)
local buftype = vim.fn.getbufvar(bufnr, '&buftype')
local filetype = vim.fn.getbufvar(bufnr, '&filetype')
if buftype == 'help' then
return 'help:' .. vim.fn.fnamemodify(file, ':t:r')
elseif buftype == 'quickfix' then
return 'quickfix'
elseif filetype == 'TelescopePrompt' then
return 'Telescope'
elseif filetype == 'git' then
return 'Git'
elseif filetype == 'fugitive' then
return 'Fugitive'
elseif filetype == 'NvimTree' then
return 'NvimTree'
elseif filetype == 'oil' then
return 'Oil'
elseif file:sub(file:len()-2, file:len()) == 'FZF' then
return 'FZF'
elseif buftype == 'terminal' then
local _, mtch = string.match(file, "term:(.*):(%a+)")
return mtch ~= nil and mtch or vim.fn.fnamemodify(vim.env.SHELL, ':t')
elseif file == '' then
return '[No Name]'
else
return vim.fn.pathshorten(vim.fn.fnamemodify(file, ':p:~:t'))
end
end
M.modified = function(bufnr)
return vim.fn.getbufvar(bufnr, '&modified') == 1 and '[+] ' or ''
end
M.windowCount = function(index)
local nwins = vim.fn.tabpagewinnr(index, '$')
return nwins > 1 and '(' .. nwins .. ') ' or ''
end
M.devicon = function(bufnr, isSelected)
local icon, devhl
local file = vim.fn.bufname(bufnr)
local buftype = vim.fn.getbufvar(bufnr, '&buftype')
local filetype = vim.fn.getbufvar(bufnr, '&filetype')
local devicons = require'nvim-web-devicons'
if filetype == 'TelescopePrompt' then
icon, devhl = devicons.get_icon('telescope')
elseif filetype == 'fugitive' then
icon, devhl = devicons.get_icon('git')
elseif filetype == 'vimwiki' then
icon, devhl = devicons.get_icon('markdown')
elseif buftype == 'terminal' then
icon, devhl = devicons.get_icon('zsh')
else
icon, devhl = devicons.get_icon(file, vim.fn.expand('#'..bufnr..':e'))
end
if icon then
local h = require'luatab.highlight'
local fg = h.extract_highlight_colors(devhl, 'fg')
local bg = h.extract_highlight_colors('TabLineSel', 'bg')
local hl = h.create_component_highlight_group({bg = bg, fg = fg}, devhl)
local selectedHlStart = (isSelected and hl) and '%#'..hl..'#' or ''
local selectedHlEnd = isSelected and '%#TabLineSel#' or ''
return selectedHlStart .. icon .. selectedHlEnd .. ' '
end
return ''
end
M.separator = function(index)
return (index < vim.fn.tabpagenr('$') and '%#TabLine#|' or '')
end
M.cell = function(index)
local isSelected = vim.fn.tabpagenr() == index
local buflist = vim.fn.tabpagebuflist(index)
local winnr = vim.fn.tabpagewinnr(index)
local bufnr = buflist[winnr]
local hl = (isSelected and '%#TabLineSel#' or '%#TabLine#')
return hl .. '%' .. index .. 'T' .. ' ' ..
M.windowCount(index) ..
M.title(bufnr) .. ' ' ..
M.modified(bufnr) ..
M.devicon(bufnr, isSelected) .. '%T' ..
M.separator(index)
end
M.tabline = function()
local line = ''
for i = 1, vim.fn.tabpagenr('$'), 1 do
line = line .. M.cell(i)
end
line = line .. '%#TabLineFill#%='
if vim.fn.tabpagenr('$') > 1 then
line = line .. '%#TabLine#%999XX'
end
return line
end
local setup = function(opts)
opts = opts or {}
if opts.title then M.title = opts.title end
if opts.modified then M.modified = opts.modified end
if opts.windowCount then M.windowCount = opts.windowCount end
if opts.devicon then M.devicon = opts.devicon end
if opts.separator then M.separator = opts.separator end
if opts.cell then M.cell = opts.cell end
if opts.tabline then M.tabline = opts.tabline end
vim.opt.tabline = '%!v:lua.require\'luatab\'.helpers.tabline()'
end
local warning = function()
error [[
Hi, I've updated luatab.nvim to allow some proper configuration. As a result, I need to make a breaking change to the config. Apologies for the inconvinence.
If you had:
vim.o.tabline = '%!v:lua.require\'luatab\'.tabline()'
please replace it with
require('luatab').setup({})
]]
end
return {
helpers = M,
setup = setup,
tabline = warning,
}
|