286 lines
12 KiB
Lua
286 lines
12 KiB
Lua
-- ── plugins/ui.lua ────────────────────────────────────────────────────────────
|
||
return {
|
||
|
||
-- ── Colorscheme: Kanagawa Wave (desktop) / habamax (mobile) ───────────────
|
||
-- kanagawa requires termguicolors which Termius mangles as purple.
|
||
-- habamax is built-in, renders cleanly in 256-color (retrobox caused
|
||
-- redraw corruption on Termius, habamax does not).
|
||
{
|
||
"rebelot/kanagawa.nvim",
|
||
priority = 1000,
|
||
config = function()
|
||
if vim.env.MOBILE == "1" then
|
||
vim.cmd("colorscheme habamax")
|
||
return
|
||
end
|
||
require("kanagawa").setup({
|
||
compile = true,
|
||
undercurl = true,
|
||
theme = "wave",
|
||
background = {
|
||
dark = "wave",
|
||
light = "lotus",
|
||
},
|
||
colors = {
|
||
theme = {
|
||
wave = {
|
||
ui = {
|
||
bg_gutter = "none",
|
||
},
|
||
},
|
||
},
|
||
},
|
||
overrides = function(colors)
|
||
local theme = colors.theme
|
||
return {
|
||
Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 },
|
||
PmenuSbar = { bg = theme.ui.bg_m1 },
|
||
PmenuThumb = { bg = theme.ui.bg_p2 },
|
||
CursorLine = { bg = theme.ui.bg_p1 },
|
||
}
|
||
end,
|
||
})
|
||
vim.cmd("colorscheme kanagawa-wave")
|
||
end,
|
||
},
|
||
|
||
-- ── Statusline: lualine ───────────────────────────────────────────────────
|
||
-- theme = "auto" derives from active colorscheme — works for both
|
||
-- kanagawa (desktop) and habamax (mobile) without hex colors
|
||
{
|
||
"nvim-lualine/lualine.nvim",
|
||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||
config = function()
|
||
require("lualine").setup({
|
||
options = {
|
||
theme = "auto",
|
||
component_separators = { left = "│", right = "│" },
|
||
section_separators = { left = "", right = "" },
|
||
globalstatus = true,
|
||
},
|
||
sections = {
|
||
lualine_a = { { "mode", icon = "" } },
|
||
lualine_b = {
|
||
{ "branch", icon = "" },
|
||
{ "diff",
|
||
symbols = { added = " ", modified = " ", removed = " " },
|
||
},
|
||
},
|
||
lualine_c = {
|
||
{ "filename", path = 1, symbols = { modified = "●", readonly = "" } },
|
||
},
|
||
lualine_x = {
|
||
{ "diagnostics",
|
||
symbols = { error = " ", warn = " ", info = " ", hint = " " },
|
||
},
|
||
"filetype",
|
||
},
|
||
lualine_y = { "progress" },
|
||
lualine_z = { { "location", icon = "" } },
|
||
},
|
||
})
|
||
end,
|
||
},
|
||
|
||
-- ── Bufferline (desktop only) ─────────────────────────────────────────────
|
||
-- Renders truecolor backgrounds for tabs which Termius shows as purple bars.
|
||
{
|
||
"akinsho/bufferline.nvim",
|
||
enabled = function() return vim.env.MOBILE ~= "1" end,
|
||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||
config = function()
|
||
require("bufferline").setup({
|
||
options = {
|
||
mode = "buffers",
|
||
separator_style = "slant",
|
||
show_close_icon = false,
|
||
show_buffer_close_icons = false,
|
||
diagnostics = "nvim_lsp",
|
||
diagnostics_indicator = function(_, _, diag)
|
||
local icons = { error = " ", warning = " " }
|
||
local ret = (diag.error and icons.error .. diag.error .. " " or "")
|
||
.. (diag.warning and icons.warning .. diag.warning or "")
|
||
return vim.trim(ret)
|
||
end,
|
||
offsets = {
|
||
{ filetype = "oil", text = "File Explorer", separator = true },
|
||
},
|
||
},
|
||
})
|
||
end,
|
||
},
|
||
|
||
-- ── File explorer: oil.nvim ───────────────────────────────────────────────
|
||
-- Edit the filesystem like a buffer. Very Arch: does one thing, perfectly.
|
||
{
|
||
"stevearc/oil.nvim",
|
||
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||
config = function()
|
||
require("oil").setup({
|
||
default_file_explorer = true,
|
||
columns = {
|
||
"icon",
|
||
"permissions",
|
||
"size",
|
||
"mtime",
|
||
},
|
||
view_options = {
|
||
show_hidden = true,
|
||
},
|
||
keymaps = {
|
||
["<C-h>"] = false, -- don't hijack window nav
|
||
["<C-l>"] = false,
|
||
["q"] = "actions.close",
|
||
},
|
||
})
|
||
end,
|
||
},
|
||
|
||
-- ── Fuzzy finder: Telescope ───────────────────────────────────────────────
|
||
{
|
||
"nvim-telescope/telescope.nvim",
|
||
dependencies = {
|
||
"nvim-lua/plenary.nvim",
|
||
-- Native FZF sorter — faster than the lua one
|
||
{ "nvim-telescope/telescope-fzf-native.nvim", build = "make" },
|
||
},
|
||
config = function()
|
||
local telescope = require("telescope")
|
||
local actions = require("telescope.actions")
|
||
|
||
telescope.setup({
|
||
defaults = {
|
||
prompt_prefix = "❯ ",
|
||
selection_caret = "▶ ",
|
||
-- Kanagawa-inspired layout
|
||
layout_strategy = "horizontal",
|
||
layout_config = { prompt_position = "top", width = 0.9 },
|
||
sorting_strategy = "ascending",
|
||
mappings = {
|
||
i = {
|
||
["<Esc>"] = actions.close,
|
||
["<C-j>"] = actions.move_selection_next,
|
||
["<C-k>"] = actions.move_selection_previous,
|
||
},
|
||
},
|
||
},
|
||
})
|
||
|
||
telescope.load_extension("fzf")
|
||
end,
|
||
},
|
||
|
||
-- ── Which-key ─────────────────────────────────────────────────────────────
|
||
{
|
||
"folke/which-key.nvim",
|
||
event = "VeryLazy",
|
||
config = function()
|
||
require("which-key").setup({
|
||
preset = "modern",
|
||
delay = 400,
|
||
icons = { separator = "→" },
|
||
})
|
||
end,
|
||
},
|
||
|
||
-- ── Git signs in gutter ───────────────────────────────────────────────────
|
||
{
|
||
"lewis6991/gitsigns.nvim",
|
||
config = function()
|
||
require("gitsigns").setup({
|
||
signs = {
|
||
add = { text = "▎" },
|
||
change = { text = "▎" },
|
||
delete = { text = "" },
|
||
topdelete = { text = "" },
|
||
changedelete = { text = "▎" },
|
||
untracked = { text = "▎" },
|
||
},
|
||
on_attach = function(buf)
|
||
local gs = require("gitsigns")
|
||
local m = function(k, fn, d)
|
||
vim.keymap.set("n", k, fn, { buffer = buf, desc = d })
|
||
end
|
||
m("]c", gs.next_hunk, "Next hunk")
|
||
m("[c", gs.prev_hunk, "Prev hunk")
|
||
m("<leader>hs", gs.stage_hunk, "Stage hunk")
|
||
m("<leader>hr", gs.reset_hunk, "Reset hunk")
|
||
m("<leader>hp", gs.preview_hunk, "Preview hunk")
|
||
m("<leader>hb", gs.blame_line, "Blame line")
|
||
end,
|
||
})
|
||
end,
|
||
},
|
||
|
||
-- ── Indent guides ─────────────────────────────────────────────────────────
|
||
{
|
||
"lukas-reineke/indent-blankline.nvim",
|
||
main = "ibl",
|
||
config = function()
|
||
require("ibl").setup({
|
||
indent = { char = "│" },
|
||
scope = { char = "│" },
|
||
})
|
||
-- Link to existing highlight groups instead of hex (mobile-safe)
|
||
vim.cmd("hi! link IblIndent Comment")
|
||
vim.cmd("hi! link IblScope LineNr")
|
||
end,
|
||
},
|
||
|
||
|
||
-- ── Dashboard ─────────────────────────────────────────────────────────────
|
||
{
|
||
"goolord/alpha-nvim",
|
||
event = "VimEnter",
|
||
config = function()
|
||
local alpha = require("alpha")
|
||
local dashboard = require("alpha.themes.dashboard")
|
||
|
||
-- Mobile-friendly ASCII (heavy blocks render as red bars in Termius)
|
||
dashboard.section.header.val = {
|
||
" ",
|
||
" ┌─┐┬─┐┌─┐┬ ┬ ┌┬┐┌─┐┬ ┬ ",
|
||
" ├─┤├┬┘│ ├─┤───│││├┤ └┐┌┘ ",
|
||
" ┴ ┴┴└─└─┘┴ ┴ ─┴┘└─┘ └┘ ",
|
||
" ",
|
||
" riced neovim ide · arch linux · v1.7 ",
|
||
}
|
||
|
||
dashboard.section.buttons.val = {
|
||
dashboard.button("f", " Find file", "<cmd>Telescope find_files<cr>"),
|
||
dashboard.button("r", " Recent files", "<cmd>Telescope oldfiles<cr>"),
|
||
dashboard.button("g", " Live grep", "<cmd>Telescope live_grep<cr>"),
|
||
dashboard.button("e", " Explorer", "<cmd>Oil<cr>"),
|
||
dashboard.button("l", " Lazy", "<cmd>Lazy<cr>"),
|
||
dashboard.button("q", " Quit", "<cmd>qa<cr>"),
|
||
}
|
||
|
||
dashboard.section.header.opts.hl = "Comment"
|
||
dashboard.section.footer.opts.hl = "NonText"
|
||
|
||
alpha.setup(dashboard.opts)
|
||
end,
|
||
},
|
||
|
||
-- ── Smooth scrolling ──────────────────────────────────────────────────────
|
||
{
|
||
"karb94/neoscroll.nvim",
|
||
config = function()
|
||
require("neoscroll").setup({ mappings = { "<C-u>","<C-d>","<C-b>","<C-f>" } })
|
||
end,
|
||
},
|
||
|
||
-- ── Color previews inline (desktop only) ──────────────────────────────────
|
||
-- Renders hex as RGB which Termius mangles. Skip on mobile.
|
||
{
|
||
"NvChad/nvim-colorizer.lua",
|
||
enabled = function() return vim.env.MOBILE ~= "1" end,
|
||
config = function()
|
||
require("colorizer").setup({ "*" }, { mode = "virtualtext" })
|
||
end,
|
||
},
|
||
|
||
-- Web devicons (used everywhere)
|
||
{ "nvim-tree/nvim-web-devicons", lazy = true },
|
||
}
|