diff --git a/config/nvim/init.lua b/config/nvim/init.lua index 5c8eed2..9d3ce61 100644 --- a/config/nvim/init.lua +++ b/config/nvim/init.lua @@ -1,11 +1,12 @@ -local map = vim.keymap.set +map = vim.keymap.set vim.g.mapleader = " " vim.g.termguicolors = true -- Enable 24-bit RGB colors vim.o.nu = true -- Show line numbers +vim.o.relativenumber = true -- Show relative line numbers vim.o.cursorline = true -- Highlight the line where the cursor is vim.o.wrap = false -- Don't wrap long lines to the next line vim.o.list = true -- Show invisible characters (tabs, trailing spaces) -vim.o.scrolloff = 8 -- Keep 8 lines above/below cursor when scrolling +vim.o.scrolloff = 20 -- Keep 20 lines above/below cursor when scrolling vim.o.winborder = 'rounded' -- Use rounded borders for floating windows vim.o.ignorecase = true -- Ignore case in search patterns vim.o.smartcase = true -- ...unless search contains an uppercase letter @@ -13,20 +14,20 @@ vim.o.hlsearch = true -- Keep search results highlighted vim.o.incsearch = true -- Show search results as you type vim.o.path = "**" -- Search down into subdirectories (classic Vim) vim.o.expandtab = true -- Use spaces instead of tabs -vim.o.tabstop = 4 -- 1 tab = 4 spaces -vim.o.shiftwidth = 4 -- Indentation amount for >> and << commands +vim.o.shiftwidth = 4 -- 4 spaces per indent +vim.o.tabstop = 4 -- 4 spaces for a tab +vim.o.softtabstop = 4 -- Tab key inserts 4 spaces vim.o.swapfile = false -- Disable creation of .swp files vim.o.backup = false -- Disable backup files vim.o.undofile = true -- Save undo history to a file vim.o.splitright = true -- Open vertical splits to the right vim.o.splitbelow = true -- Open horizontal splits below vim.o.timeoutlen = 300 -- Time (ms) to wait for a mapped sequence to complete +vim.o.autocomplete = true vim.opt.clipboard = "unnamedplus" vim.o.completeopt = 'menuone,noselect' vim.o.undodir = os.getenv("HOME") .. "/.cache/nvim/undodir" -vim.api.nvim_create_autocmd("BufEnter", { pattern = "term://*", callback = function() vim.cmd("startinsert") end }) vim.lsp.enable({ "gopls", "gdscript" }) -vim.cmd(":colorscheme retrobox") map({"t", "n"}, "", "") map({"t", "n"}, "", "") @@ -39,10 +40,13 @@ map("v", "J", ":m '>+1gv=gv") map("v", "K", ":m '<-2gv=gv") map("v", "", "" , ">gv") -map("n", "gd", ":lua vim.lsp.buf.definition()") -map("n", "r", ":lua vim.lsp.buf.rename()") map("n", "p", ":b#") map("n", "e", ":Ex") map("n", "x", ":bd") +map("n", "L", ":lua vim.diagnostic.open_float()") +map("n", "gd", ":lua vim.lsp.buf.definition()") +map("n", "r", ":lua vim.lsp.buf.rename()") +map({"v","n"}, "F", ":lua vim.lsp.buf.format()") +require("autocmds") require("plugins") diff --git a/config/nvim/lua/autocmds/init.lua b/config/nvim/lua/autocmds/init.lua new file mode 100644 index 0000000..2284af4 --- /dev/null +++ b/config/nvim/lua/autocmds/init.lua @@ -0,0 +1,98 @@ +-- Terminals should open with insert mode +vim.api.nvim_create_autocmd("BufEnter", { pattern = "term://*", callback = function() vim.cmd("startinsert") end }) +-- Start treesitter +vim.api.nvim_create_autocmd('FileType', { + pattern = '*', + callback = function() + pcall(vim.treesitter.start) + vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" + end, +}) +-- highlights yanked text +vim.api.nvim_create_autocmd("TextYankPost", { + callback = function() + vim.highlight.on_yank({ + higroup = "IncSearch", + timeout = 200, + }) + end, +}) +-- Set absolute numbers when in insert mode otherwise relativenumbers +local nums = vim.api.nvim_create_augroup('smart_numbers', {}) +vim.api.nvim_create_autocmd('InsertEnter', { + group = nums, + callback = function() + vim.opt.relativenumber = false + end, +}) +vim.api.nvim_create_autocmd('InsertLeave', { + group = nums, + callback = function() + vim.opt.relativenumber = true + end, +}) +-- removes trailing whitespace on save +vim.api.nvim_create_autocmd("BufWritePre", { + callback = function() + local save_cursor = vim.fn.getpos(".") + vim.cmd([[%s/\s\+$//e]]) + vim.fn.setpos(".", save_cursor) + end, +}) +-- Lsp autocomplete +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('my.lsp', {}), + callback = function(ev) + local client = vim.lsp.get_client_by_id(ev.data.client_id) + if not client then return end + + -- Set completeopt for a better experience + vim.opt.completeopt = { 'menu', 'menuone', 'noinsert', 'noselect' } + + -- Enable completion if the server supports it + if client:supports_method('textDocument/completion') then + vim.lsp.completion.enable(true, client.id, ev.buf, { + autotrigger = true, -- false = manual trigger only + }) + end + end, +}) + +-- Format: whole file or visual selection via :Fc +local function smart_format() + local mode = vim.fn.mode() + local in_visual = mode == "v" or mode == "V" or mode == "\22" + + local clients = vim.lsp.get_clients({ bufnr = 0 }) + local has_formatter = false + for _, client in ipairs(clients) do + if client.supports_method("textDocument/formatting") then + has_formatter = true + break + end + end + + if in_visual then + if has_formatter then + vim.lsp.buf.format({ + range = { + start = vim.api.nvim_buf_get_mark(0, "<"), + ["end"] = vim.api.nvim_buf_get_mark(0, ">"), + }, + }) + else + vim.cmd("normal! gv=") + end + else + if has_formatter then + vim.lsp.buf.format({ async = false }) + else + local view = vim.fn.winsaveview() + vim.cmd("normal! gg=G") + vim.fn.winrestview(view) + end + end +end + +-- :FF (Format Function) works in normal and visual mode +vim.api.nvim_create_user_command("FF", smart_format, { range = true }) diff --git a/config/nvim/lua/plugins/init.lua b/config/nvim/lua/plugins/init.lua index 269b0b6..32a814a 100644 --- a/config/nvim/lua/plugins/init.lua +++ b/config/nvim/lua/plugins/init.lua @@ -9,24 +9,13 @@ vim.cmd(":colorscheme catppuccin-nvim") require("tree-sitter-manager").setup({}) -local map = vim.keymap.set -local acmd = vim.api.nvim_create_autocmd - -acmd('FileType', { - pattern = '*', - callback = function() - pcall(vim.treesitter.start) - vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()" - end, -}) - require("fzf-lua").setup() map("n", "f", ":lua FzfLua.files()") map("n", "o", ":lua FzfLua.buffers()") +map("n", "h", ":lua FzfLua.help_tags()") +map("n", "d", ":lua FzfLua.diagnostics_document()") +map("n", "a", ":lua FzfLua.lsp_code_actions()") map("n", "ss", ":lua FzfLua.grep_project()") map("n", "sf", ":lua FzfLua.grep_curbuf()") map("n", "sw", ":lua FzfLua.grep_cword()") -map("n", "sh", ":lua FzfLua.help_tags()") -map("n", "sd", ":lua FzfLua.diagnostics_document()") -map("n", "sa", ":lua FzfLua.lsp_code_actions()")