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

+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' },