Initial commit
This commit is contained in:
@@ -0,0 +1,215 @@
|
||||
--[[
|
||||
Copyright 2023 Oscar Wallberg
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
https://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
]]
|
||||
|
||||
local utils = require 'utils'
|
||||
|
||||
local hl_CustomHeader
|
||||
local head_cache
|
||||
--- @param trunc_width number trunctates component when screen width is less then trunc_width
|
||||
--- @param trunc_len number truncates component to trunc_len number of chars
|
||||
--- @param hide_width number hides component when window width is smaller then hide_width
|
||||
--- @param no_ellipsis boolean whether to disable adding '...' at end after truncation
|
||||
--- return function that can format the component accordingly
|
||||
local function trunc(trunc_width, trunc_len, hide_width, no_ellipsis)
|
||||
return function(str)
|
||||
local win_width = vim.fn.winwidth(0)
|
||||
if hide_width and win_width < hide_width then
|
||||
return ''
|
||||
elseif trunc_width and trunc_len and win_width < trunc_width and #str >
|
||||
trunc_len then
|
||||
return str:sub(1, trunc_len) .. (no_ellipsis and '' or '...')
|
||||
end
|
||||
return str
|
||||
end
|
||||
end
|
||||
|
||||
--- @param trunc_len number truncates component to trunc_len number of chars
|
||||
--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation
|
||||
--- return function that can format the component accordingly
|
||||
local function l_trunc(trunc_len, no_ellipsis)
|
||||
return function(str)
|
||||
if #str > trunc_len then
|
||||
if no_ellipsis then
|
||||
return str:sub(#str - trunc_len)
|
||||
else
|
||||
return '...' .. str:sub(#str - trunc_len + 3)
|
||||
end
|
||||
else
|
||||
return str
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--- @param trunc_len number truncates component to trunc_len number of chars
|
||||
--- @param no_ellipsis boolean whether to disable adding '...' at start before truncation
|
||||
--- return function that can format the component accordingly
|
||||
local function r_trunc(trunc_len, no_ellipsis)
|
||||
return function(str)
|
||||
if #str > trunc_len then
|
||||
if no_ellipsis then
|
||||
return str:sub(1, trunc_len)
|
||||
elseif #str < trunc_len then
|
||||
return str
|
||||
else
|
||||
return str:sub(1, trunc_len - 3) ..
|
||||
(no_ellipsis and '' or '...')
|
||||
end
|
||||
end
|
||||
return str
|
||||
end
|
||||
end
|
||||
|
||||
local function short_path(len)
|
||||
return function(str)
|
||||
if #str > len then return vim.fn.pathshorten(str, 1) end
|
||||
return str
|
||||
end
|
||||
end
|
||||
|
||||
local function header()
|
||||
if hl_CustomHeader == nil then
|
||||
local header_hl = require('utils').get_hl('NvimTreeNormal')
|
||||
if header_hl ~= nil then
|
||||
hl_CustomHeader = 'gui=bold guifg=' .. header_hl.foreground ..
|
||||
' guibg=' .. header_hl.background
|
||||
vim.api.nvim_command('hi CustomHeader ' .. hl_CustomHeader)
|
||||
end
|
||||
end
|
||||
-- local header = short_path(40)(vim.fn.getcwd())
|
||||
-- NOTE: Decided not to use this. Probably doesn't work.
|
||||
local gitdir = vim.fn.FugitiveExtractGitDir(vim.fn.getcwd())
|
||||
local text = ''
|
||||
if gitdir == '' then
|
||||
text = vim.fn.fnamemodify(vim.fn.getcwd(), ':~')
|
||||
else
|
||||
text = vim.fn.fnamemodify(gitdir, ':~:h')
|
||||
-- text = vim.fn.fnamemodify(vim.fn.FugitiveWorkTree(), ':~')
|
||||
-- local branch = r_trunc(15, false)(vim.fn.FugitiveHead())
|
||||
local head = vim.fn.FugitiveHead(8, gitdir)
|
||||
if head == '' then
|
||||
if head_cache[gitdir] ~= nil then
|
||||
head = head_cache[gitdir]
|
||||
else
|
||||
local f = io.open(gitdir, 'r')
|
||||
if f then
|
||||
io.input(f)
|
||||
local line = io.read('*l')
|
||||
local head = line:gsub(
|
||||
'ref: /refs/(heads/|remotes/|tags/)', ''
|
||||
)
|
||||
head_cache[gitdir] = head
|
||||
end
|
||||
end
|
||||
end
|
||||
if head ~= '' then text = text .. ' ' .. head end
|
||||
end
|
||||
|
||||
-- return l_trunc(40-2, false)(short_path(40-2)(text))
|
||||
return l_trunc(40 - 2, false)(text)
|
||||
end
|
||||
|
||||
require('bufferline').setup(
|
||||
{
|
||||
options = {
|
||||
mode = 'buffers',
|
||||
numbers = function(ordinal, id, lower, raise) return '' end,
|
||||
close_command = 'bdelete %d', -- can be a string | function, see "Mouse actions"
|
||||
right_mouse_command = 'bdelete %d', -- can be a string | function, see "Mouse actions"
|
||||
left_mouse_command = 'buffer %d', -- can be a string | function, see "Mouse actions"
|
||||
middle_mouse_command = nil, -- can be a string | function, see "Mouse actions"
|
||||
indicator = {
|
||||
icon = '▎', -- this should be omitted if indicator style is not 'icon'
|
||||
style = 'icon'
|
||||
},
|
||||
buffer_close_icon = '',
|
||||
modified_icon = '●',
|
||||
close_icon = '',
|
||||
left_trunc_marker = '',
|
||||
right_trunc_marker = '',
|
||||
--- name_formatter can be used to change the buffer's label in the bufferline.
|
||||
--- Please note some names can/will break the
|
||||
--- bufferline so use this at your discretion knowing that it has
|
||||
--- some limitations that will *NOT* be fixed.
|
||||
name_formatter = function(buf) -- buf contains:
|
||||
-- name | str | the basename of the active file
|
||||
-- path | str | the full path of the active file
|
||||
-- bufnr (buffer only) | int | the number of the active buffer
|
||||
-- buffers (tabs only) | table(int) | the numbers of the buffers in the tab
|
||||
-- tabnr (tabs only) | int | the "handle" of the tab, can be converted to its ordinal number using: `vim.api.nvim_tabpage_get_number(buf.tabnr)`
|
||||
return buf.name
|
||||
end,
|
||||
max_name_length = 18,
|
||||
max_prefix_length = 15, -- prefix used when a buffer is de-duplicated
|
||||
truncate_names = true,
|
||||
tab_size = 18,
|
||||
diagnostics = 'nvim_lsp',
|
||||
diagnostics_update_in_insert = false,
|
||||
diagnostics_indicator = function(count, _, _, _)
|
||||
return '(' .. count .. ')'
|
||||
end,
|
||||
-- NOTE: this will be called a lot so don't do any heavy processing here
|
||||
custom_filter = function(buf, _)
|
||||
local disabled_ft = { 'NvimTree', 'fugitive' }
|
||||
|
||||
if utils.has_value(disabled_ft, vim.bo[buf].filetype) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end,
|
||||
offsets = {
|
||||
{
|
||||
filetype = 'NvimTree',
|
||||
text = 'File Explorer', -- header,
|
||||
text_align = 'center',
|
||||
seperator = true
|
||||
-- padding = 1,
|
||||
-- highlight = "CustomHeader",
|
||||
},
|
||||
{
|
||||
filetype = 'fugitive',
|
||||
text = 'Fugitive', -- header,
|
||||
text_align = 'center',
|
||||
seperator = true
|
||||
-- padding = 1,
|
||||
-- highlight = "CustomHeader",
|
||||
},
|
||||
{
|
||||
filetype = 'aerial',
|
||||
text = 'Aerial', -- header,
|
||||
text_align = 'center',
|
||||
seperator = true
|
||||
-- padding = 1,
|
||||
-- highlight = "CustomHeader",
|
||||
}
|
||||
},
|
||||
color_icons = true, -- whether or not to add the filetype icon highlights
|
||||
show_buffer_icons = true, -- disable filetype icons for buffers
|
||||
show_buffer_close_icons = false,
|
||||
show_buffer_default_icon = true, -- whether or not an unrecognised filetype should show a default icon
|
||||
show_close_icon = false,
|
||||
show_tab_indicators = true,
|
||||
persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
|
||||
-- can also be a table containing 2 custom separators
|
||||
-- [focused and unfocused]. eg: { '|', '|' }
|
||||
separator_style = 'thin', -- | "thick" | "thin" | { 'any', 'any' },
|
||||
enforce_regular_tabs = true,
|
||||
always_show_bufferline = true,
|
||||
hover = { enabled = true, delay = 200, reveal = { 'close' } },
|
||||
sort_by = 'id'
|
||||
}
|
||||
}
|
||||
)
|
||||
Reference in New Issue
Block a user