astro-nvim-v3 - archive v3
This commit is contained in:
46
lua/plugins/astrocore.lua
Normal file
46
lua/plugins/astrocore.lua
Normal file
@@ -0,0 +1,46 @@
|
||||
-- AstroCore provides a central place to modify mappings, vim options, autocommands, and more!
|
||||
-- Configuration documentation can be found with `:h astrocore`
|
||||
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||
-- as this provides autocomplete and documentation while editing
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"AstroNvim/astrocore",
|
||||
---@type AstroCoreOpts
|
||||
opts = {
|
||||
-- Configure core features of AstroNvim
|
||||
features = {
|
||||
large_buf = { size = 1024 * 500, lines = 10000 }, -- set global limits for large files for disabling features like treesitter
|
||||
autopairs = true, -- enable autopairs at start
|
||||
cmp = true, -- enable completion at start
|
||||
diagnostics_mode = 3, -- diagnostic mode on start (0 = off, 1 = no signs/virtual text, 2 = no virtual text, 3 = on)
|
||||
highlighturl = true, -- highlight URLs at start
|
||||
notifications = true, -- enable notifications at start
|
||||
},
|
||||
-- Diagnostics configuration (for vim.diagnostics.config({...})) when diagnostics are on
|
||||
diagnostics = {
|
||||
virtual_text = true,
|
||||
underline = true,
|
||||
update_in_insert = false,
|
||||
},
|
||||
-- Configuration table of session options for AstroNvim's session management powered by Resession
|
||||
sessions = {
|
||||
-- Configure auto saving
|
||||
autosave = {
|
||||
last = true, -- auto save last session
|
||||
cwd = true, -- auto save session for each working directory
|
||||
},
|
||||
-- Patterns to ignore when saving sessions
|
||||
ignore = {
|
||||
dirs = {}, -- working directories to ignore sessions in
|
||||
filetypes = { "gitcommit", "gitrebase" }, -- filetypes to ignore sessions
|
||||
buftypes = {}, -- buffer types to ignore sessions
|
||||
},
|
||||
},
|
||||
-- vim options can be configured here
|
||||
options = require "core.options",
|
||||
-- Mappings can be configured through AstroCore as well.
|
||||
-- NOTE: keycodes follow the casing in the vimdocs. For example, `<Leader>` must be capitalized
|
||||
mappings = require "core.mappings"(),
|
||||
},
|
||||
}
|
||||
115
lua/plugins/astrolsp.lua
Normal file
115
lua/plugins/astrolsp.lua
Normal file
@@ -0,0 +1,115 @@
|
||||
-- Configuration documentation can be found with `:h astrolsp`
|
||||
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||
-- as this provides autocomplete and documentation while editing
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"AstroNvim/astrolsp",
|
||||
---@type AstroLSPOpts
|
||||
opts = {
|
||||
-- Configuration table of features provided by AstroLSP
|
||||
features = {
|
||||
autoformat = true, -- enable or disable auto formatting on start
|
||||
codelens = true, -- enable/disable codelens refresh on start
|
||||
inlay_hints = true, -- enable/disable inlay hints on start
|
||||
semantic_tokens = true, -- enable/disable semantic token highlighting
|
||||
},
|
||||
-- customize lsp formatting options
|
||||
formatting = require "plugins.configs.lsp.formatting",
|
||||
-- enable servers that you already have installed without mason
|
||||
servers = {},
|
||||
-- customize language server configuration options passed to `lspconfig`
|
||||
---@diagnostic disable: missing-fields
|
||||
config = {
|
||||
clangd = require "plugins.configs.lsp.config.clangd",
|
||||
basedpyright = require "plugins.configs.lsp.config.basedpyright",
|
||||
},
|
||||
-- customize how language servers are attached
|
||||
handlers = {
|
||||
-- a function without a key is simply the default handler, functions take two parameters, the server name and the configured options table for that server
|
||||
-- function(server, opts) require("lspconfig")[server].setup(opts) end
|
||||
|
||||
-- the key is the server that is being setup with `lspconfig`
|
||||
-- rust_analyzer = false, -- setting a handler to false will disable the set up of that language server
|
||||
-- pyright = function(_, opts) require("lspconfig").pyright.setup(opts) end -- or a custom handler function can be passed
|
||||
},
|
||||
-- Configure buffer local auto commands to add when attaching a language server
|
||||
autocmds = {
|
||||
-- first key is the `augroup` to add the auto commands to (:h augroup)
|
||||
lsp_document_highlight = {
|
||||
-- Optional condition to create/delete auto command group
|
||||
-- can either be a string of a client capability or a function of `fun(client, bufnr): boolean`
|
||||
-- condition will be resolved for each client on each execution and if it ever fails for all clients,
|
||||
-- the auto commands will be deleted for that buffer
|
||||
cond = "textDocument/documentHighlight",
|
||||
-- cond = function(client, bufnr) return client.name == "lua_ls" end,
|
||||
-- list of auto commands to set
|
||||
{
|
||||
-- events to trigger
|
||||
event = { "CursorHold", "CursorHoldI" },
|
||||
-- the rest of the autocmd options (:h nvim_create_autocmd)
|
||||
desc = "Document Highlighting",
|
||||
callback = function() vim.lsp.buf.document_highlight() end,
|
||||
},
|
||||
{
|
||||
event = { "CursorMoved", "CursorMovedI", "BufLeave" },
|
||||
desc = "Document Highlighting Clear",
|
||||
callback = function() vim.lsp.buf.clear_references() end,
|
||||
},
|
||||
},
|
||||
-- disable inlay hints in insert mode
|
||||
disable_inlay_hints_on_insert = {
|
||||
-- only create for language servers that support inlay hints
|
||||
-- (and only if vim.lsp.inlay_hint is available)
|
||||
cond = vim.lsp.inlay_hint and "textDocument/inlayHint" or false,
|
||||
{
|
||||
-- when going into insert mode
|
||||
event = "InsertEnter",
|
||||
desc = "disable inlay hints on insert",
|
||||
callback = function(args)
|
||||
local filter = { bufnr = args.buf }
|
||||
-- if the inlay hints are currently enabled
|
||||
if vim.lsp.inlay_hint.is_enabled(filter) then
|
||||
-- disable the inlay hints
|
||||
vim.lsp.inlay_hint.enable(false, filter)
|
||||
-- create a single use autocommand to turn the inlay hints back on
|
||||
-- when leaving insert mode
|
||||
vim.api.nvim_create_autocmd("InsertLeave", {
|
||||
buffer = args.buf,
|
||||
once = true,
|
||||
callback = function() vim.lsp.inlay_hint.enable(true, filter) end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
-- mappings to be set up on attaching of a language server
|
||||
mappings = {
|
||||
n = {
|
||||
gh = { function() vim.lsp.buf.hover() end, desc = "Hover symbol details", cond = "textDocument/hover" },
|
||||
gl = { function() vim.diagnostic.open_float() end, desc = "Hover diagnostics" },
|
||||
-- a `cond` key can provided as the string of a server capability to be required to attach, or a function with `client` and `bufnr` parameters from the `on_attach` that returns a boolean
|
||||
gD = {
|
||||
function() vim.lsp.buf.declaration() end,
|
||||
desc = "Declaration of current symbol",
|
||||
cond = "textDocument/declaration",
|
||||
},
|
||||
["<Leader>uY"] = {
|
||||
function() require("astrolsp.toggles").buffer_semantic_tokens() end,
|
||||
desc = "Toggle LSP semantic highlight (buffer)",
|
||||
cond = function(client) return client.server_capabilities.semanticTokensProvider and vim.lsp.semantic_tokens end,
|
||||
},
|
||||
},
|
||||
},
|
||||
-- A custom `on_attach` function to be run after the default `on_attach` function
|
||||
-- takes two parameters `client` and `bufnr` (`:h lspconfig-setup`)
|
||||
on_attach = function(client, bufnr)
|
||||
-- this would disable semanticTokensProvider for all clients
|
||||
-- client.server_capabilities.semanticTokensProvider = nil
|
||||
|
||||
-- Disable ruff_lsp hover in favor of pyright
|
||||
if client.name == "ruff_lsp" then client.server_capabilities.hoverProvider = false end
|
||||
end,
|
||||
},
|
||||
}
|
||||
19
lua/plugins/astroui.lua
Normal file
19
lua/plugins/astroui.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
-- AstroUI provides the basis for configuring the AstroNvim User Interface
|
||||
-- Configuration documentation can be found with `:h astroui`
|
||||
-- NOTE: We highly recommend setting up the Lua Language Server (`:LspInstall lua_ls`)
|
||||
-- as this provides autocomplete and documentation while editing
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"AstroNvim/astroui",
|
||||
---@type AstroUIOpts
|
||||
opts = {
|
||||
-- change colorscheme
|
||||
colorscheme = "cyberdream",
|
||||
-- AstroUI allows you to easily modify highlight groups easily for any and all colorschemes
|
||||
highlights = require "plugins.configs.ui.highlights",
|
||||
-- Icons can be configured throughout the interface
|
||||
icons = require "plugins.configs.ui.icons",
|
||||
status = require "plugins.configs.ui.status",
|
||||
},
|
||||
}
|
||||
40
lua/plugins/auto-save.lua
Normal file
40
lua/plugins/auto-save.lua
Normal file
@@ -0,0 +1,40 @@
|
||||
return {
|
||||
"okuuva/auto-save.nvim",
|
||||
cmd = "ASToggle", -- optional for lazy loading on command
|
||||
event = { "InsertLeave", "TextChanged" }, -- optional for lazy loading on trigger events
|
||||
opts = {
|
||||
-- your config goes here
|
||||
-- or just leave it empty :)
|
||||
enabled = true, -- start auto-save when the plugin is loaded (i.e. when your package manager loads it)
|
||||
execution_message = {
|
||||
enabled = false,
|
||||
message = function() -- message to print on save
|
||||
return ("AutoSave: saved at " .. vim.fn.strftime "%H:%M:%S")
|
||||
end,
|
||||
dim = 0.18, -- dim the color of `message`
|
||||
cleaning_interval = 1250, -- (milliseconds) automatically clean MsgArea after displaying `message`. See :h MsgArea
|
||||
},
|
||||
trigger_events = { -- See :h events
|
||||
immediate_save = { "BufLeave", "FocusLost" }, -- vim events that trigger an immediate save
|
||||
defer_save = { "InsertLeave", "TextChanged" }, -- vim events that trigger a deferred save (saves after `debounce_delay`)
|
||||
cancel_defered_save = { "InsertEnter" }, -- vim events that cancel a pending deferred save
|
||||
},
|
||||
-- function that takes the buffer handle and determines whether to save the current buffer or not
|
||||
-- return true: if buffer is ok to be saved
|
||||
-- return false: if it's not ok to be saved
|
||||
-- if set to `nil` then no specific condition is applied
|
||||
--
|
||||
condition = function(buf)
|
||||
-- Check if vim-visual-multi is active
|
||||
local visual_multi_active = vim.g.VM_is_active or false
|
||||
if visual_multi_active then return false end
|
||||
-- Additional conditions can be added here if needed
|
||||
return true
|
||||
end,
|
||||
|
||||
write_all_buffers = false, -- write all buffers when the current one meets `condition`
|
||||
noautocmd = false, -- do not execute autocmds when saving
|
||||
lockmarks = false, -- lock marks when saving, see `:h lockmarks` for more details
|
||||
debounce_delay = 500, -- delay after which a pending save is executed
|
||||
},
|
||||
}
|
||||
74
lua/plugins/cmp.lua
Normal file
74
lua/plugins/cmp.lua
Normal file
@@ -0,0 +1,74 @@
|
||||
return {
|
||||
{
|
||||
"onsails/lspkind.nvim",
|
||||
opts = {
|
||||
symbol_map = require "plugins.configs.ui.lspkind",
|
||||
},
|
||||
},
|
||||
{
|
||||
"hrsh7th/nvim-cmp",
|
||||
opts = function(_, opts)
|
||||
local cmp = require "cmp"
|
||||
local luasnip = require "luasnip"
|
||||
|
||||
local function has_words_before()
|
||||
local line, col = (unpack or table.unpack)(vim.api.nvim_win_get_cursor(0))
|
||||
return col ~= 0 and vim.api.nvim_buf_get_lines(0, line - 1, line, true)[1]:sub(col, col):match "%s" == nil
|
||||
end
|
||||
|
||||
return require("astrocore").extend_tbl(opts, {
|
||||
-- Configure window style
|
||||
window = {
|
||||
completion = {
|
||||
winhighlight = "Normal:Pmenu,CursorLine:PmenuSel,Search:None",
|
||||
border = "none",
|
||||
side_padding = 0,
|
||||
},
|
||||
},
|
||||
formatting = {
|
||||
-- Show icon at the beginning and menu at the end
|
||||
fields = { "kind", "abbr", "menu" },
|
||||
format = function(entry, vim_item)
|
||||
local kind = require("lspkind").cmp_format { mode = "symbol_text", maxwidth = 50 }(entry, vim_item)
|
||||
local strings = vim.split(kind.kind, "%s", { trimetry = true })
|
||||
kind.kind = " " .. (strings[1] or "") .. " "
|
||||
kind.menu = " [" .. (strings[2] or "") .. "]"
|
||||
return kind
|
||||
end,
|
||||
},
|
||||
-- Always select the first option
|
||||
completion = {
|
||||
completeopt = "menu,menuone,noinsert",
|
||||
},
|
||||
-- Custom mapping
|
||||
mapping = {
|
||||
-- Esc to close completion menu
|
||||
["<Esc>"] = cmp.mapping { i = cmp.mapping.abort(), c = cmp.mapping.close() },
|
||||
-- Tab to select completion
|
||||
["<Tab>"] = cmp.mapping(function(fallback)
|
||||
if cmp.visible() and has_words_before() then
|
||||
cmp.confirm { select = true }
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
-- Use <C-n> and <C-p> to select luasnip
|
||||
["<C-n>"] = cmp.mapping(function(fallback)
|
||||
if luasnip.jumpable(1) then
|
||||
luasnip.jump(1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
["<C-p>"] = cmp.mapping(function(fallback)
|
||||
if luasnip.jumpable(-1) then
|
||||
luasnip.jump(-1)
|
||||
else
|
||||
fallback()
|
||||
end
|
||||
end, { "i", "s" }),
|
||||
},
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
31
lua/plugins/code-runner.lua
Normal file
31
lua/plugins/code-runner.lua
Normal file
@@ -0,0 +1,31 @@
|
||||
return {
|
||||
"CRAG666/code_runner.nvim",
|
||||
opts = {
|
||||
filetype = {
|
||||
java = {
|
||||
"cd $dir &&",
|
||||
"javac $fileName &&",
|
||||
"java $fileNameWithoutExt",
|
||||
},
|
||||
python = {
|
||||
"cd $dir &&",
|
||||
"python3 -u $fileName",
|
||||
},
|
||||
rust = {
|
||||
"cd $dir &&",
|
||||
"rustc $fileName &&",
|
||||
"$dir/$fileNameWithoutExt",
|
||||
},
|
||||
},
|
||||
},
|
||||
keys = {
|
||||
|
||||
{ "<leader>r", ":RunCode<CR>", mode = "n", noremap = true, silent = false, desc = "Run code" },
|
||||
{ "<leader>rf", ":RunFile<CR>", mode = "n", noremap = true, silent = false, desc = "Run file" },
|
||||
{ "<leader>rft", ":RunFile tab<CR>", mode = "n", noremap = true, silent = false, desc = "Run file in new tab" },
|
||||
{ "<leader>rp", ":RunProject<CR>", mode = "n", noremap = true, silent = false, desc = "Run project" },
|
||||
{ "<leader>rc", ":RunClose<CR>", mode = "n", noremap = true, silent = false, desc = "Close run" },
|
||||
{ "<leader>crf", ":CRFiletype<CR>", mode = "n", noremap = true, silent = false, desc = "Change run filetype" },
|
||||
{ "<leader>crp", ":CRProjects<CR>", mode = "n", noremap = true, silent = false, desc = "Change run projects" },
|
||||
},
|
||||
}
|
||||
64
lua/plugins/colorscheme.lua
Normal file
64
lua/plugins/colorscheme.lua
Normal file
@@ -0,0 +1,64 @@
|
||||
return {
|
||||
{
|
||||
"catppuccin/nvim",
|
||||
name = "catppuccin",
|
||||
opts = {
|
||||
flavour = "mocha", -- latte, frappe, macchiato, mocha
|
||||
background = { -- :h background
|
||||
light = "latte",
|
||||
dark = "mocha",
|
||||
},
|
||||
color_overrides = {
|
||||
mocha = {
|
||||
rosewater = "#efc9c2",
|
||||
flamingo = "#ebb2b2",
|
||||
pink = "#f2a7de",
|
||||
mauve = "#b889f4",
|
||||
red = "#ea7183",
|
||||
maroon = "#ea838c",
|
||||
peach = "#f39967",
|
||||
yellow = "#eaca89",
|
||||
green = "#96d382",
|
||||
teal = "#78cec1",
|
||||
sky = "#91d7e3",
|
||||
sapphire = "#68bae0",
|
||||
blue = "#739df2",
|
||||
lavender = "#a0a8f6",
|
||||
text = "#b5c1f1",
|
||||
subtext1 = "#a6b0d8",
|
||||
subtext0 = "#959ec2",
|
||||
overlay2 = "#848cad",
|
||||
overlay1 = "#717997",
|
||||
overlay0 = "#63677f",
|
||||
surface2 = "#505469",
|
||||
surface1 = "#3e4255",
|
||||
surface0 = "#2c2f40",
|
||||
base = "#1a1c2a",
|
||||
mantle = "#141620",
|
||||
crust = "#0e0f16",
|
||||
},
|
||||
},
|
||||
integrations = {
|
||||
aerial = true,
|
||||
alpha = true,
|
||||
cmp = true,
|
||||
dap = true,
|
||||
dap_ui = true,
|
||||
gitsigns = true,
|
||||
illuminate = true,
|
||||
markdown = true,
|
||||
mason = true,
|
||||
native_lsp = true,
|
||||
neotree = true,
|
||||
notify = true,
|
||||
semantic_tokens = true,
|
||||
symbols_outline = true,
|
||||
telescope = true,
|
||||
treesitter = true,
|
||||
ts_rainbow = false,
|
||||
which_key = true,
|
||||
window_picker = true,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
34
lua/plugins/configs/lsp/config/basedpyright.lua
Normal file
34
lua/plugins/configs/lsp/config/basedpyright.lua
Normal file
@@ -0,0 +1,34 @@
|
||||
return {
|
||||
before_init = function(_, c)
|
||||
if not c.settings then c.settings = {} end
|
||||
if not c.settings.python then c.settings.python = {} end
|
||||
c.settings.python.pythonPath = vim.fn.exepath "python"
|
||||
end,
|
||||
settings = {
|
||||
basedpyright = {
|
||||
analysis = {
|
||||
-- diagnosticMode = "workspace",
|
||||
diagnosticMode = "openFilesOnly",
|
||||
typeCheckingMode = "basic",
|
||||
autoImportCompletions = true,
|
||||
autoSearchPath = true,
|
||||
inlayHints = {
|
||||
variableTypes = true,
|
||||
functionReturnTypes = true,
|
||||
callArgumentNames = true,
|
||||
pytestParameters = true,
|
||||
},
|
||||
useLibraryCodeForTypes = true,
|
||||
diagnosticSeverityOverrides = {
|
||||
reportUnusedImport = "information",
|
||||
reportUnusedFunction = "information",
|
||||
reportUnusedVariable = "information",
|
||||
-- reportGeneralTypeIssues = "none",
|
||||
-- reportOptionalMemberAccess = "none",
|
||||
-- reportOptionalSubscript = "none",
|
||||
-- reportPrivateImportUsage = "none",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
19
lua/plugins/configs/lsp/config/clangd.lua
Normal file
19
lua/plugins/configs/lsp/config/clangd.lua
Normal file
@@ -0,0 +1,19 @@
|
||||
return {
|
||||
capabilities = {
|
||||
offsetEncoding = "utf-8",
|
||||
},
|
||||
cmd = {
|
||||
"clangd",
|
||||
"--background-index",
|
||||
"--clang-tidy",
|
||||
"--all-scopes-completion",
|
||||
"--header-insertion=iwyu",
|
||||
"--completion-style=detailed",
|
||||
"--fallback-style=Microsoft",
|
||||
},
|
||||
init_options = {
|
||||
clangdFileStatus = true,
|
||||
usePlaceholders = false,
|
||||
completeUnimported = true,
|
||||
},
|
||||
}
|
||||
20
lua/plugins/configs/lsp/formatting.lua
Normal file
20
lua/plugins/configs/lsp/formatting.lua
Normal file
@@ -0,0 +1,20 @@
|
||||
-- Customize lsp formatting options
|
||||
return { -- control auto formatting on save
|
||||
format_on_save = {
|
||||
enabled = false, -- enable or disable format on save globally
|
||||
allow_filetypes = { -- enable format on save for specified filetypes only
|
||||
-- "go",
|
||||
},
|
||||
ignore_filetypes = { -- disable format on save for specified filetypes
|
||||
-- "lua",
|
||||
},
|
||||
},
|
||||
disabled = { -- disable formatting capabilities for the listed language servers
|
||||
-- disable lua_ls formatting capability if you want to use StyLua to format your lua code
|
||||
-- "lua_ls",
|
||||
},
|
||||
timeout_ms = 1000, -- default format timeout
|
||||
-- filter = function(client) -- fully override the default formatting function
|
||||
-- return true
|
||||
-- end
|
||||
}
|
||||
182
lua/plugins/configs/ui/alpha.lua
Normal file
182
lua/plugins/configs/ui/alpha.lua
Normal file
@@ -0,0 +1,182 @@
|
||||
-- Store alpha themes
|
||||
|
||||
local banners = {
|
||||
[1] = {
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣤⣤⣶⣶⣶⣶⣶⣦⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣦⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⠿⠿⠿⢿⣿⣿⣿⠿⠿⠿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠿⢿⣿⣿⣿⡿⠿⠿⢿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⡄⠀⠀⠸⢿⣿⠟⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠘⢿⣿⡿⠁⠀⠀⣾⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⣿⣿⣿⣿⣿⠟⢹⠛⢿⣿⣿⣿⣿⣿⣿⣶⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⣸⡀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣠⣼⣿⣷⣤⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠈⠉⠁⠈⠉⠁⠉⠉⠀⠉⠉⠈⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[2] = {
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ⣴⣶⣤⡤⠦⣤⣀⣤⠆ ⣈⣭⣿⣶⣿⣦⣼⣆ ",
|
||||
" ⠉⠻⢿⣿⠿⣿⣿⣶⣦⠤⠄⡠⢾⣿⣿⡿⠋⠉⠉⠻⣿⣿⡛⣦ ",
|
||||
" ⠈⢿⣿⣟⠦ ⣾⣿⣿⣷ ⠻⠿⢿⣿⣧⣄ ",
|
||||
" ⣸⣿⣿⢧ ⢻⠻⣿⣿⣷⣄⣀⠄⠢⣀⡀⠈⠙⠿⠄ ",
|
||||
" ⢠⣿⣿⣿⠈ ⣻⣿⣿⣿⣿⣿⣿⣿⣛⣳⣤⣀⣀ ",
|
||||
" ⢠⣧⣶⣥⡤⢄ ⣸⣿⣿⠘ ⢀⣴⣿⣿⡿⠛⣿⣿⣧⠈⢿⠿⠟⠛⠻⠿⠄ ",
|
||||
" ⣰⣿⣿⠛⠻⣿⣿⡦⢹⣿⣷ ⢊⣿⣿⡏ ⢸⣿⣿⡇ ⢀⣠⣄⣾⠄ ",
|
||||
" ⣠⣿⠿⠛ ⢀⣿⣿⣷⠘⢿⣿⣦⡀ ⢸⢿⣿⣿⣄ ⣸⣿⣿⡇⣪⣿⡿⠿⣿⣷⡄ ",
|
||||
" ⠙⠃ ⣼⣿⡟ ⠈⠻⣿⣿⣦⣌⡇⠻⣿⣿⣷⣿⣿⣿ ⣿⣿⡇ ⠛⠻⢷⣄ ",
|
||||
" ⢻⣿⣿⣄ ⠈⠻⣿⣿⣿⣷⣿⣿⣿⣿⣿⡟ ⠫⢿⣿⡆ ",
|
||||
" ⠻⣿⣿⣿⣿⣶⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⡟⢀⣀⣤⣾⡿⠃ ",
|
||||
" ",
|
||||
},
|
||||
[3] = {
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡰⢄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⢀⢄⠀⠀⡴⠁⠈⡆⠀⢀⡤⡀⠀⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠢⣄⠀⠀⡇⠀⡕⠀⢸⠀⢠⠃⠀⢮⠀⠹⠀⠀⣠⢾⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⣞⠀⢀⠇⠀⡇⠀⡸⠀⠈⣆⠀⡸⠀⢰⠀⠀⡇⣸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⠘⢶⣯⣊⣄⡨⠟⡡⠁⠐⢌⠫⢅⣢⣑⣵⠶⠁⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠀⣼⣀⠀⢀⠒⠒⠂⠉⠀⠀⠀⠀⠁⠐⠒⠂⡀⠀⣸⣄⠀⠀⠀⠀⠀⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⢮⣵⣶⣦⡩⡲⣄⠀⠀⣿⣿⣽⠲⠭⣥⣖⣂⣀⣀⣀⣀⣐⣢⡭⠵⠖⣿⣿⢫⠀⠀⣠⣖⣯⣶⣶⣮⡷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⢸⡟⢉⣉⠙⣿⣿⣦⠀⣿⣿⣿⣿⣷⣲⠶⠤⠭⣭⡭⠭⠴⠶⣖⣾⣿⣿⡿⢸⢀⣼⣿⡿⠋⣉⠉⢳⠁⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠮⣳⣴⣫⠂⠘⣿⣿⣇⢷⢻⣿⣿⣿⣿⣿⣷⣶⣶⣶⣶⣿⣿⣿⣿⣿⢿⢃⡟⣼⣿⣿⠁⠸⣘⣢⣚⠜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠈⢧⢻ ⣿⣿⣟⠻⣿⣿⣿⣿⠛⣩⣿⣿ ⢟⡞⢀⣿⣿⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣒⣒⣦⣄⣿⣿⣿⢀⡬⣟⣯ ⣿⢷⣼⡟⢿⣿⡿⣿⣿ ⡻⣤⡀⣿⣿⣸⡠⢔⣒⡒⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⢾⣟⣅⠉⢎⣽⣿⣿⡏⡟⣤⣮⣿⣿ ⡏⣿⠀⠀⣿⢡⣷ ⣿⣟⢎⣷⢻⣿⣿⣾⡟⠉⣽⡇⡇⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⡴⣫⣭⣭⣍⡲⢄⠀⠀⠀⠀⠈⠻⠋⣠⡮⣻⣿⣿⠃⠳⣏⣼⣿⣿⣿⣿⡇⣿⣴⣴⣿⣾⣿⣿⣿⡿⣄⣩⠏⢸⣿⣿⣿⣧⡀⠛⠞⠁⠀⠀⠀⢀⣤⣺⣭⣭⣭⡝⢦⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⢸⢹⡟⠁⠀⠉⢫⡳⣵⣄⠀⠀⢀⠴⢊⣿⣾⣿⣿⣿⠀⠀⠀⠻⣬⣽⣿⣿⣿⣿ ⣿⣿⣿⣿⣯⣵⠏⠀⠀⢸⣿⣿⣿⣿⣿⣗⢤⡀⠀⠀⣠⣿⢟⠟⠉⠀⠈⢻⢸⡆⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠘⢏⢧⣤⡀⠀⠀⣇⢻⣿⣆⢔⢕⣵⠟⣏⣿⣿⣿⠋⣵⠚⠄⣾⣿⣿⣿⡿⠟⣛⣛⣛⣛⠻⣿⣿⣿⣿⣧⢰⠓⣏⠻⣿⣿⣿⢹⠻⣿⣿⢦⣸⣿⡏⡾⠀⠀⢠⣤⠎⡼⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠈⠑⠂⠁⠀⠀⣿⠸⣿⢏⢂⣾⠇⠀⣿⣿⣿⡇⡆⠹⢷⣴⣿⡿⠟⠉⣐⡀⠄⣠⡄⡠⣁⡠⠙⠻⢿⣿⣴⡾⠃⢠⢹⣿⣿⢸⠀⢹⣿⣷⢹⣿⢃⡇⠀⠀⠈⠒⠋⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣿⢀⣿⣿⡀⠀⢫⣿⣿⣷⣙⠒⠀⠄⠐⠂⣼⠾⣵⠾⠟⣛⣛⠺⢷⣮⠷⣢⠐⠂⠀⠀⠒⣣⣾⣿⡿⡎⠀⢠⣿⣿⡄⣿⣸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣟⣿⢸⣿⣿⣷⣄⡈⣾⣿⣿⣿⣿⣿⠻⡷⢺⠃⠠⠁⠈⠋⠀⠀⠉⠁⠙⡀⠘⡗⣾⠿⣿⣿⣿⣿⣿⡿⢀⣴⣿⣿⡿⢃⣯⣽⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⡆⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣵⡞⠀⠁⠐⢁⠎⠄⣠⠀⠀⡄⠀⢳⠈⠆⠈⠈⢳⣯⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⣸⡷⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣌⠛⢿⣿⣿⣿⣿⣿⣿⠿⠋⣠⣢⠂⠀⢂⠌⠀⠃⠀⠀⠘⠀⢢⡑⠀⠰⣵⡀⠻⢿⣿⣿⣿⣿⣿⣿⡿⠋⣰⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠳⣤⣭⢛⣻⠿⣿⣷⣶⢞⡟⡁⢀⢄⠎⠀⠀⠀⠀⠀⡀⠁⠀⠳⢠⠀⢈⢿⢳⣶⣾⣿⠿⣟⣛⣅⡴⠞⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠻⠿⠿⡟⢜⠔⡠⢊⠔⠀⡆⠀⡆⠀⠀⢡⢰⢠⠀⢢⠱⣌⢂⠃⢿⠿⠿⠟⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⢤⣊⡰⠵⢺⠉⠸⠀⢰⢃⠀⠀⠀⠀⠀⠸⢸⠀⠀⡇⡞⡑⠬⢆⣑⢤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀⠘⣾⡸⢀⡜⡾⡀⡇⠀⠀⡴⢠⢻⢦⠀⢃⡿⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⡎⠀⠱⡡⠐⠀⠠⠃⢢⠋⠀⢧⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢤⡀⢀⠔⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠱⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[4] = {
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣤⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⠿⠿⠿⠿⢿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣶⣾⣿⣿⠀⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⠀⣿⣿⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣾⣿⡿⠟⠛⠉⠉⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠉⠉⠛⠻⢿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⡿⠋⠀⠀⠀⠀⠀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⠀⠀⠀⠀⠀⠙⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠃⠀⠀⣠⣶⣾⣿⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⣿⣷⣦⣄⠀⠀⠸⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⠀⢀⣾⣿⡿⠛⠉⠀⣿⣿⡇⠀⠀⣀⣀⠀⠀⠀⠀⠀⣀⣀⠀⠀⢸⣿⣿⠀⠉⠛⢿⣿⣷⡀⠀⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣆⢸⣿⣿⠀⠀⠀⠀⣿⣿⡇⠀⢾⣿⣿⡇⠀⠀⠀⢾⣿⣿⡇⠀⢸⣿⣿⠀⠀⠀⠈⣿⣿⡇⣼⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣄⠀⠀⠀⣿⣿⡇⠀⠈⠙⠋⠀⠀⠀⠀⠈⠙⠋⠀⠀⢸⣿⣿⠀⠀⠀⣰⣿⣿⣿⣿⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣷⣶⣶⣿⣿⣿⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣶⣿⣿⣿⣶⣶⣿⣿⣿⣿⡿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠛⠛⠛⠛⠛⠛⠛⠛⢻⣿⣿⠛⣿⣿⣿⢻⣿⣿⠛⠛⠛⠛⠛⠛⠛⠛⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⠀⢸⣿⣿⠀⣿⣿⣿⢸⣿⣿⠀⠀⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⣈⣉⣉⣉⣉⡉⢹⣿⣿⠀⢸⣿⣿⠀⣿⣿⣿⢸⣿⣿⠀⠀⣿⣿⡏⢉⣉⣉⣉⣉⣁⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⣿⣿⠀⢸⣿⣿⠀⣿⣿⣿⢸⣿⣿⠀⠀⣿⣿⡇⢸⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⢸⣿⣿⠀⢸⣿⣿⠀⣿⣿⣿⢸⣿⣿⠀⠀⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⢸⣿⣿⠀⢸⣿⣿⠀⣿⣿⣿⢸⣿⣿⠀⠀⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⡇⢸⣿⣿⣄⣼⣿⣿⠀⣿⣿⣿⠸⣿⣿⣆⣠⣿⣿⡇⢸⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣄⠻⢿⣿⣿⠿⢋⣴⣿⣿⣿⣦⡙⠿⣿⣿⡿⠛⣠⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣷⣶⣤⣴⣶⣿⣿⠿⠙⢿⣿⣿⣶⣦⣴⣶⣿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠻⠿⠿⠛⠋⠁⠀⠀⠀⠈⠙⠛⠿⠿⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[5] = {
|
||||
[[ ██████ ]],
|
||||
[[ ████▒▒▒▒▒▒████ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ]],
|
||||
[[ ██▒▒▒▒▒▒ ▒▒▓▓▒▒▒▒▒▒ ▓▓▓▓ ]],
|
||||
[[ ██▒▒▒▒▒▒ ▒▒▓▓▒▒▒▒▒▒ ▒▒▓▓ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒ ▒▒▒▒▒▒▒▒ ██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒██ ]],
|
||||
[[ ██▒▒██▒▒▒▒▒▒██▒▒▒▒▒▒▒▒██▒▒▒▒██ ]],
|
||||
[[ ████ ██▒▒██ ██▒▒▒▒██ ██▒▒██ ]],
|
||||
[[ ██ ██ ████ ████ ]],
|
||||
},
|
||||
[6] = {
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⣤⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⣿⡆⠀⠀⠀⢸⣿⣿⠿⠿⢿⣿⣿⣿⣿⡿⠿⠿⣿⣿⡇⠀⠀⠀⣾⣿⣿⡿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⢿⣿⠿⠿⠿⠿⣿⣿⣿⡏⠀⠀⠀⢹⣿⡇⠀⠀⠀⢸⣿⢱⣶⣴⣶⢹⣿⣿⡏⣶⣦⣶⡎⣿⡇⠀⠀⠀⢿⣿⠁⠀⠀⠈⣿⣿⣿⡿⠟⣋⣽⣿⣿⠇⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠘⣿⣧⣄⣀⣴⣿⣿⣿⣷⣄⣀⣠⣾⣟⠀⠀⠀⠀⠈⣿⣦⣙⣛⣡⣾⡿⢿⣷⣌⣛⣋⣴⣿⠁⠀⠀⠀⠘⣿⣦⣄⣀⣴⣿⣿⣿⣿⣶⣶⣤⣿⡟⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣏⣼⣌⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣰⣆⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠈⢿⣿⣿⣿⣿⣏⣼⣌⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠉⠉⢿⣿⣿⣿⣿⣿⣿⡏⠉⠁⠀⠀⠀⠀⠀⠀⠀⠉⠉⢹⣿⣿⣿⣿⣿⣿⡏⠉⠉⠀⠀⠀⠀⠀⠀⠀⠉⠉⣿⣿⣿⣿⣿⣿⣿⡏⠉⠁⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠁⠁⠉⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠁⠁⠉⠉⠈⠈⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠁⠁⠁⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[7] = {
|
||||
"⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣾⣿⣿⣿⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣶⣿⣿⣿⣿⣶⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣶⣶⣿⣿⣿⣷⣶⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⡿⠿⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠿⢿⣿⣿⣿⡇⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⡟⠁⠀⠀⠀⠈⢻⣿⣿⣿⠀⠀⠀⠀⠀⠀⢸⣿⣿⠏⣠⣤⡄⣠⣤⡌⢿⣿⣿⣿⣿⡿⢁⣤⣄⢀⣤⣄⠹⣿⣿⡇⠀⠀⠀⠀⠀⢺⣿⣿⡿⠋⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠛⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠛⠛⠛⠛⠛⠛⢛⣿⣮⣿⣿⣿⠀⠀⠀⠀⠀⠀⢈⣿⣿⡟⠀⠀⠀⠀⠀⠀⠸⣿⣿⠀⢿⣿⣿⣿⣿⡟⢸⣿⣿⣿⣿⡇⠸⣿⣿⣿⣿⡿⠀⣿⣿⠇⠀⠀⠀⠀⠀⢸⣿⣿⡇⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⠋⠁⠠⢴⣾⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣧⡀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⢀⣼⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⢻⣿⣆⠀⠙⠿⠟⠋⢀⣾⣿⣿⣿⣿⣷⡀⠈⠻⡿⠋⠁⣰⣿⡟⠀⠀⠀⠀⠀⠀⠀⢿⣿⣷⣄⠀⠀⠀⢀⣰⣿⣿⣿⣿⣿⣿⣷⣶⣦⣤⣄⣼⣿⣿⡏⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣶⣿⣿⣿⣿⠟⠉⠻⣿⣿⣿⣿⣶⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣶⣶⣶⣾⣿⣿⡿⠋⠙⢿⣿⣿⣷⣶⣶⣶⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣷⣾⣿⣿⣿⡟⢻⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡆⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣠⣷⡀⢹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⢁⣴⣧⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⢀⣼⣆⢘⣿⣿⣿⣿⣿⣿⣿⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠋⠛⠋⠛⠙⠛⠙⠛⠙⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠛⠙⠛⠙⠛⠛⠋⠛⠋⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠛⠙⠛⠛⠋⠛⠋⠛⠋⠛⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[8] = {
|
||||
"⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣾⣿⣿⣿⣶⣶⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⢿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣻⣿⣿⣿⡟⠁⠀⠀⠀⠈⢻⣿⣿⣿⠀⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠛⠛⠛⠛⠛⠛⢛⣿⣮⣿⣿⣿⠀⠀⠀⠀⠀⠀⢈⣿⣿⡟⠀⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣧⡀⠀⠀⠀⢀⣼⣿⣿⣿⣿⣿⣧⡀⠀⠀⠀⢀⣼⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣶⣿⣿⣿⣿⠟⠉⠻⣿⣿⣿⣿⣶⣿⣿⣿⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⡇⣠⣷⡀⢹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⠋⠛⠋⠛⠙⠛⠙⠛⠙⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[9] = {
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣶⣿⣿⣿⣿⣶⣶⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣶⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⡿⠿⠛⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠟⠛⠿⢿⣿⣿⣿⡇⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⢸⣿⣿⠏⣠⣤⡄⣠⣤⡌⢿⣿⣿⣿⣿⡿⢁⣤⣄⢀⣤⣄⠹⣿⣿⡇⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⠸⣿⣿⠀⢿⣿⣿⣿⣿⡟⢸⣿⣿⣿⣿⡇⠸⣿⣿⣿⣿⡿⠀⣿⣿⠇⠀⠀⠀⠀⠀ ",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⢻⣿⣆⠀⠙⠿⠟⠋⢀⣾⣿⣿⣿⣿⣷⡀⠈⠻⡿⠋⠁⣰⣿⡟⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣶⣶⣶⣾⣿⣿⡿⠋⠙⢿⣿⣿⣷⣶⣶⣶⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠸⣿⣿⣿⣿⣿⣿⣿⣿⣿⢁⣴⣧⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠙⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠛⠙⠛⠙⠛⠛⠋⠛⠋⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
|
||||
},
|
||||
[10] = {
|
||||
[[ __ ]],
|
||||
[[ ___ ___ ___ __ __ /\_\ ___ ___ ]],
|
||||
[[ / _ `\ / __`\ / __`\/\ \/\ \\/\ \ / __` __`\ ]],
|
||||
[[/\ \/\ \/\ __//\ \_\ \ \ \_/ |\ \ \/\ \/\ \/\ \ ]],
|
||||
[[\ \_\ \_\ \____\ \____/\ \___/ \ \_\ \_\ \_\ \_\]],
|
||||
[[ \/_/\/_/\/____/\/___/ \/__/ \/_/\/_/\/_/\/_/]],
|
||||
},
|
||||
}
|
||||
|
||||
return banners
|
||||
215
lua/plugins/configs/ui/heirline.lua
Normal file
215
lua/plugins/configs/ui/heirline.lua
Normal file
@@ -0,0 +1,215 @@
|
||||
local M = {}
|
||||
|
||||
local status = require "astroui.status"
|
||||
local get_icon = require("astroui").get_icon
|
||||
local is_available = require("astrocore").is_available
|
||||
local path_func = status.provider.filename { modify = ":.:h", fallback = "" }
|
||||
|
||||
-- custom statusline
|
||||
M.statusline = {
|
||||
hl = { fg = "fg", bg = "bg" },
|
||||
-- Show mode text
|
||||
status.component.mode {
|
||||
-- enable mode text with padding as well as an icon before it
|
||||
mode_text = {
|
||||
icon = { kind = "Mode", padding = { left = 0, right = 1 } },
|
||||
},
|
||||
-- surround the component with a separators
|
||||
surround = {
|
||||
separator = "left",
|
||||
},
|
||||
},
|
||||
status.component.file_info {
|
||||
file_icon = { padding = { left = 0, right = 1 } },
|
||||
filename = { fallback = "Empty" },
|
||||
filetype = false,
|
||||
file_modified = false,
|
||||
surround = {
|
||||
separator = "none",
|
||||
color = "bg",
|
||||
},
|
||||
},
|
||||
status.component.git_branch {
|
||||
padding = { left = 2, right = 1 },
|
||||
surround = {
|
||||
separator = "none",
|
||||
color = "bg",
|
||||
},
|
||||
},
|
||||
-- Add a icon to represent diagnostic and git git diff
|
||||
status.component.builder {
|
||||
provider = function() return get_icon "Diagnostic" .. "/" .. get_icon "Github" end,
|
||||
hl = { fg = "black" },
|
||||
surround = {
|
||||
separator = { " ", "" },
|
||||
color = "#81ab9e",
|
||||
},
|
||||
},
|
||||
status.component.diagnostics {
|
||||
surround = {
|
||||
separator = "none",
|
||||
color = "bg",
|
||||
},
|
||||
},
|
||||
status.component.git_diff {
|
||||
padding = { left = 1 },
|
||||
surround = {
|
||||
separator = "none",
|
||||
color = "bg",
|
||||
},
|
||||
},
|
||||
status.component.fill(),
|
||||
-- Show search counts and results
|
||||
{
|
||||
condition = function(self)
|
||||
local query = vim.fn.getreg "/"
|
||||
if query == "" then return false end
|
||||
query = query:gsub([[^\V]], "")
|
||||
query = query:gsub([[\<]], ""):gsub([[\>]], "")
|
||||
|
||||
local search_count = vim.fn.searchcount { recompute = 1, maxcount = -1 }
|
||||
if search_count.total == 0 then return false end
|
||||
|
||||
self.query = query
|
||||
self.count = search_count
|
||||
return true
|
||||
end,
|
||||
status.component.builder {
|
||||
provider = function(self)
|
||||
return status.utils.stylize(" " .. self.query .. " " .. self.count.current .. "/" .. self.count.total, {
|
||||
icon = { kind = "Search" },
|
||||
})
|
||||
end,
|
||||
hl = { fg = "black" },
|
||||
surround = {
|
||||
separator = "left",
|
||||
color = "search_bg",
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Show file encoding
|
||||
status.component.builder {
|
||||
provider = function()
|
||||
return status.utils.stylize(string.upper(vim.bo.fileencoding), {
|
||||
icon = { kind = "FileEncoding", padding = { right = 1 } },
|
||||
})
|
||||
end,
|
||||
hl = { fg = "text_fg" },
|
||||
padding = { right = 1 },
|
||||
},
|
||||
-- Show tab width
|
||||
status.component.builder {
|
||||
provider = function()
|
||||
return status.utils.stylize(tostring(vim.bo.tabstop), {
|
||||
icon = { kind = "TabWidth", padding = { right = 1 } },
|
||||
})
|
||||
end,
|
||||
hl = { fg = "text_fg" },
|
||||
padding = { right = 1 },
|
||||
},
|
||||
-- Show Grapple tag
|
||||
status.component.builder {
|
||||
condition = function()
|
||||
if status.condition.is_file and is_available "grapple.nvim" then return true end
|
||||
return false
|
||||
end,
|
||||
provider = function()
|
||||
local tag = tostring(require("grapple").name_or_index())
|
||||
if tag == "nil" then tag = "NO" end
|
||||
return status.utils.stylize(tag, {
|
||||
icon = { kind = "Grapple", padding = { right = 1 } },
|
||||
})
|
||||
end,
|
||||
|
||||
hl = { fg = "text_fg" },
|
||||
padding = { right = 1 },
|
||||
},
|
||||
-- Show Codeium status
|
||||
status.component.builder {
|
||||
condition = function()
|
||||
if status.condition.lsp_attached and is_available "neocodeium" then return true end
|
||||
return false
|
||||
end,
|
||||
provider = function()
|
||||
local codeium_status = "OFF"
|
||||
if require("neocodeium.options").options.enabled == true then codeium_status = "ON" end
|
||||
return status.utils.stylize(codeium_status, {
|
||||
icon = { kind = "Codeium", padding = { right = 1 } },
|
||||
})
|
||||
end,
|
||||
hl = { fg = "text_fg" },
|
||||
padding = { right = 1 },
|
||||
},
|
||||
status.component.lsp {
|
||||
lsp_client_names = {
|
||||
icon = { kind = "ActiveLSP", padding = { right = 1 } },
|
||||
},
|
||||
surround = { separator = "left" },
|
||||
},
|
||||
{
|
||||
status.component.builder {
|
||||
{ provider = get_icon "ScrollText" },
|
||||
padding = { right = 1 },
|
||||
hl = { fg = "black" },
|
||||
surround = {
|
||||
separator = { " ", "" },
|
||||
color = { main = "nav_icon_bg", left = "bg" },
|
||||
},
|
||||
},
|
||||
status.component.nav {
|
||||
percentage = { padding = { left = 0 } },
|
||||
ruler = false,
|
||||
scrollbar = false,
|
||||
surround = { separator = { "", "" } },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
-- custom winbar
|
||||
M.winbar = {
|
||||
-- store the current buffer number
|
||||
init = function(self) self.bufnr = vim.api.nvim_get_current_buf() end,
|
||||
fallthrough = false, -- pick the correct winbar based on condition
|
||||
-- inactive winbar
|
||||
{
|
||||
condition = function() return not status.condition.is_active() end,
|
||||
-- show the path to the file relative to the working directory
|
||||
status.component.separated_path { path_func = path_func },
|
||||
-- add the file name and icon
|
||||
status.component.file_info {
|
||||
file_icon = { hl = status.hl.file_icon "winbar", padding = { left = 0 } },
|
||||
filename = {},
|
||||
filetype = false,
|
||||
file_modified = false,
|
||||
file_read_only = false,
|
||||
hl = status.hl.get_attributes("winbarnc", true),
|
||||
surround = false,
|
||||
update = "BufEnter",
|
||||
},
|
||||
},
|
||||
-- active winbar
|
||||
{
|
||||
-- show the path to the file relative to the working directory
|
||||
status.component.separated_path { path_func = path_func },
|
||||
-- add the file name and icon
|
||||
status.component.file_info { -- add file_info to breadcrumbs
|
||||
file_icon = { hl = status.hl.filetype_color, padding = { left = 0 } },
|
||||
filename = {},
|
||||
filetype = false,
|
||||
file_modified = false,
|
||||
file_read_only = false,
|
||||
hl = status.hl.get_attributes("winbar", true),
|
||||
surround = false,
|
||||
update = "BufEnter",
|
||||
},
|
||||
-- show the breadcrumbs
|
||||
status.component.breadcrumbs {
|
||||
icon = { hl = true },
|
||||
hl = status.hl.get_attributes("winbar", true),
|
||||
prefix = true,
|
||||
padding = { left = 0 },
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return M
|
||||
41
lua/plugins/configs/ui/highlights.lua
Normal file
41
lua/plugins/configs/ui/highlights.lua
Normal file
@@ -0,0 +1,41 @@
|
||||
return {
|
||||
init = function() -- this table overrides highlights in all themes
|
||||
local get_hlgroup = require("astroui").get_hlgroup
|
||||
local ui = require "astroui"
|
||||
local utils = require "astrocore"
|
||||
|
||||
local hl = {
|
||||
-- remove background of virtual texts
|
||||
DiagnosticVirtualTextError = { fg = get_hlgroup("DiagnosticError").fg, bg = "none" },
|
||||
DiagnosticVirtualTextHint = { fg = get_hlgroup("DiagnosticHint").fg, bg = "none" },
|
||||
DiagnosticVirtualTextInfo = { fg = get_hlgroup("DiagnosticInfo").fg, bg = "none" },
|
||||
DiagnosticVirtualTextWarn = { fg = get_hlgroup("DiagnosticWarn").fg, bg = "none" },
|
||||
|
||||
-- remove background of inlay hints
|
||||
LspInlayHint = { fg = get_hlgroup("LspInlayHint").fg, bg = "none" },
|
||||
}
|
||||
|
||||
if utils.is_available "kanagawa.nvim" and ui.config.colorscheme == "kanagawa" then
|
||||
local colors = require("kanagawa.colors").setup()
|
||||
local theme = colors.theme
|
||||
hl = utils.extend_tbl(hl, {
|
||||
Pmenu = { fg = theme.ui.shade0, bg = theme.ui.bg_p1 }, -- add `blend = vim.o.pumblend` to enable transparency
|
||||
PmenuSel = { fg = "NONE", bg = theme.ui.bg_p2 },
|
||||
PmenuSbar = { bg = theme.ui.bg_m1 },
|
||||
PmenuThumb = { bg = theme.ui.bg_p2 },
|
||||
TelescopeTitle = { fg = theme.ui.special, bold = true },
|
||||
TelescopePromptNormal = { bg = theme.ui.bg_p1 },
|
||||
TelescopePromptBorder = { fg = theme.ui.bg_p1, bg = theme.ui.bg_p1 },
|
||||
TelescopeResultsNormal = { fg = theme.ui.fg_dim, bg = theme.ui.bg_m1 },
|
||||
TelescopeResultsBorder = { fg = theme.ui.bg_m1, bg = theme.ui.bg_m1 },
|
||||
TelescopePreviewNormal = { bg = theme.ui.bg_dim },
|
||||
TelescopePromptNormalopePreviewBorder = { bg = theme.ui.bg_dim, fg = theme.ui.bg_dim },
|
||||
})
|
||||
end
|
||||
|
||||
return hl
|
||||
end,
|
||||
astrotheme = { -- a table of overrides/changes when applying the astrotheme theme
|
||||
-- Normal = { bg = "#000000" },
|
||||
},
|
||||
}
|
||||
59
lua/plugins/configs/ui/icons.lua
Normal file
59
lua/plugins/configs/ui/icons.lua
Normal file
@@ -0,0 +1,59 @@
|
||||
return {
|
||||
-- LSP
|
||||
ActiveLSP = "",
|
||||
ActiveTS = "",
|
||||
LSPLoaded = "",
|
||||
LSPLoading1 = "⠋",
|
||||
LSPLoading2 = "⠙",
|
||||
LSPLoading3 = "⠹",
|
||||
LSPLoading4 = "⠸",
|
||||
LSPLoading5 = "⠼",
|
||||
LSPLoading6 = "⠴",
|
||||
LSPLoading7 = "⠦",
|
||||
LSPLoading8 = "⠧",
|
||||
LSPLoading9 = "⠇",
|
||||
LSPLoading10 = "⠏",
|
||||
-- Git
|
||||
Github = "",
|
||||
GitAdd = "",
|
||||
GitBranch = "",
|
||||
GitChange = "",
|
||||
GitConflict = "",
|
||||
GitDelete = "",
|
||||
GitIgnored = "",
|
||||
GitRenamed = "",
|
||||
GitStaged = "✓",
|
||||
GitUnstaged = "✗",
|
||||
GitUntracked = "★",
|
||||
Neogit = "",
|
||||
-- Files
|
||||
Ellipsis = "",
|
||||
DefaultFile = "",
|
||||
FileModified = "",
|
||||
FileReadOnly = "",
|
||||
FoldClosed = "",
|
||||
FoldOpened = "",
|
||||
FolderClosed = "",
|
||||
FolderEmpty = "",
|
||||
FolderOpen = "",
|
||||
-- DAP
|
||||
DapBreakpoint = "",
|
||||
DapBreakpointCondition = "",
|
||||
DapBreakpointRejected = "",
|
||||
DapLogPoint = "",
|
||||
DapStopped = "",
|
||||
-- Diagnostics
|
||||
Diagnostic = "",
|
||||
DiagnosticError = "",
|
||||
DiagnosticHint = "",
|
||||
DiagnosticInfo = "",
|
||||
DiagnosticWarn = "",
|
||||
-- Misc
|
||||
Mode = " ",
|
||||
FileEncoding = "",
|
||||
ScrollText = "",
|
||||
TabWidth = "",
|
||||
Search = "",
|
||||
Grapple = "",
|
||||
Codeium = "",
|
||||
}
|
||||
38
lua/plugins/configs/ui/lspkind.lua
Normal file
38
lua/plugins/configs/ui/lspkind.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
-- LSP kind symbol map
|
||||
return {
|
||||
Array = "",
|
||||
Boolean = "",
|
||||
Class = "",
|
||||
Color = "",
|
||||
Constant = "",
|
||||
Constructor = "",
|
||||
Enum = "",
|
||||
EnumMember = "",
|
||||
Event = "",
|
||||
Field = "",
|
||||
File = "",
|
||||
Folder = "",
|
||||
Function = "",
|
||||
Interface = "",
|
||||
Key = "",
|
||||
Keyword = "",
|
||||
Method = "",
|
||||
Module = "",
|
||||
Namespace = "",
|
||||
Null = "",
|
||||
Number = "",
|
||||
Object = "",
|
||||
Operator = "",
|
||||
Package = " ",
|
||||
Property = "",
|
||||
Reference = "",
|
||||
Snippet = "",
|
||||
String = "",
|
||||
Struct = "",
|
||||
Text = "",
|
||||
TypeParameter = "",
|
||||
Unit = "ﱦ",
|
||||
Value = "",
|
||||
Variable = "",
|
||||
}
|
||||
|
||||
38
lua/plugins/configs/ui/status.lua
Normal file
38
lua/plugins/configs/ui/status.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
return {
|
||||
separators = {
|
||||
left = { " ", " " }, -- separator for the left side of the statusline
|
||||
right = { " ", "" }, -- separator for the right side of the statusline
|
||||
-- tab = { "", "" },
|
||||
},
|
||||
colors = function(hl)
|
||||
local get_hlgroup = require("astroui").get_hlgroup
|
||||
-- use helper function to get highlight group properties
|
||||
hl.text_fg = "#60b2a7"
|
||||
hl.insert = "#a9b665"
|
||||
hl.visual = "#e8b142"
|
||||
hl.replace = "#ea6962"
|
||||
hl.terminal = "#a89984"
|
||||
hl.file_info_fg = hl.text_fg
|
||||
hl.file_info_bg = "#bac2de"
|
||||
hl.git_branch_fg = "#bd81b6"
|
||||
hl.git_branch_bg = "#f5c2e7"
|
||||
hl.lsp_fg = "black"
|
||||
hl.lsp_bg = "#7fb4ca"
|
||||
hl.search_bg = "#c8c093"
|
||||
hl.grapple_bg = "#eba0ac"
|
||||
hl.file_encoding_bg = "#f7768e"
|
||||
hl.tab_width_bg = "#ff966c"
|
||||
hl.nav_fg = "black"
|
||||
hl.nav_bg = get_hlgroup("String").fg
|
||||
hl.nav_icon_bg = hl.nav_bg
|
||||
return hl
|
||||
end,
|
||||
attributes = {
|
||||
mode = { bold = true },
|
||||
file_info = { bold = false },
|
||||
git_branch = { bold = false },
|
||||
diagnostics = { bold = false },
|
||||
git_diff = { bold = false },
|
||||
lsp = { bold = false },
|
||||
},
|
||||
}
|
||||
39
lua/plugins/configs/ui/transparent.lua
Normal file
39
lua/plugins/configs/ui/transparent.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
return function(opts)
|
||||
return require("astrocore").extend_tbl(opts, {
|
||||
-- table: default groups
|
||||
groups = {
|
||||
"Normal",
|
||||
"NormalNC",
|
||||
"Comment",
|
||||
"Constant",
|
||||
"Special",
|
||||
"Identifier",
|
||||
"Statement",
|
||||
"PreProc",
|
||||
"Type",
|
||||
"Underlined",
|
||||
"Todo",
|
||||
"String",
|
||||
"Function",
|
||||
"Conditional",
|
||||
"Repeat",
|
||||
"Operator",
|
||||
"Structure",
|
||||
"LineNr",
|
||||
"NonText",
|
||||
"SignColumn",
|
||||
"CursorLineNr",
|
||||
"EndOfBuffer",
|
||||
},
|
||||
-- table: additional groups that should be cleared
|
||||
extra_groups = {
|
||||
"NormalFloat",
|
||||
"NvimTreeNormal",
|
||||
"NeoTreeNormal",
|
||||
"NeoTreeFloatBorder",
|
||||
"NeoTreeNormalNC",
|
||||
},
|
||||
-- table: groups you don't want to clear
|
||||
exclude_groups = {},
|
||||
})
|
||||
end
|
||||
10
lua/plugins/cyber-dream.lua
Normal file
10
lua/plugins/cyber-dream.lua
Normal file
@@ -0,0 +1,10 @@
|
||||
return {
|
||||
"scottmckendry/cyberdream.nvim",
|
||||
opts = {
|
||||
transparent = true,
|
||||
italic_comments = true,
|
||||
hide_fillchars = true,
|
||||
borderless_telescope = true,
|
||||
terminal_colors = true,
|
||||
},
|
||||
}
|
||||
14
lua/plugins/disabled.lua
Normal file
14
lua/plugins/disabled.lua
Normal file
@@ -0,0 +1,14 @@
|
||||
-- Plugins to disable
|
||||
return {
|
||||
{ "nvim-neo-tree/neo-tree.nvim", enabled = true },
|
||||
{ "lukas-reineke/indent-blankline.nvim", enabled = false },
|
||||
{ "s1n7ax/nvim-window-picker", enabled = false },
|
||||
{ "akinsho/toggleterm.nvim", enabled = false },
|
||||
{ "NvChad/nvim-colorizer.lua", enabled = false },
|
||||
{ "catppuccin/nvim", name = "catppuccin", enabled = false},
|
||||
|
||||
{ "rebelot/kanagawa.nvim", enabled = false },
|
||||
{ "folke/tokyonight.nvim", enabled = false },
|
||||
{ "f4z3r/gruvbox-material.nvim", name = "gruvbox-material", enabled = false },
|
||||
{ "b0o/SchemaStore.nvim", enabled = false },
|
||||
}
|
||||
251
lua/plugins/editor.lua
Normal file
251
lua/plugins/editor.lua
Normal file
@@ -0,0 +1,251 @@
|
||||
-- Plugins that enhance editor experience
|
||||
return {
|
||||
{
|
||||
"numToStr/Comment.nvim",
|
||||
opts = {
|
||||
-- Ignore empty line
|
||||
ignore = "^$",
|
||||
},
|
||||
keys = {
|
||||
{
|
||||
"<C-_>",
|
||||
function() require("Comment.api").toggle.linewise.count(vim.v.count > 0 and vim.v.count or 1) end,
|
||||
mode = { "n", "i" },
|
||||
desc = "Comment line",
|
||||
},
|
||||
{
|
||||
"<C-_>",
|
||||
"<Esc><Cmd>lua require('Comment.api').toggle.linewise(vim.fn.visualmode())<CR>",
|
||||
mode = { "v" },
|
||||
desc = "Comment block",
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Built-in terminal support
|
||||
{
|
||||
"akinsho/toggleterm.nvim",
|
||||
opts = function(_, opts)
|
||||
-- Use powershell for toggleterm on windows
|
||||
if vim.fn.has "win32" then opts.shell = "pwsh.exe" end
|
||||
end,
|
||||
},
|
||||
-- File tagging and navigation
|
||||
{
|
||||
"cbochs/grapple.nvim",
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim",
|
||||
{
|
||||
"AstroNvim/astrocore",
|
||||
opts = function(_, opts)
|
||||
opts.mappings.n["<Leader><Leader>"] = { desc = require("astroui").get_icon("Grapple", 1, true) .. "Grapple" }
|
||||
end,
|
||||
},
|
||||
},
|
||||
opts = {
|
||||
scope = "git_branch",
|
||||
},
|
||||
cmd = { "Grapple" },
|
||||
keys = {
|
||||
{ "<Leader><Leader>a", "<Cmd>Grapple tag<CR>", desc = "Add tag to file" },
|
||||
{ "<Leader><Leader>d", "<Cmd>Grapple untag<CR>", desc = "Delete tag from file" },
|
||||
{ "<Leader><Leader>e", "<Cmd>Grapple toggle_tags<CR>", desc = "Select from tags" },
|
||||
{ "<Leader><Leader>s", "<Cmd>Grapple toggle_scopes<CR>", desc = "Select a project scope" },
|
||||
{ "<Leader><Leader>x", "<Cmd>Grapple reset<CR>", desc = "Clear tags" },
|
||||
{ "<C-e>", "<Cmd>Grapple cycle forward<CR>", desc = "Select next tag" },
|
||||
{ "<C-p>", "<Cmd>Grapple cycle backward<CR>", desc = "Select previous tag" },
|
||||
},
|
||||
},
|
||||
-- Better escape support
|
||||
-- {
|
||||
-- "max397574/better-escape.nvim",
|
||||
-- opts = {
|
||||
-- mapping = { "jj", "kk", "jk" },
|
||||
-- },
|
||||
-- },
|
||||
-- Better indent blankline
|
||||
{
|
||||
"shellRaining/hlchunk.nvim",
|
||||
event = { "BufReadPre", "BufNewFile" },
|
||||
config = function(_, opts)
|
||||
require("hlchunk").setup(require("astrocore").extend_tbl(opts, {
|
||||
chunk = {
|
||||
enable = true,
|
||||
notify = false,
|
||||
chars = {
|
||||
horizontal_line = "━",
|
||||
vertical_line = "┃",
|
||||
left_top = "┏",
|
||||
left_bottom = "┗",
|
||||
right_arrow = "➤",
|
||||
},
|
||||
style = "#cba6f7",
|
||||
delay = 100,
|
||||
},
|
||||
indent = {
|
||||
enable = true,
|
||||
chars = { "┃" },
|
||||
},
|
||||
blank = {
|
||||
enable = false,
|
||||
},
|
||||
line_num = {
|
||||
enable = true,
|
||||
},
|
||||
}))
|
||||
end,
|
||||
},
|
||||
-- AI code completion
|
||||
-- {
|
||||
-- "monkoose/neocodeium",
|
||||
-- event = "LspAttach",
|
||||
-- config = function()
|
||||
-- local neocodeium = require "neocodeium"
|
||||
-- neocodeium.setup()
|
||||
-- vim.keymap.set("n", "<Leader>;", function() require("neocodeium.commands").toggle() end)
|
||||
-- vim.keymap.set("i", "<A-a>", function() require("neocodeium").accept() end)
|
||||
-- vim.keymap.set("i", "<C-Right>", function() require("neocodeium").accept_word() end)
|
||||
-- vim.keymap.set("i", "<A-e>", function() require("neocodeium").accept_line() end)
|
||||
-- vim.keymap.set("i", "<S-Right>", function() require("neocodeium").cycle_or_complete() end)
|
||||
-- vim.keymap.set("i", "<S-Left>", function() require("neocodeium").cycle_or_complete(-1) end)
|
||||
-- vim.keymap.set("i", "<C-x>", function() require("neocodeium").clear() end)
|
||||
-- end,
|
||||
-- },
|
||||
-- Multi-cursors support
|
||||
{
|
||||
"brenton-leighton/multiple-cursors.nvim",
|
||||
version = "*",
|
||||
opts = {},
|
||||
keys = {
|
||||
{ "<C-Down>", "<Cmd>MultipleCursorsAddDown<CR>", mode = { "n", "i", "x" } },
|
||||
{ "<C-Up>", "<Cmd>MultipleCursorsAddUp<CR>", mode = { "n", "i", "x" } },
|
||||
{ "<A-LeftMouse>", "<Cmd>MultipleCursorsMouseAddDelete<CR>", mode = { "n", "i" } },
|
||||
{ "<Leader>a", "<Cmd>MultipleCursorsAddMatches<CR>", mode = { "n", "x" } },
|
||||
{ "<C-D>", "<Cmd>MultipleCursorsAddJumpNextMatch<CR>", mode = { "n", "x" } },
|
||||
},
|
||||
},
|
||||
-- Better code folding
|
||||
{
|
||||
"kevinhwang91/nvim-ufo",
|
||||
opts = {
|
||||
-- Add virtual text to show how many lines are folded
|
||||
fold_virt_text_handler = function(virtText, lnum, endLnum, width, truncate)
|
||||
local newVirtText = {}
|
||||
local suffix = (" %d "):format(endLnum - lnum)
|
||||
local sufWidth = vim.fn.strdisplaywidth(suffix)
|
||||
local targetWidth = width - sufWidth
|
||||
local curWidth = 0
|
||||
for _, chunk in ipairs(virtText) do
|
||||
local chunkText = chunk[1]
|
||||
local chunkWidth = vim.fn.strdisplaywidth(chunkText)
|
||||
if targetWidth > curWidth + chunkWidth then
|
||||
table.insert(newVirtText, chunk)
|
||||
else
|
||||
chunkText = truncate(chunkText, targetWidth - curWidth)
|
||||
local hlGroup = chunk[2]
|
||||
table.insert(newVirtText, { chunkText, hlGroup })
|
||||
chunkWidth = vim.fn.strdisplaywidth(chunkText)
|
||||
-- str width returned from truncate() may less than 2nd argument, need padding
|
||||
if curWidth + chunkWidth < targetWidth then
|
||||
suffix = suffix .. (" "):rep(targetWidth - curWidth - chunkWidth)
|
||||
end
|
||||
break
|
||||
end
|
||||
curWidth = curWidth + chunkWidth
|
||||
end
|
||||
table.insert(newVirtText, { suffix, "MoreMsg" })
|
||||
return newVirtText
|
||||
end,
|
||||
},
|
||||
},
|
||||
-- Better split navigation and resize
|
||||
{
|
||||
"mrjones2014/smart-splits.nvim",
|
||||
event = "VeryLazy", -- load on very lazy for mux detection
|
||||
opts = function(_, opts)
|
||||
opts.ignored_filetypes = { "nofile", "quickfix", "qf", "prompt" }
|
||||
opts.ignored_buftypes = { "nofile" }
|
||||
end,
|
||||
keys = {
|
||||
{
|
||||
"<C-h>",
|
||||
function() require("smart-splits").move_cursor_left() end,
|
||||
mode = { "n" },
|
||||
desc = "Move to left split",
|
||||
},
|
||||
{
|
||||
"<C-l>",
|
||||
function() require("smart-splits").move_cursor_right() end,
|
||||
mode = { "n", "t" },
|
||||
desc = "Move to right split",
|
||||
},
|
||||
{
|
||||
"<C-k>",
|
||||
function() require("smart-splits").move_cursor_up() end,
|
||||
mode = { "n" },
|
||||
desc = "Move to above split",
|
||||
},
|
||||
{
|
||||
"<C-j>",
|
||||
function() require("smart-splits").move_cursor_down() end,
|
||||
mode = { "n" },
|
||||
desc = "Move to below split",
|
||||
},
|
||||
{
|
||||
"<A-Left>",
|
||||
function() require("smart-splits").resize_left() end,
|
||||
mode = { "n" },
|
||||
desc = "Resize split left",
|
||||
},
|
||||
{
|
||||
"<A-Right>",
|
||||
function() require("smart-splits").resize_right() end,
|
||||
mode = { "n" },
|
||||
desc = "Resize split right",
|
||||
},
|
||||
{
|
||||
"<A-Up>",
|
||||
function() require("smart-splits").resize_up() end,
|
||||
mode = { "n" },
|
||||
desc = "Resize split up",
|
||||
},
|
||||
{
|
||||
"<A-Down>",
|
||||
function() require("smart-splits").resize_down() end,
|
||||
mode = { "n" },
|
||||
desc = "Resize split down",
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Find and replace
|
||||
{
|
||||
"MagicDuck/grug-far.nvim",
|
||||
cmd = "GrugFar",
|
||||
config = function()
|
||||
require("grug-far").setup {
|
||||
windowCreationCommand = "tabnew",
|
||||
}
|
||||
end,
|
||||
keys = {
|
||||
{
|
||||
"<Leader>R",
|
||||
function() require("grug-far").grug_far { prefills = { search = vim.fn.expand "<cword>" } } end,
|
||||
mode = { "n" },
|
||||
desc = "Open GrugFar",
|
||||
},
|
||||
},
|
||||
},
|
||||
-- Markdown preview support
|
||||
{
|
||||
"OXY2DEV/markview.nvim",
|
||||
dependencies = {
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
opts.ensure_installed =
|
||||
require("astrocore").list_insert_unique(opts.ensure_installed, { "markdown", "markdown_inline" })
|
||||
end,
|
||||
},
|
||||
},
|
||||
ft = { "markdown" },
|
||||
},
|
||||
}
|
||||
36
lua/plugins/lsp-features.lua
Normal file
36
lua/plugins/lsp-features.lua
Normal file
@@ -0,0 +1,36 @@
|
||||
-- Plugins to add additional functionality for LSP
|
||||
return {
|
||||
-- Signature help
|
||||
{
|
||||
"ray-x/lsp_signature.nvim",
|
||||
event = "User AstroFile",
|
||||
config = function()
|
||||
require("lsp_signature").setup { bind = true, handler_opts = { border = "rounded" }, hint_enable = false }
|
||||
end,
|
||||
},
|
||||
-- Additional features for Clangd
|
||||
{
|
||||
"p00f/clangd_extensions.nvim",
|
||||
lazy = true,
|
||||
ft = { "c", "cpp" },
|
||||
dependencies = {
|
||||
"AstroNvim/astrocore",
|
||||
opts = {
|
||||
autocmds = {
|
||||
clangd_extensions = {
|
||||
{
|
||||
event = "LspAttach",
|
||||
desc = "Load clangd_extensions with clangd",
|
||||
callback = function(args)
|
||||
if assert(vim.lsp.get_client_by_id(args.data.client_id)).name == "clangd" then
|
||||
require "clangd_extensions"
|
||||
vim.api.nvim_del_augroup_by_name "clangd_extensions"
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
46
lua/plugins/mason.lua
Normal file
46
lua/plugins/mason.lua
Normal file
@@ -0,0 +1,46 @@
|
||||
-- Customize Mason plugins
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
-- use mason-lspconfig to configure LSP installations
|
||||
{
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
-- overrides `require("mason-lspconfig").setup(...)`
|
||||
opts = function(_, opts)
|
||||
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||
"lua_ls",
|
||||
"clangd",
|
||||
"basedpyright",
|
||||
"ruff",
|
||||
})
|
||||
end,
|
||||
},
|
||||
-- use mason-null-ls to configure Formatters/Linter installation for null-ls sources
|
||||
{
|
||||
"jay-babu/mason-null-ls.nvim",
|
||||
-- overrides `require("mason-null-ls").setup(...)`
|
||||
opts = function(_, opts)
|
||||
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||
"stylua",
|
||||
"clang-format",
|
||||
"black",
|
||||
"prettier",
|
||||
})
|
||||
end,
|
||||
},
|
||||
{
|
||||
"jay-babu/mason-nvim-dap.nvim",
|
||||
-- add this to lazy load dap-related plugins
|
||||
init = function() end,
|
||||
-- overrides `require("mason-nvim-dap").setup(...)`
|
||||
opts = function(_, opts)
|
||||
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||
"codelldb",
|
||||
"python",
|
||||
})
|
||||
end,
|
||||
},
|
||||
}
|
||||
145
lua/plugins/motion.lua
Normal file
145
lua/plugins/motion.lua
Normal file
@@ -0,0 +1,145 @@
|
||||
-- Plugins related to motion
|
||||
return {
|
||||
-- Move lines up/down/left/right
|
||||
{
|
||||
"echasnovski/mini.move",
|
||||
opts = {},
|
||||
keys = {
|
||||
{ "<A-h>", mode = { "n", "x" }, desc = "Move line/block left" },
|
||||
{ "<A-l>", mode = { "n", "x" }, desc = "Move line/block right" },
|
||||
{ "<A-j>", mode = { "n", "x" }, desc = "Move line/block down" },
|
||||
{ "<A-k>", mode = { "n", "x" }, desc = "Move line/block up" },
|
||||
},
|
||||
},
|
||||
-- Faster change/delete/replace delimiter pairs
|
||||
{
|
||||
"echasnovski/mini.surround",
|
||||
opts = { n_lines = 200 },
|
||||
keys = {
|
||||
{ "sa", mode = { "n", "x" }, desc = "Add surrounding" },
|
||||
{ "sd", mode = { "n", "x" }, desc = "Delete surrounding" },
|
||||
{ "sr", mode = { "n", "x" }, desc = "Replace surrounding" },
|
||||
{ "sf", mode = { "n", "x" }, desc = "Find right surrounding" },
|
||||
{ "sF", mode = { "n", "x" }, desc = "Find left surrounding" },
|
||||
{ "sh", mode = { "n", "x" }, desc = "Highlight surrounding" },
|
||||
{ "sn", mode = { "n", "x" }, desc = "Update `MiniSurround.config.n_lines`" },
|
||||
},
|
||||
},
|
||||
-- Brackets splitjoin
|
||||
{
|
||||
"Wansmer/treesj",
|
||||
cmd = { "TSJToggle", "TSJSplit", "TSJJoin" },
|
||||
opts = {
|
||||
use_default_keymaps = false,
|
||||
max_join_length = 150,
|
||||
},
|
||||
keys = {
|
||||
{ "gs", "<Cmd>TSJToggle<CR>", mode = { "n" }, desc = "Toggle splitjoin" },
|
||||
},
|
||||
},
|
||||
{
|
||||
"echasnovski/mini.ai",
|
||||
event = "User AstroFile",
|
||||
opts = function()
|
||||
-- Register to which-key
|
||||
local i = {
|
||||
[" "] = "Whitespace",
|
||||
["?"] = "User Prompt",
|
||||
_ = "Underscore",
|
||||
a = "Argument",
|
||||
b = "Paired ), ], }",
|
||||
c = "Class",
|
||||
d = "Digit(s)",
|
||||
e = "Word in CamelCase & snake_case",
|
||||
f = "Function",
|
||||
g = "Entire file",
|
||||
o = "Block, conditional, loop",
|
||||
q = "Quote `, \", '",
|
||||
t = "Tag",
|
||||
u = "Use/call function & method",
|
||||
U = "Use/call without dot in name",
|
||||
}
|
||||
local a = vim.deepcopy(i)
|
||||
for k, v in pairs(a) do
|
||||
a[k] = v:gsub(" including.*", "")
|
||||
end
|
||||
|
||||
local ic = vim.deepcopy(i)
|
||||
local ac = vim.deepcopy(a)
|
||||
for key, name in pairs { n = "Next", l = "Last" } do
|
||||
i[key] = vim.tbl_extend("force", { name = "Inside " .. name .. " textobject" }, ic)
|
||||
a[key] = vim.tbl_extend("force", { name = "Around " .. name .. " textobject" }, ac)
|
||||
end
|
||||
require("which-key").register {
|
||||
mode = { "o", "x" },
|
||||
i = i,
|
||||
a = a,
|
||||
}
|
||||
|
||||
-- define custom textobjects
|
||||
local ai = require "mini.ai"
|
||||
return {
|
||||
n_lines = 500,
|
||||
custom_textobjects = {
|
||||
o = ai.gen_spec.treesitter { -- code block
|
||||
a = { "@block.outer", "@conditional.outer", "@loop.outer" },
|
||||
i = { "@block.inner", "@conditional.inner", "@loop.inner" },
|
||||
},
|
||||
f = ai.gen_spec.treesitter { a = "@function.outer", i = "@function.inner" }, -- function
|
||||
c = ai.gen_spec.treesitter { a = "@class.outer", i = "@class.inner" }, -- class
|
||||
t = { "<([%p%w]-)%f[^<%w][^<>]->.-</%1>", "^<.->().*()</[^/]->$" }, -- tags
|
||||
d = { "%f[%d]%d+" }, -- digits
|
||||
e = { -- Word with case
|
||||
{ "%u[%l%d]+%f[^%l%d]", "%f[%S][%l%d]+%f[^%l%d]", "%f[%P][%l%d]+%f[^%l%d]", "^[%l%d]+%f[^%l%d]" },
|
||||
"^().*()$",
|
||||
},
|
||||
u = ai.gen_spec.function_call(), -- u for "Usage"
|
||||
U = ai.gen_spec.function_call { name_pattern = "[%w_]" }, -- without dot in function name
|
||||
},
|
||||
}
|
||||
end,
|
||||
},
|
||||
-- Better move by word
|
||||
{
|
||||
"chrisgrieser/nvim-spider",
|
||||
opts = {},
|
||||
keys = {
|
||||
{ "w", "<Cmd>lua require('spider').motion('w')<CR>", mode = { "n", "o", "x" }, desc = "Spider-w" },
|
||||
{ "e", "<Cmd>lua require('spider').motion('e')<CR>", mode = { "n", "o", "x" }, desc = "Spider-e" },
|
||||
{ "b", "<Cmd>lua require('spider').motion('b')<CR>", mode = { "n", "o", "x" }, desc = "Spider-b" },
|
||||
{ "ge", "<Cmd>lua require('spider').motion('ge')<CR>", mode = { "n", "o", "x" }, desc = "Spider-ge" },
|
||||
},
|
||||
},
|
||||
-- Duplicate line/block up/down
|
||||
{
|
||||
"hinell/duplicate.nvim",
|
||||
keys = {
|
||||
{ "<A-K>", "<Cmd>LineDuplicate -1<CR>", mode = { "n" }, desc = "Duplicate line up" },
|
||||
{ "<A-J>", "<Cmd>LineDuplicate +1<CR>", mode = { "n" }, desc = "Duplicate line down" },
|
||||
{ "<A-K>", "<Cmd>VisualDuplicate -1<CR>", mode = { "x" }, desc = "Duplicate block up" },
|
||||
{ "<A-J>", "<Cmd>VisualDuplicate +1<CR>", mode = { "x" }, desc = "Duplicate block down" },
|
||||
},
|
||||
},
|
||||
-- Better character motion
|
||||
{
|
||||
"folke/flash.nvim",
|
||||
event = "VeryLazy",
|
||||
opts = {},
|
||||
keys = {
|
||||
{ "gj", function() require("flash").jump() end, mode = { "n", "x", "o" }, desc = "Flash" },
|
||||
{
|
||||
"gJ",
|
||||
function() require("flash").treesitter() end,
|
||||
mode = { "n", "x", "o" },
|
||||
desc = "Flash Treesitter",
|
||||
},
|
||||
{ "r", function() require("flash").remote() end, mode = "o", desc = "Remote Flash" },
|
||||
{
|
||||
"R",
|
||||
function() require("flash").treesitter_search() end,
|
||||
mode = { "x", "o" },
|
||||
desc = "Treesitter Search",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
40
lua/plugins/multiple-cursor.lua
Normal file
40
lua/plugins/multiple-cursor.lua
Normal file
@@ -0,0 +1,40 @@
|
||||
return {
|
||||
"brenton-leighton/multiple-cursors.nvim",
|
||||
event = 'VimEnter',
|
||||
cmd = {
|
||||
"MultipleCursorsAddDown",
|
||||
"MultipleCursorsAddUp",
|
||||
"MultipleCursorsMouseAddDelete",
|
||||
"MultipleCursorsAddMatches",
|
||||
"MultipleCursorsAddMatchesV",
|
||||
"MultipleCursorsAddJumpNextMatch",
|
||||
"MultipleCursorsJumpNextMatch",
|
||||
"MultipleCursorsLock",
|
||||
},
|
||||
dependencies = {
|
||||
"AstroNvim/astrocore",
|
||||
opts = function(_, opts)
|
||||
local maps = opts.mappings
|
||||
for lhs, map in pairs {
|
||||
["<C-Down>"] = { "<Cmd>MultipleCursorsAddDown<CR>", desc = "Add cursor down" },
|
||||
["<C-Up>"] = { "<Cmd>MultipleCursorsAddUp<CR>", desc = "Add cursor up" },
|
||||
["<C-LeftMouse>"] = { "<Cmd>MultipleCursorsMouseAddDelete<CR>", desc = "Add cursor with mouse" },
|
||||
} do
|
||||
maps.n[lhs] = map
|
||||
maps.i[lhs] = map
|
||||
end
|
||||
local prefix = "<Leader>c"
|
||||
for lhs, map in pairs {
|
||||
[prefix .. "a"] = { "<Cmd>MultipleCursorsAddMatches<CR>", desc = "Add cursor matches" },
|
||||
[prefix .. "A"] = { "<Cmd>MultipleCursorsAddMatchesV<CR>", desc = "Add cursor matches in previous visual area" },
|
||||
[prefix .. "j"] = { "<Cmd>MultipleCursorsAddJumpNextMatch<CR>", desc = "Add cursor and jump to next match" },
|
||||
[prefix .. "J"] = { "<Cmd>MultipleCursorsJumpNextMatch<CR>", desc = "Move cursor to next match" },
|
||||
[prefix .. "l"] = { "<Cmd>MultipleCursorsLock<CR>", desc = "Lock virtual cursors" },
|
||||
} do
|
||||
maps.n[lhs] = map
|
||||
maps.x[lhs] = map
|
||||
end
|
||||
end,
|
||||
},
|
||||
opts = {},
|
||||
}
|
||||
4
lua/plugins/multiple-visual.lua
Normal file
4
lua/plugins/multiple-visual.lua
Normal file
@@ -0,0 +1,4 @@
|
||||
return {
|
||||
"mg979/vim-visual-multi",
|
||||
event = "VeryLazy",
|
||||
}
|
||||
27
lua/plugins/neotree.lua
Normal file
27
lua/plugins/neotree.lua
Normal file
@@ -0,0 +1,27 @@
|
||||
-- NOTE: always show hidden files and dot files
|
||||
return {
|
||||
"nvim-neo-tree/neo-tree.nvim",
|
||||
opts = {
|
||||
sources = {
|
||||
"filesystem",
|
||||
},
|
||||
|
||||
filesystem = {
|
||||
filtered_items = {
|
||||
visible = true,
|
||||
show_hidden_count = true,
|
||||
hide_dotfiles = true,
|
||||
hide_gitignored = true,
|
||||
hide_by_name = {
|
||||
-- '.git',
|
||||
-- '.DS_Store',
|
||||
-- 'thumbs.db',
|
||||
},
|
||||
never_show = {},
|
||||
},
|
||||
},
|
||||
enable_git_status = false,
|
||||
enable_diagnostics = false,
|
||||
git_status_async = false,
|
||||
},
|
||||
}
|
||||
203
lua/plugins/noice.lua
Normal file
203
lua/plugins/noice.lua
Normal file
@@ -0,0 +1,203 @@
|
||||
return {
|
||||
"folke/noice.nvim",
|
||||
event = "VeryLazy",
|
||||
dependencies = { "MunifTanjim/nui.nvim" },
|
||||
|
||||
config = function()
|
||||
require("noice").setup {
|
||||
-- Configuration here, or leave empty to use defaults
|
||||
views = {
|
||||
cmdline_popup = {
|
||||
position = {
|
||||
row = "50%",
|
||||
col = "50%",
|
||||
},
|
||||
size = {
|
||||
width = 60,
|
||||
height = "auto",
|
||||
},
|
||||
},
|
||||
popupmenu = {
|
||||
relative = "editor",
|
||||
position = {
|
||||
row = 8,
|
||||
col = "50%",
|
||||
},
|
||||
size = {
|
||||
width = 60,
|
||||
height = 10,
|
||||
},
|
||||
border = {
|
||||
style = "rounded",
|
||||
padding = { 0, 1 },
|
||||
},
|
||||
win_options = {
|
||||
winhighlight = { Normal = "Normal", FloatBorder = "DiagnosticInfo" },
|
||||
},
|
||||
},
|
||||
},
|
||||
messages = {
|
||||
enabled = false, -- disables the Noice messages UI
|
||||
},
|
||||
notify = {
|
||||
enabled = false, -- disables Noice notifications
|
||||
},
|
||||
lsp = {
|
||||
progress = {
|
||||
enabled = false,
|
||||
},
|
||||
hover = {
|
||||
enabled = false, -- disables Noice LSP hover
|
||||
},
|
||||
signature = {
|
||||
enabled = false, -- disables Noice LSP signature help
|
||||
},
|
||||
message = {
|
||||
enabled = false,
|
||||
},
|
||||
},
|
||||
presets = {
|
||||
bottom_search = true, -- use a classic bottom cmdline for search
|
||||
command_palette = true, -- position the cmdline and popupmenu together
|
||||
long_message_to_split = false, -- long messages will be sent to a split
|
||||
inc_rename = false, -- enables an input dialog for inc-rename.nvim
|
||||
lsp_doc_border = false, -- add a border to hover docs and signature help
|
||||
},
|
||||
|
||||
routes = {
|
||||
-- disable "written" notification
|
||||
{
|
||||
filter = { event = "msg_show", kind = "", find = "written" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable paste/undo notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ more lines" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable delete/undo notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ fewer lines" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable yank notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ lines yanked$" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable move notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ lines moved$" },
|
||||
},
|
||||
},
|
||||
}
|
||||
end,
|
||||
opts = function(_, opts)
|
||||
local utils = require "astrocore"
|
||||
return utils.extend_tbl(opts, {
|
||||
lsp = {
|
||||
progress = {
|
||||
enabled = false,
|
||||
},
|
||||
hover = {
|
||||
enabled = false, -- disables Noice LSP hover
|
||||
},
|
||||
signature = {
|
||||
enabled = false, -- disables Noice LSP signature help
|
||||
},
|
||||
message = {
|
||||
enabled = false,
|
||||
},
|
||||
},
|
||||
presets = {
|
||||
bottom_search = true, -- use a classic bottom cmdline for search
|
||||
command_palette = true, -- position the cmdline and popupmenu together
|
||||
long_message_to_split = false, -- long messages will be sent to a split
|
||||
inc_rename = false, -- enables an input dialog for inc-rename.nvim
|
||||
lsp_doc_border = false, -- add a border to hover docs and signature help
|
||||
},
|
||||
messages = {
|
||||
enabled = false, -- disables the Noice messages UI
|
||||
},
|
||||
notify = {
|
||||
enabled = false, -- disables Noice notifications
|
||||
},
|
||||
|
||||
routes = {
|
||||
-- disable "written" notification
|
||||
{
|
||||
filter = { event = "msg_show", kind = "", find = "written" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable paste/undo notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ more lines" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable delete/undo notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ fewer lines" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable yank notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ lines yanked$" },
|
||||
opts = { skip = true },
|
||||
},
|
||||
-- disable move notification
|
||||
{
|
||||
filter = { event = "msg_show", find = "^%d+ lines moved$" },
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
specs = {
|
||||
{
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
if opts.ensure_installed ~= "all" then
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(
|
||||
opts.ensure_installed,
|
||||
{ "bash", "markdown", "markdown_inline", "regex", "vim" }
|
||||
)
|
||||
end
|
||||
end,
|
||||
},
|
||||
{
|
||||
"AstroNvim/astrolsp",
|
||||
optional = true,
|
||||
---@param opts AstroLSPOpts
|
||||
opts = function(_, opts)
|
||||
-- No need to manage lsp_handlers as noice is not handling them now
|
||||
end,
|
||||
},
|
||||
{
|
||||
"heirline.nvim",
|
||||
optional = true,
|
||||
opts = function(_, opts)
|
||||
local noice_opts = require("astrocore").plugin_opts "noice.nvim"
|
||||
if vim.tbl_get(noice_opts, "lsp", "progress", "enabled") ~= false then -- check if lsp progress is enabled
|
||||
opts.statusline[9] = require("astroui.status").component.lsp { lsp_progress = false }
|
||||
end
|
||||
end,
|
||||
},
|
||||
{
|
||||
"folke/edgy.nvim",
|
||||
optional = true,
|
||||
opts = function(_, opts)
|
||||
if not opts.bottom then opts.bottom = {} end
|
||||
table.insert(opts.bottom, {
|
||||
ft = "noice",
|
||||
size = { height = 0.4 },
|
||||
filter = function(_, win) return vim.api.nvim_win_get_config(win).relative == "" end,
|
||||
})
|
||||
end,
|
||||
},
|
||||
{
|
||||
"catppuccin",
|
||||
optional = true,
|
||||
---@type CatppuccinOptions
|
||||
opts = { integrations = { noice = true } },
|
||||
},
|
||||
},
|
||||
}
|
||||
22
lua/plugins/none-ls.lua
Normal file
22
lua/plugins/none-ls.lua
Normal file
@@ -0,0 +1,22 @@
|
||||
-- Customize None-ls sources
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"nvimtools/none-ls.nvim",
|
||||
opts = function(_, opts)
|
||||
-- config variable is the default configuration table for the setup function call
|
||||
local null_ls = require "null-ls"
|
||||
|
||||
-- Check supported formatters and linters
|
||||
-- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/formatting
|
||||
-- https://github.com/nvimtools/none-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics
|
||||
opts.sources = {
|
||||
-- Set a formatter
|
||||
null_ls.builtins.formatting.stylua,
|
||||
null_ls.builtins.formatting.clang_format,
|
||||
null_ls.builtins.formatting.black,
|
||||
null_ls.builtins.formatting.prettier,
|
||||
}
|
||||
return opts
|
||||
end,
|
||||
}
|
||||
75
lua/plugins/smooth-cursor.lua
Normal file
75
lua/plugins/smooth-cursor.lua
Normal file
@@ -0,0 +1,75 @@
|
||||
return {
|
||||
"gen740/SmoothCursor.nvim",
|
||||
config = function()
|
||||
require("smoothcursor").setup {
|
||||
type = "default", -- Cursor movement calculation method, choose "default", "exp" (exponential) or "matrix".
|
||||
|
||||
cursor = "", -- Cursor shape (requires Nerd Font). Disabled in fancy mode.
|
||||
texthl = "SmoothCursor", -- Highlight group. Default is { bg = nil, fg = "#FFD400" }. Disabled in fancy mode.
|
||||
linehl = nil, -- Highlights the line under the cursor, similar to 'cursorline'. "CursorLine" is recommended. Disabled in fancy mode.
|
||||
|
||||
fancy = {
|
||||
enable = true, -- enable fancy mode
|
||||
head = { cursor = "▷", texthl = "SmoothCursor", linehl = nil }, -- false to disable fancy head
|
||||
body = {
|
||||
{ cursor = "", texthl = "SmoothCursorRed" },
|
||||
{ cursor = "", texthl = "SmoothCursorOrange" },
|
||||
{ cursor = "●", texthl = "SmoothCursorYellow" },
|
||||
{ cursor = "●", texthl = "SmoothCursorGreen" },
|
||||
{ cursor = "•", texthl = "SmoothCursorAqua" },
|
||||
{ cursor = ".", texthl = "SmoothCursorBlue" },
|
||||
{ cursor = ".", texthl = "SmoothCursorPurple" },
|
||||
},
|
||||
tail = { cursor = nil, texthl = "SmoothCursor" }, -- false to disable fancy tail
|
||||
},
|
||||
|
||||
matrix = { -- Loaded when 'type' is set to "matrix"
|
||||
head = {
|
||||
-- Picks a random character from this list for the cursor text
|
||||
cursor = require "smoothcursor.matrix_chars",
|
||||
-- Picks a random highlight from this list for the cursor text
|
||||
texthl = {
|
||||
"SmoothCursor",
|
||||
},
|
||||
linehl = nil, -- No line highlight for the head
|
||||
},
|
||||
body = {
|
||||
length = 6, -- Specifies the length of the cursor body
|
||||
-- Picks a random character from this list for the cursor body text
|
||||
cursor = require "smoothcursor.matrix_chars",
|
||||
-- Picks a random highlight from this list for each segment of the cursor body
|
||||
texthl = {
|
||||
"SmoothCursorGreen",
|
||||
},
|
||||
},
|
||||
tail = {
|
||||
-- Picks a random character from this list for the cursor tail (if any)
|
||||
cursor = nil,
|
||||
-- Picks a random highlight from this list for the cursor tail
|
||||
texthl = {
|
||||
"SmoothCursor",
|
||||
},
|
||||
},
|
||||
unstop = false, -- Determines if the cursor should stop or not (false means it will stop)
|
||||
},
|
||||
|
||||
autostart = true, -- Automatically start SmoothCursor
|
||||
always_redraw = true, -- Redraw the screen on each update
|
||||
flyin_effect = nil, -- Choose "bottom" or "top" for flying effect
|
||||
speed = 25, -- Max speed is 100 to stick with your current position
|
||||
intervals = 35, -- Update intervals in milliseconds
|
||||
priority = 10, -- Set marker priority
|
||||
timeout = 3000, -- Timeout for animations in milliseconds
|
||||
threshold = 3, -- Animate only if cursor moves more than this many lines
|
||||
max_threshold = nil, -- If you move more than this many lines, don't animate (if `nil`, deactivate check)
|
||||
disable_float_win = false, -- Disable in floating windows
|
||||
enabled_filetypes = nil, -- Enable only for specific file types, e.g., { "lua", "vim" }
|
||||
disabled_filetypes = nil, -- Disable for these file types, ignored if enabled_filetypes is set. e.g., { "TelescopePrompt", "NvimTree" }
|
||||
-- Show the position of the latest input mode positions.
|
||||
-- A value of "enter" means the position will be updated when entering the mode.
|
||||
-- A value of "leave" means the position will be updated when leaving the mode.
|
||||
-- `nil` = disabled
|
||||
show_last_positions = nil,
|
||||
}
|
||||
end,
|
||||
}
|
||||
16
lua/plugins/treesitter.lua
Normal file
16
lua/plugins/treesitter.lua
Normal file
@@ -0,0 +1,16 @@
|
||||
-- Customize Treesitter
|
||||
|
||||
---@type LazySpec
|
||||
return {
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
opts = function(_, opts)
|
||||
-- add more things to the ensure_installed table protecting against community packs modifying it
|
||||
opts.ensure_installed = require("astrocore").list_insert_unique(opts.ensure_installed, {
|
||||
"lua",
|
||||
"c",
|
||||
"cpp",
|
||||
"python",
|
||||
-- "javascript",
|
||||
})
|
||||
end,
|
||||
}
|
||||
51
lua/plugins/ui.lua
Normal file
51
lua/plugins/ui.lua
Normal file
@@ -0,0 +1,51 @@
|
||||
-- Plugins related to UI
|
||||
return {
|
||||
{
|
||||
"goolord/alpha-nvim",
|
||||
opts = function(_, opts)
|
||||
-- customize the dashboard header
|
||||
opts.section.header.val = require("plugins.configs.ui.alpha")[3]
|
||||
opts.section.buttons.val = {}
|
||||
end,
|
||||
},
|
||||
{
|
||||
"rebelot/heirline.nvim",
|
||||
opts = function(_, opts)
|
||||
opts.statusline = require("plugins.configs.ui.heirline").statusline
|
||||
opts.winbar = require("plugins.configs.ui.heirline").winbar
|
||||
end,
|
||||
},
|
||||
{
|
||||
"rcarriga/nvim-notify",
|
||||
opts = function(_, opts)
|
||||
-- Do this to prevent the warning
|
||||
opts.background_colour = "#000000"
|
||||
end,
|
||||
},
|
||||
-- Icons support
|
||||
{
|
||||
"echasnovski/mini.icons",
|
||||
opts = function(_, opts)
|
||||
if vim.g.icons_enabled == false then opts.style = "ascii" end
|
||||
end,
|
||||
lazy = true,
|
||||
specs = {
|
||||
{ "nvim-tree/nvim-web-devicons", enabled = false, optional = true },
|
||||
},
|
||||
init = function()
|
||||
package.preload["nvim-web-devicons"] = function()
|
||||
require("mini.icons").mock_nvim_web_devicons()
|
||||
return package.loaded["nvim-web-devicons"]
|
||||
end
|
||||
end,
|
||||
},
|
||||
-- Transparent background
|
||||
{
|
||||
"xiyaowong/transparent.nvim",
|
||||
lazy = false,
|
||||
opts = function(_, opts) opts = require "plugins.configs.ui.transparent"(opts) end,
|
||||
keys = {
|
||||
{ "<Leader>uT", "<Cmd>TransparentToggle<CR>", desc = "Toggle transparent" },
|
||||
},
|
||||
},
|
||||
}
|
||||
63
lua/plugins/ultimate-autopair.lua
Normal file
63
lua/plugins/ultimate-autopair.lua
Normal file
@@ -0,0 +1,63 @@
|
||||
return {
|
||||
"altermo/ultimate-autopair.nvim",
|
||||
event = "InsertEnter",
|
||||
branch = "v0.6", --recommended as each new version will have breaking changes
|
||||
opts = {
|
||||
-- disable autopair in the command line: https://github.com/altermo/ultimate-autopair.nvim/issues/8
|
||||
cmap = false,
|
||||
extensions = {
|
||||
cond = {
|
||||
-- disable in comments
|
||||
-- https://github.com/altermo/ultimate-autopair.nvim/blob/6fd0d6aa976a97dd6f1bed4d46be1b437613a52f/Q%26A.md?plain=1#L26
|
||||
cond = {
|
||||
function(fn) return not fn.in_node "comment" end,
|
||||
},
|
||||
},
|
||||
-- get fly mode working on strings:
|
||||
-- https://github.com/altermo/ultimate-autopair.nvim/issues/33
|
||||
fly = {
|
||||
nofilter = true,
|
||||
},
|
||||
},
|
||||
config_internal_pairs = {
|
||||
{ '"', '"', fly = true },
|
||||
{ "'", "'", fly = true },
|
||||
{ "[", "]", fly = true },
|
||||
{ "{", "}", fly = true },
|
||||
{ "(", ")", fly = true },
|
||||
},
|
||||
},
|
||||
dependencies = {
|
||||
{
|
||||
"AstroNvim/astrocore",
|
||||
opts = {
|
||||
mappings = {
|
||||
n = {
|
||||
["<Leader>ua"] = {
|
||||
desc = "Toggle Ultimate Autopair",
|
||||
function()
|
||||
local notify = require("astrocore").notify
|
||||
local function bool2str(bool) return bool and "on" or "off" end
|
||||
local ok, ultimate_autopair = pcall(require, "ultimate-autopair")
|
||||
if ok then
|
||||
ultimate_autopair.toggle()
|
||||
vim.g.ultimate_autopair_enabled = require("ultimate-autopair.core").disable
|
||||
notify(string.format("ultimate-autopair %s", bool2str(not vim.g.ultimate_autopair_enabled)))
|
||||
else
|
||||
notify "ultimate-autopair not available"
|
||||
end
|
||||
end,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
specs = {
|
||||
{
|
||||
"windwp/nvim-autopairs",
|
||||
optional = true,
|
||||
enabled = false,
|
||||
},
|
||||
},
|
||||
}
|
||||
Reference in New Issue
Block a user