nvimcfg/init.lua
2026-03-18 12:32:32 +01:00

399 lines
13 KiB
Lua

if vim.g.neovide then
vim.o.guifont = "Iosevka:h14"
end
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
-- Make sure to setup `mapleader` and `maplocalleader` before
-- loading lazy.nvim so that mappings are correct.
-- This is also a good place to setup other settings (vim.opt)
vim.g.mapleader = "\\"
vim.g.maplocalleader = "\\"
-- Indentation settings
vim.opt.expandtab = true -- Use spaces instead of tabs
vim.opt.shiftwidth = 2 -- Number of spaces for auto-indent
vim.opt.tabstop = 2 -- Number of spaces a tab counts for
vim.opt.softtabstop = 2 -- Number of spaces for <Tab> key
vim.opt.autoindent = true
vim.opt.colorcolumn = "90"
vim.opt.number = true
vim.opt.relativenumber = true
-- To use LF default instead of CRLF
vim.opt.fileformat = 'unix'
vim.opt.fileformats = { 'unix', 'dos' }
vim.opt.list = true
vim.opt.listchars = {
space = "·",
tab = "",
trail = "·",
extends = "",
precedes = "",
nbsp = "",
}
vim.opt.cursorline = true
-- Setup lazy.nvim
require("lazy").setup({
spec = {
-- add your plugins here
"stevearc/conform.nvim",
opts = {
notify_on_error = false,
-- Odinfmt gets its configuration from odinfmt.json. It defaults
-- writing to stdout but needs to be told to read from stdin.
formatters = {
odinfmt = {
-- Change where to find the command if it isn't in your path.
command = "odinfmt",
args = { "-stdin" },
stdin = true,
},
},
-- and instruct conform to use odinfmt.
formatters_by_ft = {
odin = { "odinfmt" },
},
format_on_save = {
timeout_ms = 500,
lsp_format = "fallback",
},
},
},
-- Configure any other settings here. See the documentation for more details.
-- colorscheme that will be used when installing plugins.
install = { colorscheme = { "habamax" } },
-- automatically check for plugin updates
checker = { enabled = true },
})
-- C/cpp language server
vim.lsp.config.clangd = {
cmd = { "clangd" },
filetypes = { "c", "cpp", "objc", "objcpp" },
root_markers = {
".clangd",
"compile_commands.json",
"compile_flags.txt",
".git",
},
}
vim.lsp.enable("clangd")
-- Odin language server
vim.lsp.config.ols = {
cmd = { 'ols' }, -- I have added ols to the PATH
filetypes = { 'odin' },
root_dir = vim.fs.root(0, {'.git', 'ols.json'}),
}
vim.lsp.enable('ols')
-- Go language server
vim.lsp.config.gopls = {
cmd = { "gopls" },
filetypes = { "go", "gomod", "gowork", "gotmpl" },
root_markers = { "go.mod", ".git", "go.work" },
settings = {
gopls = {
gofumpt = true,
staticcheck = true,
analyses = {
unusedparams = true,
unusedwrite = true,
},
},
},
}
vim.lsp.enable('gopls')
-- =========================
-- Basic Keymaps
-- =========================
local keymap = vim.keymap.set
-- Clear search highlighting
keymap("n", "<leader>h", ":nohlsearch<CR>", { silent = true })
-- Omni complete ("IDE")
keymap("i", "<C-Space>", "<C-x><C-o>", { noremap = true })
-- Regular autocomplete
keymap("i", "<Tab>", "<C-n>", { noremap = true })
-- Show LSP errors/warnings float
vim.keymap.set("n", "<C-e>", vim.diagnostic.open_float, { noremap = true, silent = true })
vim.keymap.set("n", "gd", vim.lsp.buf.definition)
vim.keymap.set("n", "gD", vim.lsp.buf.declaration)
vim.keymap.set("n", "gr", vim.lsp.buf.references)
vim.keymap.set("n", "gi", vim.lsp.buf.implementation)
vim.keymap.set("n", "K", vim.lsp.buf.hover)
vim.keymap.set("n", "<leader>x", function()
vim.cmd("silent! lclose")
vim.cmd("silent! cclose")
end, { silent = true })
-- Colortheme
local function fleury_brown()
vim.o.termguicolors = true
vim.cmd("highlight clear")
vim.cmd("syntax reset")
vim.g.colors_name = "fleury_brown"
local set = vim.api.nvim_set_hl
local c = {
bg = "#1b1713",
bg2 = "#241f19",
bg3 = "#2d271f",
fg = "#d2c1a1",
fg2 = "#b9a27f",
muted = "#8b7962",
comment = "#6f6253",
brown = "#a07a52",
sand = "#c8a46b",
olive = "#8f9b6a",
red = "#b36a5e",
select = "#3a3128",
cursorln = "#221d17",
}
set(0, "Normal", { fg = c.fg, bg = c.bg })
set(0, "NormalFloat", { fg = c.fg, bg = c.bg2 })
set(0, "FloatBorder", { fg = c.muted, bg = c.bg2 })
set(0, "SignColumn", { bg = c.bg })
set(0, "LineNr", { fg = c.comment, bg = c.bg })
set(0, "CursorLineNr", { fg = c.sand, bg = c.cursorln, bold = true })
set(0, "CursorLine", { bg = c.cursorln })
set(0, "ColorColumn", { bg = c.bg2 })
set(0, "VertSplit", { fg = c.bg3, bg = c.bg })
set(0, "WinSeparator", { fg = c.bg3, bg = c.bg })
set(0, "Visual", { bg = c.select })
set(0, "Search", { fg = c.bg, bg = c.sand })
set(0, "IncSearch", { fg = c.bg, bg = c.brown })
set(0, "Pmenu", { fg = c.fg, bg = c.bg2 })
set(0, "PmenuSel", { fg = c.bg, bg = c.fg2 })
set(0, "StatusLine", { fg = c.fg2, bg = c.bg2 })
set(0, "StatusLineNC", { fg = c.muted, bg = c.bg2 })
set(0, "Comment", { fg = c.comment, italic = true })
set(0, "Constant", { fg = c.fg2 })
set(0, "String", { fg = c.olive })
set(0, "Character", { fg = c.olive })
set(0, "Number", { fg = c.fg2 })
set(0, "Boolean", { fg = c.fg2 })
set(0, "Identifier", { fg = c.fg })
set(0, "Function", { fg = c.sand })
set(0, "Type", { fg = c.brown })
set(0, "StorageClass", { fg = c.brown })
set(0, "Structure", { fg = c.brown })
set(0, "Typedef", { fg = c.brown })
set(0, "Keyword", { fg = c.fg2 })
set(0, "Statement", { fg = c.fg2 })
set(0, "Conditional", { fg = c.fg2 })
set(0, "Repeat", { fg = c.fg2 })
set(0, "Operator", { fg = c.fg })
set(0, "PreProc", { fg = c.brown })
set(0, "Include", { fg = c.brown })
set(0, "Special", { fg = c.fg2 })
set(0, "Todo", { fg = c.bg, bg = c.brown, bold = true })
set(0, "DiagnosticError", { fg = c.red })
set(0, "DiagnosticWarn", { fg = c.sand })
set(0, "DiagnosticInfo", { fg = c.fg2 })
set(0, "DiagnosticHint", { fg = c.muted })
set(0, "DiagnosticUnderlineError", { undercurl = true, sp = c.red })
set(0, "DiagnosticUnderlineWarn", { undercurl = true, sp = c.sand })
set(0, "DiagnosticUnderlineInfo", { undercurl = true, sp = c.fg2 })
set(0, "DiagnosticUnderlineHint", { undercurl = true, sp = c.muted })
end
local function fleury_theme()
vim.o.termguicolors = true
vim.cmd("highlight clear")
vim.cmd("syntax reset")
vim.g.colors_name = "fleury_custom"
local set = vim.api.nvim_set_hl
local c = {
bar = "#000000",
base = "#fcaa05",
pop1 = "#de8150",
pop2 = "#ff0000",
back = "#020202",
margin = "#222425",
margin_hover = "#63523d",
cursorline = "#1E1E1E",
highlight = "#303040",
mark = "#494949",
-- text = "#b99468",
keyword = "#d8a245",
text = "#dac08d",
comment = "#666666",
-- keyword = "#f0c674",
-- constant = "#ffa900",
constant = "#d0e4e8",
string = "#6e9d36",
preproc = "#dc7575",
include = "#ffa900",
operators = "#b99468",
-- operators = "#bd2d2d",
syntax_crap = "#5c4d3c",
index_type = "#edb211",
index_sum = "#a7eb13",
index_fn = "#dc6345",
-- index_fn = "#de451f",
index_macro = "#2895c7",
index_const = "#6eb535",
index_decl = "#c9598a",
token_hi = "#f2d357",
token_hi_bg = "#443800",
error = "#ff0000",
warn = "#efaf2f",
info = "#2895c7",
hint = "#6eb535",
line_nr_bg = "#101010",
line_nr_fg = "#404040",
at_cursor = "#0C0C0C",
white_hi = "#003A3A",
junk_hi = "#3A0000",
}
-- UI
set(0, "Normal", { fg = c.text, bg = c.back })
set(0, "NormalFloat", { fg = c.text, bg = c.margin })
set(0, "FloatBorder", { fg = c.margin_hover, bg = c.margin })
set(0, "SignColumn", { bg = c.back })
set(0, "LineNr", { fg = c.line_nr_fg, bg = c.line_nr_bg })
set(0, "CursorLineNr", { fg = c.base, bg = c.cursorline, bold = true })
set(0, "CursorLine", { bg = c.cursorline })
set(0, "ColorColumn", { bg = c.margin })
set(0, "Visual", { bg = c.margin_hover })
set(0, "Search", { fg = c.at_cursor, bg = c.base })
set(0, "IncSearch", { fg = c.at_cursor, bg = c.pop1 })
set(0, "MatchParen", { fg = c.base, bg = c.margin_hover, bold = true })
set(0, "StatusLine", { fg = c.text, bg = c.margin })
set(0, "StatusLineNC", { fg = c.comment, bg = c.line_nr_bg })
set(0, "VertSplit", { fg = c.margin, bg = c.back })
set(0, "WinSeparator", { fg = c.margin, bg = c.back })
set(0, "Pmenu", { fg = c.text, bg = c.margin })
set(0, "PmenuSel", { fg = c.at_cursor, bg = c.base })
set(0, "PmenuThumb", { bg = c.margin_hover })
set(0, "Folded", { fg = c.comment, bg = c.line_nr_bg })
-- Syntax
set(0, "Comment", { fg = c.comment, italic = true })
set(0, "Keyword", { fg = c.keyword, bold = false })
set(0, "Conditional", { fg = c.keyword })
set(0, "Repeat", { fg = c.keyword })
set(0, "Statement", { fg = c.keyword })
set(0, "Operator", { fg = c.text })
set(0, "Identifier", { fg = c.text })
set(0, "Function", { fg = c.index_fn })
set(0, "Type", { fg = c.index_type })
set(0, "Structure", { fg = c.index_type })
set(0, "Typedef", { fg = c.index_decl })
set(0, "StorageClass", { fg = c.keyword })
set(0, "Constant", { fg = c.constant })
set(0, "String", { fg = c.string})
set(0, "Character", { fg = c.string})
set(0, "Number", { fg = c.constant })
set(0, "Float", { fg = c.constant })
set(0, "Boolean", { fg = c.constant })
set(0, "PreProc", { fg = c.preproc })
set(0, "Include", { fg = c.include })
set(0, "Define", { fg = c.index_macro })
set(0, "Macro", { fg = c.index_macro })
set(0, "Special", { fg = c.syntax_crap })
set(0, "Delimiter", { fg = c.text })
set(0, "SpecialChar", { fg = c.string})
set(0, "Todo", { fg = c.at_cursor, bg = c.base, bold = true })
-- Diagnostics
set(0, "DiagnosticError", { fg = c.error })
set(0, "DiagnosticWarn", { fg = c.warn })
set(0, "DiagnosticInfo", { fg = c.info })
set(0, "DiagnosticHint", { fg = c.hint })
set(0, "DiagnosticUnderlineError", { undercurl = true, sp = c.error })
set(0, "DiagnosticUnderlineWarn", { undercurl = true, sp = c.warn })
set(0, "DiagnosticUnderlineInfo", { undercurl = true, sp = c.info })
set(0, "DiagnosticUnderlineHint", { undercurl = true, sp = c.hint })
-- Diff / misc
set(0, "DiffAdd", { bg = c.white_hi })
set(0, "DiffDelete", { bg = c.junk_hi })
set(0, "DiffChange", { bg = c.margin })
set(0, "DiffText", { bg = c.highlight })
-- LSP references / token highlight
set(0, "LspReferenceText", { bg = c.token_hi_bg })
set(0, "LspReferenceRead", { bg = c.token_hi_bg })
set(0, "LspReferenceWrite", { bg = c.token_hi_bg })
-- Common Treesitter captures
set(0, "@comment", { link = "Comment" })
set(0, "@keyword", { link = "Keyword" })
set(0, "@keyword.return", { link = "Keyword" })
set(0, "@operator", { link = "Operator" })
set(0, "@function", { link = "Function" })
set(0, "@function.call", { link = "Function" })
set(0, "@method", { link = "Function" })
set(0, "@type", { link = "Type" })
set(0, "@type.builtin", { fg = c.keyword })
set(0, "@variable", { fg = c.text })
set(0, "@variable.builtin", { fg = c.base })
set(0, "@constant", { link = "Constant" })
set(0, "@constant.builtin", { fg = c.constant })
set(0, "@string", { link = "String" })
set(0, "@number", { link = "Number" })
set(0, "@boolean", { link = "Boolean" })
set(0, "@include", { link = "Include" })
set(0, "@preproc", { link = "PreProc" })
set(0, "@punctuation.delimiter", { fg = c.text })
set(0, "@punctuation.bracket", { fg = c.text })
end
fleury_theme()
--fleury_brown()