refactor(ui): improve completion menu and statusline with mini.icons and slimline.nvim

This commit is contained in:
sankalp committed 2025-10-02 22:50:58 +05:45
1 parent b82b4091d1
commit a80b173e3c
8 files changed
+160 -400

No files matched your search

+3 -2
View File
@@ -4,6 +4,7 @@
"Navigator.nvim": { "branch": "master", "commit": "91d86506ac2a039504d5205d32a1d4bc7aa57072" },
"better-escape.nvim": { "branch": "master", "commit": "19a38aab94961016430905ebec30d272a01e9742" },
"blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" },
"bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" },
"conform.nvim": { "branch": "master", "commit": "c64cc754ace603e185ab30113aaef174187eacf8" },
"friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" },
"gitsigns.nvim": { "branch": "main", "commit": "0c6826374f47fcbb2b53053986ccc59c115044ff" },
@@ -12,7 +13,6 @@
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" },
"lazygit.nvim": { "branch": "main", "commit": "2305deed25bc61b866d5d39189e9105a45cf1cfb" },
"lspsaga.nvim": { "branch": "main", "commit": "8efe00d6aed9db6449969f889170f1a7e43101a1" },
"lualine.nvim": { "branch": "master", "commit": "b8c23159c0161f4b89196f74ee3a6d02cdc3a955" },
"markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" },
"markview.nvim": { "branch": "main", "commit": "5d07ff2d3ac7a5f90e675692178c23ebbb104d12" },
"mason-conform.nvim": { "branch": "main", "commit": "48da2ebd5efbaf8a99566eadc3ece82d523f03c5" },
@@ -23,6 +23,7 @@
"mini.ai": { "branch": "main", "commit": "e139eb1101beb0250fea322f8c07a42f0f175688" },
"mini.bracketed": { "branch": "main", "commit": "87cf031b49e3753227f73f433851a6a75cf31445" },
"mini.files": { "branch": "main", "commit": "49c855977e9f4821d1ed8179ed44fe098b93ea2a" },
"mini.icons": { "branch": "main", "commit": "e8fae66cb400744daeedf6e387347df50271c252" },
"mini.indentscope": { "branch": "main", "commit": "fc1bb1e4573f7174cb6e2bbabc3453340a9eec16" },
"mini.surround": { "branch": "main", "commit": "5aab42fcdcf31fa010f012771eda5631c077840a" },
"neogen": { "branch": "main", "commit": "d7f9461727751fb07f82011051338a9aba07581d" },
@@ -31,13 +32,13 @@
"nvim-genghis": { "branch": "main", "commit": "cdf584d05ffc9d5c1f247079991552249e4f7487" },
"nvim-lint": { "branch": "master", "commit": "335a6044be16d7701001059cba9baa36fbeef422" },
"nvim-lspconfig": { "branch": "master", "commit": "db8fef885009fdec0daeff3e5dda92e1f539611e" },
"nvim-tree.lua": { "branch": "master", "commit": "87d096a39cb2d5d43e6771563575ff042a79f48b" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" },
"nvim-ts-context-commentstring": { "branch": "main", "commit": "1b212c2eee76d787bbea6aa5e92a2b534e7b4f8f" },
"nvim-ufo": { "branch": "main", "commit": "d31e2a9fd572a25a4d5011776677223a8ccb7e35" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"promise-async": { "branch": "main", "commit": "119e8961014c9bfaf1487bf3c2a393d254f337e2" },
"slimline.nvim": { "branch": "main", "commit": "37d197329b0a65af820e794a007553aa7ef387b5" },
"snacks.nvim": { "branch": "main", "commit": "bfe8c26dbd83f7c4fbc222787552e29b4eccfcc0" },
"tiny-code-action.nvim": { "branch": "main", "commit": "0ba6e10ddb11812ea35aa91c9e6739c16659bd9e" },
"tiny-inline-diagnostic.nvim": { "branch": "main", "commit": "29315861711f11daf75e1cf0953ab92ec1a3e69f" },
+17 -17
View File
@@ -75,23 +75,23 @@ vim.lsp.config('basedpyright', {
})
vim.lsp.enable('basedpyright')
vim.lsp.config('pylsp', {
settings = {
pylsp = {
plugins = {
-- use black as default formatter
yapf = { enabled = false },
autopep8 = { enabled = false },
black = { enabled = true },
pycodestyle = {
enabled = true,
ignore = { 'E203', 'E701', 'W503' },
maxLineLength = 88,
},
},
},
},
})
-- vim.lsp.config('pylsp', {
-- settings = {
-- pylsp = {
-- plugins = {
-- -- use black as default formatter
-- yapf = { enabled = false },
-- autopep8 = { enabled = false },
-- black = { enabled = true },
-- pycodestyle = {
-- enabled = true,
-- ignore = { 'E203', 'E701', 'W503' },
-- maxLineLength = 88,
-- },
-- },
-- },
-- },
-- })
-- latex
vim.lsp.config('texlab', {
+20 -29
View File
@@ -21,35 +21,6 @@ return {
version = '*',
config = function()
require('blink.cmp').setup({
appearance = {
kind_icons = {
Text = '',
Method = '',
Function = 'ƒ',
Constructor = '',
Field = '',
Variable = '',
Property = '󰓹',
Class = '',
Interface = '',
Struct = '',
Module = '󰩦',
Unit = '',
Value = '',
Enum = '',
EnumMember = '',
Keyword = '',
Constant = 'П',
Snippet = '',
Color = '',
File = '',
Reference = '',
Folder = '',
Event = '',
Operator = '',
TypeParameter = '',
},
},
completion = {
list = {
selection = {
@@ -64,6 +35,26 @@ return {
},
menu = {
border = 'rounded',
draw = {
components = {
kind_icon = {
text = function(ctx)
local kind_icon, _, _ = require('mini.icons').get('lsp', ctx.kind)
return kind_icon
end,
highlight = function(ctx)
local _, hl, _ = require('mini.icons').get('lsp', ctx.kind)
return hl
end,
},
kind = {
highlight = function(ctx)
local _, hl, _ = require('mini.icons').get('lsp', ctx.kind)
return hl
end,
},
},
},
},
},
signature = {
-41
View File
@@ -39,45 +39,4 @@ return {
})
end,
},
{
'nvim-tree/nvim-tree.lua',
config = function()
require('nvim-tree').setup({
filters = { dotfiles = false },
disable_netrw = true,
hijack_cursor = true,
sync_root_with_cwd = true,
update_focused_file = {
enable = true,
update_root = false,
},
view = {
width = 30,
side = 'right',
preserve_window_proportions = true,
},
git = {
enable = false,
ignore = true,
},
renderer = {
root_folder_label = false,
indent_markers = { enable = true },
icons = {
glyphs = {
default = '󰈚',
folder = {
default = '',
empty = '',
empty_open = '',
open = '',
symlink = '',
},
},
},
},
})
end,
vim.keymap.set('n', '<leader>eo', '<cmd>NvimTreeToggle<CR>', { desc = 'Toggle file explorer' }),
},
}
+66 -66
View File
@@ -1,69 +1,69 @@
return {
-- default lsp configs
{
"neovim/nvim-lspconfig",
config = function() end,
},
-- default lsp configs
{
'neovim/nvim-lspconfig',
config = function() end,
},
-- lsp installer
{
"williamboman/mason.nvim",
dependencies = {
"williamboman/mason-lspconfig.nvim",
},
cmd = "Mason",
config = function()
-- mason
require("mason").setup({
ui = {
icons = {
package_installed = "✓",
package_pending = "➜",
package_uninstalled = "✗",
},
border = "rounded",
backdrop = 100,
},
})
require("mason-lspconfig").setup({
-- list of servers for mason to install
ensure_installed = {
"ts_ls",
"html",
"cssls",
"tailwindcss",
"lua_ls",
"basedpyright",
"bashls",
"clangd",
"pylsp",
"rust_analyzer",
},
automatic_installation = false, -- Don't auto-install or auto-configure
})
end,
},
{
"nvimdev/lspsaga.nvim",
event = "LspAttach",
config = function()
require("lspsaga").setup({
ui = {
theme = "round",
border = "rounded",
devicon = true,
title = true,
winblend = 1,
expand = "",
collapse = "",
preview = "",
code_action = "󰠠 ",
diagnostic = "",
incoming = "",
outgoing = "",
hover = "",
},
})
end,
},
-- lsp installer
{
'williamboman/mason.nvim',
dependencies = {
'williamboman/mason-lspconfig.nvim',
},
cmd = 'Mason',
config = function()
-- mason
require('mason').setup({
ui = {
icons = {
package_installed = '✓',
package_pending = '➜',
package_uninstalled = '✗',
},
border = 'rounded',
backdrop = 100,
},
})
require('mason-lspconfig').setup({
-- list of servers for mason to install
ensure_installed = {
'ts_ls',
'html',
'cssls',
'tailwindcss',
'lua_ls',
'basedpyright',
'bashls',
'clangd',
-- "pylsp",
'rust_analyzer',
},
automatic_installation = false, -- Don't auto-install or auto-configure
})
end,
},
{
'nvimdev/lspsaga.nvim',
event = 'LspAttach',
config = function()
require('lspsaga').setup({
ui = {
theme = 'round',
border = 'rounded',
devicon = true,
title = true,
winblend = 1,
expand = '',
collapse = '',
preview = '',
code_action = '󰠠 ',
diagnostic = '',
incoming = '',
outgoing = '',
hover = '',
},
})
end,
},
}
+27 -234
View File
@@ -1,239 +1,32 @@
return {
'nvim-lualine/lualine.nvim',
dependencies = {
'ellisonleao/gruvbox.nvim',
{
'sschleemilch/slimline.nvim',
opts = {
style = 'bg',
bold = true,
spaces = {
components = '',
left = '',
right = '',
},
sep = {
hide = {
first = true,
last = true,
},
left = '',
right = '',
},
},
},
config = function()
local lualine = require('lualine')
-- Get gruvbox colors
local palette = require('gruvbox').palette
local colors = {
bg = palette.dark0,
fg = palette.light1,
yellow = palette.bright_yellow,
cyan = palette.bright_aqua,
darkblue = palette.dark0_hard,
green = palette.bright_green,
orange = palette.bright_orange,
violet = palette.bright_purple,
magenta = palette.bright_purple,
blue = palette.bright_blue,
red = palette.bright_red,
}
local mode_color = {
n = colors.green,
i = colors.blue,
v = colors.magenta,
[''] = colors.magenta,
V = colors.magenta,
c = colors.yellow,
t = colors.red,
R = colors.orange,
Rv = colors.orange,
no = colors.fg,
s = colors.violet,
S = colors.violet,
[''] = colors.violet,
ic = colors.yellow,
cv = colors.red,
ce = colors.red,
r = colors.cyan,
rm = colors.cyan,
['r?'] = colors.cyan,
['!'] = colors.red,
}
local conditions = {
buffer_not_empty = function()
return vim.fn.empty(vim.fn.expand('%:t')) ~= 1
end,
buffer_is_file = function()
return vim.bo.buftype == ''
end,
buffer_not_scratch = function()
return string.find(vim.fn.bufname(), 'SCRATCH') == nil
end,
hide_in_width = function()
return vim.fn.winwidth(0) > 80
end,
check_git_workspace = function()
local filepath = vim.fn.expand('%:p:h')
local gitdir = vim.fn.finddir('.git', filepath .. ';')
return gitdir and #gitdir > 0 and #gitdir < #filepath
end,
is_note = function()
local notes_dir = vim.env.NOTES_DIR
if not notes_dir then
return false
end
local current_file = vim.fn.expand('%:p')
return current_file:find(vim.fn.expand(notes_dir), 1, true) == 1
end,
}
local searchcount = { 'searchcount', color = { fg = colors.fg, gui = 'bold' } }
local selectioncount = { 'selectioncount', color = { fg = colors.fg, gui = 'bold' } }
local progress = { 'progress', color = { fg = colors.fg, gui = 'bold' } }
local filetype = { 'filetype', color = { fg = colors.blue, gui = 'bold' } }
local filesize = { 'filesize', color = { fg = colors.fg, gui = 'bold' }, cond = conditions.buffer_not_empty }
local fileformat = { 'fileformat', icons_enabled = true, color = { fg = colors.fg, gui = 'bold' } }
local filename = {
'filename',
cond = conditions.buffer_not_empty and conditions.buffer_is_file and conditions.buffer_not_scratch,
color = { fg = colors.magenta, gui = 'bold' },
}
local buffers = {
'buffers',
mode = 2,
cond = conditions.buffer_not_scratch,
filetype_names = {
NvimTree = '' .. 'Files',
TelescopePrompt = '' .. 'Telescope',
Avante = '' .. 'Avante',
AvanteInput = '' .. 'Avante',
AvanteSelectedFiles = '' .. 'Avante',
dashboard = '' .. 'Dashboard',
lazy = '󰒲 ' .. 'Lazy',
mason = '' .. 'Mason',
minifiles = '' .. 'Files',
snacks_picker_input = '' .. 'Picker',
spectre_panel = '' .. 'Spectre',
},
use_mode_colors = true,
}
local branch = {
'branch',
icon = '',
fmt = function(str)
return str:sub(1, 32)
end,
color = { fg = colors.green, gui = 'bold' },
}
local diff_icons = {
'diff',
symbols = { added = '', modified = '', removed = '' },
diff_color = {
added = { fg = colors.green },
modified = { fg = colors.orange },
removed = { fg = colors.red },
},
cond = conditions.hide_in_width,
}
local diagnostics = {
'diagnostics',
sources = { 'nvim_lsp', 'nvim_diagnostic', 'nvim_workspace_diagnostic' },
symbols = {
error = '',
warn = '',
info = '',
hint = '󰠠 ',
},
diagnostics_color = {
color_error = { fg = colors.red },
color_warn = { fg = colors.yellow },
color_info = { fg = colors.blue },
color_hint = { fg = colors.yellow },
},
}
local lsp = {
function()
local msg = 'No LSP'
local buf_ft = vim.api.nvim_get_option_value('filetype', { buf = 0 })
local clients = vim.lsp.get_clients()
if next(clients) == nil then
return msg
end
for _, client in ipairs(clients) do
local filetypes = client.config and client.config.filetypes or nil
if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then
return client.name
end
end
return msg
end,
icon = '',
color = { fg = colors.fg, gui = 'bold' },
}
local encoding = {
'o:encoding',
fmt = string.upper,
cond = conditions.hide_in_width,
color = { fg = colors.green, gui = 'bold' },
}
local function mode(icon)
icon = icon or ''
return {
function()
return icon
end,
color = function()
return { fg = mode_color[vim.fn.mode()] }
end,
padding = { left = 1, right = 0 },
}
end
-- Create custom gruvbox theme
local function gruvbox_custom()
local function accent_status(accent)
return {
a = { bg = accent, fg = palette.dark0_hard },
b = { bg = palette.dark1, fg = accent },
c = { bg = palette.dark0, fg = palette.light1 },
}
end
return {
normal = accent_status(palette.bright_aqua),
insert = accent_status(palette.bright_green),
visual = accent_status(palette.bright_purple),
replace = accent_status(palette.bright_yellow),
command = accent_status(palette.bright_orange),
inactive = {
a = { bg = palette.dark1, fg = palette.light4 },
b = { bg = palette.dark1, fg = palette.light4 },
c = { bg = palette.dark1, fg = palette.light4 },
},
}
end
lualine.setup({
{
'akinsho/bufferline.nvim',
opts = {
options = {
component_separators = '',
-- section_separators = '',
theme = gruvbox_custom(),
disabled_filetypes = {
'dashboard',
},
show_close_icon = false,
show_buffer_close_icons = false,
},
-- extensions = { 'quickfix', 'man', 'mason', 'lazy', 'toggleterm', 'nvim-tree' },
tabline = {
lualine_a = {},
lualine_b = { mode(), buffers },
lualine_c = {},
lualine_x = { diff_icons, branch },
lualine_y = { searchcount, selectioncount },
lualine_z = {},
},
sections = {
lualine_a = {},
lualine_b = {},
lualine_c = { mode(''), 'location', progress, filename },
lualine_x = { diagnostics, lsp, filetype, filesize, fileformat, encoding },
lualine_y = {},
lualine_z = {},
},
})
end,
},
vim.api.nvim_set_hl(0, 'BufferLineFill', { bg = 'None' }),
},
}
+16 -10
View File
@@ -1,5 +1,11 @@
return {
{
'nvim-mini/mini.icons',
lazy = true,
opts = {},
},
--harpoon
{
'ThePrimeagen/harpoon',
@@ -86,7 +92,7 @@ return {
shell = vim.o.shell,
float_opts = {
border = 'curved', -- 'single', 'double', 'shadow', etc.
winblend = 0, -- Set to 0 for full transparency
winblend = 0, -- Set to 0 for full transparency
highlights = {
border = 'Normal',
background = 'Normal',
@@ -117,16 +123,16 @@ return {
picker_integration = true,
keymaps = {
prefix = '<leader>u', -- Main prefix for uv commands
commands = true, -- Show uv commands menu (<leader>x)
run_file = true, -- Run current file (<leader>xr)
commands = true, -- Show uv commands menu (<leader>x)
run_file = true, -- Run current file (<leader>xr)
run_selection = true, -- Run selected code (<leader>xs)
run_function = true, -- Run function (<leader>xf)
venv = true, -- Environment management (<leader>xe)
init = true, -- Initialize uv project (<leader>xi)
add = true, -- Add a package (<leader>xa)
remove = true, -- Remove a package (<leader>xd)
sync = true, -- Sync packages (<leader>xc)
sync_all = true, -- Sync all packages, extras and groups (<leader>xC)
run_function = true, -- Run function (<leader>xf)
venv = true, -- Environment management (<leader>xe)
init = true, -- Initialize uv project (<leader>xi)
add = true, -- Add a package (<leader>xa)
remove = true, -- Remove a package (<leader>xd)
sync = true, -- Sync packages (<leader>xc)
sync_all = true, -- Sync all packages, extras and groups (<leader>xC)
},
},
},
+11 -1
View File
@@ -45,6 +45,8 @@ return {
-- { "<leader>a", group = " AI" },
{ '<leader>b', group = ' Buffer' },
{ '<leader>c', group = ' Code' },
{ '<leader>cF', ':retab<cr>', desc = 'Fix Tabs' },
{ '<leader>cd', ':RootDir<cr>', desc = 'Root Directory' },
@@ -57,7 +59,15 @@ return {
{ '<leader>e', group = ' Edit' },
{ '<leader>ea', ':b#<cr>', desc = 'Alternate File' },
{ '<leader>eC', group = 'Edit Configs' },
{ '<leader>ee', ':lua MiniFiles.open()<cr>', desc = 'Explore Tree' },
{
'<leader>ee',
function()
local minifiles = require('mini.files')
minifiles.open(vim.api.nvim_buf_get_name(0), true)
minifiles.reveal_cwd()
end,
desc = 'Explore Tree',
},
{ '<leader>eE', ':lua Snacks.explorer()<cr>', desc = 'File Explorer' },
{ '<leader>ef', 'gf', desc = 'File Under Cursor' },
{ '<leader>em', ':e README.md<cr>', desc = 'Readme' },