I completely refactored my neovim conf to be more organized and "cleaner". I also added {flutter, boring-notch} to my .Brewfile

This commit is contained in:
Andrew Haynes
2026-05-10 02:24:56 -04:00
parent 602aa05e5c
commit 9fefc102c9
18 changed files with 762 additions and 763 deletions
+26 -373
View File
@@ -1,376 +1,29 @@
--- Options
require('DarthMooMancer.plugins')
require('DarthMooMancer.opts')
require('DarthMooMancer.colors')
require('DarthMooMancer.keymaps')
require('DarthMooMancer.ui')
require('DarthMooMancer.lsp')
require('DarthMooMancer.tools')
vim.opt.termguicolors = true
vim.g.mapleader = " "
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.tabstop = 8 -- Number of spaces a <Tab> counts for
vim.opt.shiftwidth = 8 -- Number of spaces for autoindent (>>, <<, etc.)
vim.opt.expandtab = true -- Use spaces instead of tabs
vim.opt.autoindent = true -- Copy indent from current line when starting a new line
vim.opt.softtabstop = 8 -- Number of spaces for <Tab> in insert mode (backspace deletes 4 spaces)
vim.opt.wrap = false
vim.opt.swapfile = false
vim.opt.signcolumn = "yes"
vim.opt.undofile = true -- Keeps undo history even after we close a file
vim.opt.scrolloff = 4
vim.opt.sidescrolloff = 8
vim.opt.hlsearch = false
vim.opt.completeopt = { "menuone", "noselect", "popup" }
vim.g.netrw_browse_split = 0
vim.g.netrw_banner = 0
vim.g.netrw_liststyle = 3
vim.g.netrw_winsize = 25
vim.opt.wrapscan = true -- begin search from top of the file when nothng is found
vim.opt.cursorline = true -- enable cursorline
vim.opt.cursorlineopt = { "screenline", "number" } -- cursorline look
vim.opt.foldmethod = "indent"
vim.opt.foldcolumn = "1"
vim.opt.foldenable = false
vim.opt.shortmess = 'aF' -- abbreviates messages and prevents file name being echoed when opened
vim.opt.ignorecase = true -- ignore cases when searching
vim.opt.smartcase = true -- However if we use a capital in search string we then consider case-sensitivity, ignorecase is disabled
vim.opt.smartindent = false -- smarter indentation
vim.opt.smarttab = true -- make tab behaviour smarter
vim.opt.laststatus = 3
vim.opt.showmode = false
vim.opt.cmdheight = 0
vim.opt.smoothscroll = true
vim.diagnostic.config({
virtual_text = true, -- This is the magic line
signs = true, -- Shows icons in the gutter
underline = true,
update_in_insert = false, -- Don't clutter the screen while typing
severity_sort = true,
vim.api.nvim_create_autocmd('FileType', {
pattern = {
'c',
'cpp',
'rust',
'lua',
'typescript',
'javascript',
'css',
'html',
'python',
'go',
'dart',
'yaml',
},
callback = function()
vim.treesitter.start()
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end,
})
vim.pack.add({
{ src = "https://github.com/rose-pine/neovim", name = "rose-pine" },
{ src = "https://github.com/brenoprata10/nvim-highlight-colors" },
{ src = "https://github.com/mbbill/undotree" },
{ src = "https://github.com/nvim-mini/mini.pairs", version = vim.version.range('*') },
{ src = "https://github.com/nvim-tree/nvim-web-devicons" },
{ src = "https://github.com/ibhagwan/fzf-lua" },
{ src = "https://github.com/saghen/blink.cmp", version = vim.version.range('*'), },
{ src = "git@moo:dmm/polydev.git" },
{ src = "https://github.com/nvim-treesitter/nvim-treesitter", build = ":TSUpdate" },
{ src = "https://github.com/alexghergh/nvim-tmux-navigation" },
{ src = "https://github.com/mason-org/mason.nvim" },
{ src = "https://github.com/mason-org/mason-lspconfig.nvim" },
{ src = "https://github.com/neovim/nvim-lspconfig" },
{ src = "https://github.com/stevearc/conform.nvim" },
{ src = "https://github.com/b0o/incline.nvim" },
{ src = "https://github.com/windwp/nvim-ts-autotag" },
{ src = "https://github.com/folke/which-key.nvim" },
--- XCode Plugins
{ src = "https://github.com/MunifTanjim/nui.nvim" },
{ src = "https://github.com/mfussenegger/nvim-dap" },
{ src = "https://github.com/rcarriga/nvim-dap-ui" },
{ src = "https://github.com/nvim-lualine/lualine.nvim" },
{ src = "https://github.com/nvim-neo-tree/neo-tree.nvim" },
{ src = "https://github.com/wojciech-kulik/xcodebuild.nvim" },
{ src = "https://github.com/nvim-lua/plenary.nvim" },
{ src = "https://github.com/folke/noice.nvim" },
{ src = "https://github.com/folke/snacks.nvim" },
})
--- COLORS
vim.cmd.colorscheme("rose-pine")
vim.api.nvim_set_hl(0, "Normal", { bg = "none" })
vim.api.nvim_set_hl(0, "NormalFloat", { link = 'Normal' })
vim.api.nvim_set_hl(0, "StatusLine", { link = 'Normal' })
vim.api.nvim_set_hl(0, "StatusLineTerm", { link = 'Normal' })
vim.api.nvim_set_hl(0, "StatusLineNC", { link = 'Normal' })
vim.api.nvim_set_hl(0, "SignColumn", { link = 'Normal' })
vim.api.nvim_set_hl(0, 'LineNrAbove', { link = 'NonText', bold = true })
vim.api.nvim_set_hl(0, 'LineNrBelow', { link = 'NonText', bold = true })
vim.api.nvim_set_hl(0, "LineNr", { link = 'Normal' })
vim.api.nvim_set_hl(0, "FoldColumn", { link = 'Normal' })
vim.api.nvim_set_hl(0, "CursorLineNr", { bg = "none", link = 'MatchParen', bold = true })
local function xcodebuild_device()
if not vim.g.xcodebuild_platform then return " macOS" end
if vim.g.xcodebuild_platform == "macOS" then
return " macOS"
end
local deviceIcon = ""
if vim.g.xcodebuild_platform:match("watch") then
deviceIcon = "􀟤"
elseif vim.g.xcodebuild_platform:match("tv") then
deviceIcon = "􀡴 "
elseif vim.g.xcodebuild_platform:match("vision") then
deviceIcon = "􁎖 "
end
if vim.g.xcodebuild_os then
return deviceIcon .. " " .. vim.g.xcodebuild_device_name .. " (" .. vim.g.xcodebuild_os .. ")"
end
return deviceIcon .. " " .. (vim.g.xcodebuild_device_name or "Unknown")
end
require('lualine').setup({
options = {
theme = 'auto', -- Or try 'catppuccin' if you use it
component_separators = '|',
section_separators = { left = '', right = '' },
globalstatus = true, -- Crucial for clean look with cmdheight=0
},
sections = {
lualine_a = { { 'mode', separator = { left = '' }, right_padding = 2 } },
lualine_b = { 'filename', 'branch' },
lualine_c = { 'diff', 'diagnostics' },
lualine_x = {
{
function() return '' .. (vim.g.xcodebuild_last_status or "Idle") end,
color = { fg = "Gray" }
},
{
function() return '󰙨 ' .. (vim.g.xcodebuild_test_plan or "No Plan") end,
color = { fg = "#a6e3a1" }
},
{
xcodebuild_device,
color = { fg = "#f9e2af" }
},
},
lualine_y = { 'filetype', 'progress' },
lualine_z = { { 'location', separator = { right = '' }, left_padding = 2 } },
},
})
require("snacks").setup({
image = { enabled = true },
})
require('which-key').setup({
preset = "helix"
})
vim.schedule(function()
-- Mason & LSP
require("mason").setup()
require("mason-lspconfig").setup({
ensure_installed = { "vtsls", "lua_ls", "pylsp", "gopls", "html", "tailwindcss", "bashls", },
automatic_enable = true,
})
-- Noice & Xcodebuild
require("xcodebuild").setup()
require("noice").setup({
lsp = {
-- override markdown rendering so that **cmp** and other plugins use **Treesitter**
override = {
["vim.lsp.util.convert_input_to_markdown_lines"] = true,
["vim.lsp.util.stylize_markdown"] = true,
["cmp.entry.get_documentation"] = true, -- requires hrsh7th/nvim-cmp
},
},
presets = {
bottom_search = true, -- use a classic bottom cmdline for search
command_palette = true, -- position the cmdline and popupmenu together
long_message_to_split = true, -- 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
},
})
-- Blink & Fzf
require("blink.cmp").setup({
completion = {
menu = {
draw = {
columns = { { "label", gap = 1 }, { "kind_icon", gap = 1, "kind" } },
}
}
}
})
require("fzf-lua").setup({
winopts = {
height = 0.50,
width = 0.45,
-- row = 0.35,
-- col = 0.50,
border = "rounded",
-- backdrop = 100,
-- fullscreen = false,
preview = {
hidden = true,
},
},
grep = {
rg_glob = true,
rg_glob_fn = function(query)
local regex, flags = query:match("^(.-)%s%-%-(.*)$")
return (regex or query), flags
end,
},
defaults = {
formatter = "path.filename_first",
},
})
-- Treesitter
require('nvim-treesitter').install { 'swift', 'rust', 'c', 'cpp', 'lua', 'javascript', 'go', 'typescript', 'css', 'html', 'python' }
vim.api.nvim_create_autocmd('FileType', {
pattern = { 'c', 'cpp', 'rust', 'lua', 'typescript', 'javascript', 'css', 'html', 'python', 'go', 'swift' },
callback = function()
vim.treesitter.start()
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end,
})
end)
--- Configurations
local helpers = require 'incline.helpers'
local devicons = require 'nvim-web-devicons'
require('incline').setup {
window = {
padding = 0,
margin = { horizontal = 0 },
},
render = function(props)
local filename = vim.fn.fnamemodify(vim.api.nvim_buf_get_name(props.buf), ':t')
if filename == '' then
filename = '[No Name]'
end
local ft_icon, ft_color = devicons.get_icon_color(filename)
local modified = vim.bo[props.buf].modified
return {
ft_icon and { ' ', ft_icon, ' ', guibg = ft_color, guifg = helpers.contrast_color(ft_color) } or
'',
' ',
{ filename, gui = modified and 'bold,italic' or 'bold' },
' ',
guibg = '#44406e',
}
end,
}
require 'nvim-tmux-navigation'.setup {
disable_when_zoomed = true -- defaults to false
}
require("conform").setup({
formatters_by_ft = {
rust = { "rustfmt", lsp_format = "fallback" },
lua = { "emmylua-codeformat", lsp_format = "fallback" },
javascript = { "prettier", stop_after_first = true },
typescript = { "prettier", stop_after_first = true },
json = { "prettier" },
html = { "prettier" },
go = { "goimports" },
c = { "lsp" },
cpp = { "lsp" },
["_"] = { "trim_whitespace" },
},
format_on_save = {
timeout_ms = 500,
lsp_format = "fallback",
},
})
require('nvim-ts-autotag').setup({
opts = {
enable_close = true, -- Auto close tags
enable_rename = true, -- Auto rename pairs of tags
enable_close_on_slash = false -- Auto close on trailing </
},
})
require('nvim-highlight-colors').turnOn()
require("Polydev").setup()
require('mini.pairs').setup()
--- LSP
local capabilities = require('blink.cmp').get_lsp_capabilities()
vim.lsp.config("lua_ls", {
capabilities = capabilities,
settings = {
Lua = {
diagnostics = { globals = { "vim" } },
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
checkThirdParty = false,
},
},
},
})
vim.lsp.config("vtsls", {
settings = {
typescript = {
updateImportsOnFileMove = { enabled = "always" },
inlayHints = {
parameterNames = { enabled = "all" },
variableTypes = { enabled = true },
},
},
},
})
vim.lsp.enable({ "lua_ls", "clangd", "rust-analyzer", "vtsls", "tailwindcss-language-server",
"vscode-html-language-server", "gopls", "xcode-build-server", "sourcekit" })
--- KEYMAPS
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
vim.keymap.set("n", "<leader>ff", vim.lsp.buf.format)
-- vim.keymap.set("n", "<leader>ff", function()
-- require("conform").format({ async = true, lsp_format = "never" })
-- end)
vim.keymap.set("n", "<leader>vs", ":vsplit<CR>")
vim.keymap.set("n", "<leader>ss", ":split<CR>")
vim.keymap.set("n", "<leader>E", ":Ex<CR>")
vim.keymap.set("n", "<C-u>", "<C-u>zz")
vim.keymap.set("n", "<C-d>", "<C-d>zz")
vim.keymap.set("n", "n", "nzzzv")
vim.keymap.set("n", "N", "Nzzzv")
vim.keymap.set("x", "<leader>p", [["_dP]])
vim.keymap.set('n', '<leader><leader>', ":FzfLua files<CR>")
vim.keymap.set('n', '<leader>fh', ":FzfLua helptags<CR>")
vim.keymap.set('n', '<leader>fg', ":FzfLua live_grep<CR>")
vim.keymap.set('n', '<leader>fm', ":FzfLua manpages<CR>")
vim.keymap.set('n', '<leader>xx', ":FzfLua diagnostics_workspace<CR>")
vim.keymap.set('n', '<leader>fs', vim.lsp.buf.document_symbol)
vim.keymap.set('n', '<leader>gd', vim.lsp.buf.definition)
vim.keymap.set("n", "<leader>gr", vim.lsp.buf.references)
vim.keymap.set("n", "<leader>gR", vim.lsp.buf.rename)
vim.keymap.set("n", "<leader>gc", vim.lsp.buf.code_action)
vim.keymap.set("n", "<leader>uu", ":UndotreeToggle<CR>")
vim.keymap.set("n", "<leader>[", "<c-w>H", { silent = true, noremap = true, })
vim.keymap.set("n", "<leader>]", "<c-w>K", { silent = true, noremap = true, })
vim.keymap.set("n", "[q", ":cprev<CR>zz", { desc = "Previous Quickfix Item" })
vim.keymap.set("n", "]q", ":cnext<CR>zz", { desc = "Next Quickfix Item" })
vim.keymap.set("n", "<leader>qo", ":copen<CR>", { desc = "Open Quickfix" })
vim.keymap.set("n", "<leader>qc", ":cclose<CR>", { desc = "Close Quickfix" })
vim.keymap.set("n", "<C-h>", ":NvimTmuxNavigateLeft<CR>", { silent = true })
vim.keymap.set("n", "<C-j>", ":NvimTmuxNavigateDown<CR>", { silent = true })
vim.keymap.set("n", "<C-k>", ":NvimTmuxNavigateUp<CR>", { silent = true })
vim.keymap.set("n", "<C-l>", ":NvimTmuxNavigateRight<CR>", { silent = true })
vim.keymap.set("n", "<leader>nn", ":Neotree toggle<CR>")
vim.keymap.set("n", "<leader>X", "<cmd>XcodebuildPicker<cr>", { desc = "Show Xcodebuild Actions" })
vim.keymap.set("n", "<leader>xf", "<cmd>XcodebuildProjectManager<cr>", { desc = "Show Project Manager Actions" })
vim.keymap.set("n", "<leader>xb", "<cmd>XcodebuildBuild<cr>", { desc = "Build Project" })
vim.keymap.set("n", "<leader>xB", "<cmd>XcodebuildBuildForTesting<cr>", { desc = "Build For Testing" })
vim.keymap.set("n", "<leader>xr", "<cmd>XcodebuildBuildRun<cr>", { desc = "Build & Run Project" })
vim.keymap.set("n", "<leader>xt", "<cmd>XcodebuildTest<cr>", { desc = "Run Tests" })
vim.keymap.set("v", "<leader>xt", "<cmd>XcodebuildTestSelected<cr>", { desc = "Run Selected Tests" })
vim.keymap.set("n", "<leader>xT", "<cmd>XcodebuildTestClass<cr>", { desc = "Run Current Test Class" })
vim.keymap.set("n", "<leader>x.", "<cmd>XcodebuildTestRepeat<cr>", { desc = "Repeat Last Test Run" })
vim.keymap.set("n", "<leader>xl", "<cmd>XcodebuildToggleLogs<cr>", { desc = "Toggle Xcodebuild Logs" })
vim.keymap.set("n", "<leader>xc", "<cmd>XcodebuildToggleCodeCoverage<cr>", { desc = "Toggle Code Coverage" })
vim.keymap.set("n", "<leader>xC", "<cmd>XcodebuildShowCodeCoverageReport<cr>", { desc = "Show Code Coverage Report" })
vim.keymap.set("n", "<leader>xe", "<cmd>XcodebuildTestExplorerToggle<cr>", { desc = "Toggle Test Explorer" })
vim.keymap.set("n", "<leader>xs", "<cmd>XcodebuildFailingSnapshots<cr>", { desc = "Show Failing Snapshots" })
vim.keymap.set("n", "<leader>xp", "<cmd>XcodebuildPreviewGenerateAndShow<cr>", { desc = "Generate Preview" })
vim.keymap.set("n", "<leader>x<cr>", "<cmd>XcodebuildPreviewToggle<cr>", { desc = "Toggle Preview" })
vim.keymap.set("n", "<leader>xd", "<cmd>XcodebuildSelectDevice<cr>", { desc = "Select Device" })
vim.keymap.set("n", "<leader>xq", "<cmd>Telescope quickfix<cr>", { desc = "Show QuickFix List" })
vim.keymap.set("n", "<leader>xx", "<cmd>XcodebuildQuickfixLine<cr>", { desc = "Quickfix Line" })
vim.keymap.set("n", "<leader>xa", "<cmd>XcodebuildCodeActions<cr>", { desc = "Show Code Actions" })