dot/nvim/init.lua
2025-11-25 20:21:02 +01:00

226 lines
6.7 KiB
Lua

-- nvim optimizations
vim.loader.enable()
-- bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath })
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
{ "nvim-lualine/lualine.nvim" },
{ "nvim-telescope/telescope.nvim",lazy = false, dependencies = "nvim-lua/plenary.nvim" },
{ "neovim/nvim-lspconfig" },
{ "williamboman/mason.nvim", config = true },
{ "mason-org/mason-lspconfig.nvim", opts = {}, dependencies = {"mason-org/mason.nvim"}},
{ "nvim-treesitter/nvim-treesitter", build = ":TSUpdate",
config = function()
require("nvim-treesitter.configs").setup({
highlight = { enable = true },
indent = { enable = true },
})
end,},
{ "hrsh7th/nvim-cmp", dependencies = {
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-buffer",
"hrsh7th/cmp-path",
"L3MON4D3/LuaSnip",
"saadparwaiz1/cmp_luasnip",
}
},
{ "akinsho/toggleterm.nvim", version = "*", config = true },
{ "sindrets/diffview.nvim", dependencies = "nvim-lua/plenary.nvim" },
{ "airblade/vim-gitgutter" },
{ 'windwp/nvim-autopairs', event = "InsertEnter", config = true },
{"FabijanZulj/blame.nvim"},
{
"rebelot/kanagawa.nvim",
config = function()
require("kanagawa").setup({
commentStyle = { italic = true },
keywordStyle = { italic = true },
statementStyle = { bold = true },
theme = "wave",
background = { dark = "wave", light = "lotus" },
})
vim.cmd("colorscheme kanagawa")
end,
},
{
"scalameta/nvim-metals",
ft = { "scala", "sbt", "java" },
opts = function()
local metals_config = require("metals").bare_config()
metals_config.on_attach = function(client, bufnr)
-- your on_attach function
end
return metals_config
end,
config = function(self, metals_config)
local nvim_metals_group = vim.api.nvim_create_augroup("nvim-metals", { clear = true })
vim.api.nvim_create_autocmd("FileType", {
pattern = self.ft,
callback = function()
require("metals").initialize_or_attach(metals_config)
end,
group = nvim_metals_group,
})
end
}
})
-- neovim configuration
vim.o.termguicolors = true
vim.o.encoding = 'utf-8'
vim.o.fileencoding = 'utf-8'
vim.o.tabstop = 4
vim.o.softtabstop = 4
vim.o.shiftwidth = 4
vim.o.expandtab = true
vim.o.smartindent = true
vim.o.number = true
-- breaks telescope
vim.o.cursorline = true
vim.o.clipboard = 'unnamedplus'
vim.o.wildmenu = true
vim.o.laststatus = 0
vim.o.cmdheight = 0
vim.o.undofile = true
vim.o.hlsearch = true
vim.o.incsearch = true
vim.o.ignorecase = true
vim.o.smartcase = true
vim.o.errorbells = false
vim.g.mapleader = ' '
vim.o.mouse = nil
vim.o.autoread = true
vim.o.swapfile = true
vim.o.wildmode = longest
-- Telescope Keybinds
vim.keymap.set('n', '<leader><leader>', require('telescope.builtin').find_files)
vim.keymap.set('n', '<leader>fg', require('telescope.builtin').live_grep)
vim.keymap.set('n', '<leader>fb', require('telescope.builtin').buffers)
vim.keymap.set('n', '<leader>fh', require('telescope.builtin').help_tags)
vim.keymap.set('n', '<leader>fr', require('telescope.builtin').lsp_references)
vim.keymap.set('n', '<leader>frr', require('telescope.builtin').diagnostics)
-- Error Keymaps
vim.keymap.set('n', '<leader>nr', vim.diagnostic.goto_next);
vim.keymap.set('n', '<leader>or', vim.diagnostic.open_float);
-- transparent background
vim.api.nvim_set_hl(0, 'Normal', { bg = 'none' })
vim.api.nvim_set_hl(0, 'NormalFloat', { bg = 'none' })
vim.api.nvim_set_hl(0, 'FloatBorder', { bg = 'none' })
vim.api.nvim_set_hl(0, 'Pmenu', { bg = 'none' })
-- Format go files
vim.keymap.set('n', '<leader>gf', function() require('go.format').goimport() end)
-- Diffview
vim.api.nvim_set_keymap('n', '<leader>do', ':DiffviewOpen<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>dc', ':DiffviewClose<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', '<leader>dh', ':DiffviewFileHistory<CR>', { noremap = true, silent = true })
local capabilities = require('cmp_nvim_lsp').default_capabilities()
local lspconfig = require("lspconfig")
local cmp = require'cmp'
cmp.setup({
snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) end },
mapping = cmp.mapping.preset.insert({
['<A-Space>'] = cmp.mapping.complete(),
['<Tab>'] = cmp.mapping.confirm({ select = true }),
['<Down>'] = cmp.mapping.select_next_item(),
['<Up>'] = cmp.mapping.select_prev_item(),
}),
sources = cmp.config.sources({
{ name = 'nvim_lsp' },
{ name = 'luasnip' },
}, {
{ name = 'buffer' },
{ name = 'path' },
})
})
vim.lsp.config["gopls"] = {
cmd = { vim.fn.stdpath("data") .. "/mason/bin/gopls" },
capabilities = require('cmp_nvim_lsp').default_capabilities(),
root_markers = { "go.mod", "go.work", ".git" },
settings = {
gopls = {
analyses = {
unusedparams = true,
shadow = true,
},
staticcheck = true,
},
},
}
require("mason").setup()
require("mason-lspconfig").setup({
automatic_installation = true,
})
-- Standalone gopls LSP (NO MASON)
local capabilities = require('cmp_nvim_lsp').default_capabilities()
vim.lsp.config('gopls', {
cmd = { 'gopls' }, -- uses system-installed gopls from PATH
filetypes = { 'go', 'gomod', 'gowork', 'gotmpl' },
root_markers = { 'go.mod', 'go.work', '.git' },
capabilities = capabilities,
settings = {
gopls = {
analyses = {
unusedparams = true,
shadow = true,
},
staticcheck = true,
}
}
})
vim.lsp.enable('gopls')
require('lualine').setup {
options = {
theme = 'iceberg_dark',
section_separators = '',
component_separators = '',
icons_enabled = true,
globalstatus = true,
always_divide_middle = false,
always_show_tabline = false,
draw_empty = false,
color = nil,
},
sections = {
lualine_a = {'mode'},
lualine_b = {'branch','diff','diagnostics'},
lualine_c = {
{
'filename',
file_status = true,
newfile_status = true,
path = 2
}
},
lualine_x = {'lsp_status'},
lualine_y = {
{
'filetype', colored = false, icon_only = true
}
},
lualine_z = {'location'}
},
}