Implement custom tabline with configurable path shortening
Add a custom tabline function to enhance path display in Neovim. Users can configure the number of full parent directories and the length of shortened directory names for better context and manageability.
This commit is contained in:
parent
7d2c85417d
commit
87ea788dee
5 changed files with 147 additions and 0 deletions
|
|
@ -16,6 +16,26 @@ vim.opt.autochdir = false -- Keep working directory at project root
|
|||
vim.opt.exrc = true -- Load .nvim.lua from project root
|
||||
vim.opt.secure = true -- Prompt before loading untrusted files
|
||||
|
||||
-- Custom tabline configuration
|
||||
-- Load utils module for custom tabline function
|
||||
local utils = require('utils')
|
||||
|
||||
-- Configure number of parent directories to show in full (default: 1)
|
||||
-- Examples:
|
||||
-- 1: /path/to/my/project/src/file.txt → pat/to/my/project/src/file.txt
|
||||
-- 2: /path/to/my/project/src/file.txt → pat/to/my/project/src/file.txt
|
||||
utils.tabline_full_parents = 1
|
||||
|
||||
-- Configure number of characters to show for shortened directories (default: 3)
|
||||
-- Examples:
|
||||
-- 3: /path/to/my → pat/to/my
|
||||
-- 1: /path/to/my → p/t/m
|
||||
utils.tabline_shorten_length = 4
|
||||
|
||||
-- Use custom tabline function
|
||||
vim.opt.tabline = '%!v:lua.require("utils").custom_tabline()'
|
||||
vim.opt.showtabline = 1 -- Show tabline only when there are 2+ tabs
|
||||
|
||||
-- Phase 3.2: non-plugin settings (legacy values where specified)
|
||||
-- Completion UI for nvim-cmp
|
||||
vim.opt.completeopt = { "menu", "menuone", "noselect" }
|
||||
|
|
|
|||
|
|
@ -6,5 +6,94 @@ function M.safe_require(name)
|
|||
return nil
|
||||
end
|
||||
|
||||
-- Number of parent directories to show in full in the tabline
|
||||
-- The rest will be shortened according to tabline_shorten_length
|
||||
-- Example: with full_parents = 1, /path/to/my/project/src/file.txt becomes pat/to/my/project/src/file.txt
|
||||
-- Example: with full_parents = 2, it becomes pat/to/my/project/src/file.txt
|
||||
M.tabline_full_parents = 1
|
||||
|
||||
-- Number of characters to show for shortened directory names in the tabline
|
||||
-- Example: with shorten_length = 3, /path/to/my becomes pat/to/my
|
||||
-- Example: with shorten_length = 1, /path/to/my becomes p/t/m
|
||||
M.tabline_shorten_length = 3
|
||||
|
||||
-- Custom tabline function
|
||||
-- Shows configurable number of full parent directories, shortens the rest
|
||||
function M.custom_tabline()
|
||||
local tabline = ''
|
||||
local num_tabs = vim.fn.tabpagenr('$')
|
||||
|
||||
for i = 1, num_tabs do
|
||||
local buflist = vim.fn.tabpagebuflist(i)
|
||||
local winnr = vim.fn.tabpagewinnr(i)
|
||||
local bufnr = buflist[winnr]
|
||||
local bufname = vim.fn.bufname(bufnr)
|
||||
local bufmodified = vim.fn.getbufvar(bufnr, "&modified")
|
||||
|
||||
-- Highlight for the tab
|
||||
if i == vim.fn.tabpagenr() then
|
||||
tabline = tabline .. '%#TabLineSel#'
|
||||
else
|
||||
tabline = tabline .. '%#TabLine#'
|
||||
end
|
||||
|
||||
-- Tab number
|
||||
tabline = tabline .. ' ' .. i .. ' '
|
||||
|
||||
-- Format the filename with smart path shortening
|
||||
local filename
|
||||
if bufname == '' then
|
||||
filename = '[No Name]'
|
||||
else
|
||||
-- Get the full path relative to cwd if possible
|
||||
local path = vim.fn.fnamemodify(bufname, ':~:.')
|
||||
|
||||
-- Split path into components
|
||||
local parts = vim.split(path, '/', { plain = true })
|
||||
|
||||
if #parts > M.tabline_full_parents + 1 then
|
||||
-- We have enough parts to do smart shortening
|
||||
local result = {}
|
||||
|
||||
-- Shorten the leading directories (all but the last full_parents + filename)
|
||||
local num_to_shorten = #parts - M.tabline_full_parents - 1
|
||||
for j = 1, num_to_shorten do
|
||||
table.insert(result, parts[j]:sub(1, M.tabline_shorten_length))
|
||||
end
|
||||
|
||||
-- Add the full parent directories
|
||||
for j = num_to_shorten + 1, #parts - 1 do
|
||||
table.insert(result, parts[j])
|
||||
end
|
||||
|
||||
-- Add the filename
|
||||
table.insert(result, parts[#parts])
|
||||
|
||||
filename = table.concat(result, '/')
|
||||
else
|
||||
-- Path is short enough, just use it as-is
|
||||
filename = path
|
||||
end
|
||||
end
|
||||
|
||||
-- Add modified flag
|
||||
if bufmodified == 1 then
|
||||
filename = filename .. ' [+]'
|
||||
end
|
||||
|
||||
tabline = tabline .. filename .. ' '
|
||||
end
|
||||
|
||||
-- Fill the rest with TabLineFill
|
||||
tabline = tabline .. '%#TabLineFill#%T'
|
||||
|
||||
-- Right-align: show tab page count if more than one tab
|
||||
if num_tabs > 1 then
|
||||
tabline = tabline .. '%=%#TabLine# ' .. num_tabs .. ' tabs '
|
||||
end
|
||||
|
||||
return tabline
|
||||
end
|
||||
|
||||
return M
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue