diff --git a/nvim/lua/config/lazy.lua b/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..07cee61 --- /dev/null +++ b/nvim/lua/config/lazy.lua @@ -0,0 +1,47 @@ +-- ~/.config/nvim/lua/config/lazy.lua +-- 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) + +-- Setup lazy.nvim +require("lazy").setup({ + spec = { + { import = "plugins" }, + }, + defaults = { + lazy = false, + version = false, + }, + install = { colorscheme = { "gruvbox" } }, + checker = { enabled = false }, + change_detection = { + notify = false, + }, + ui = { + backdrop = 100, + }, + performance = { + rtp = { + disabled_plugins = { + "gzip", + "tarPlugin", + "tohtml", + "tutor", + "zipPlugin", + }, + }, + }, +}) diff --git a/nvim/lua/keymaps.lua b/nvim/lua/keymaps.lua index e5991aa..a1048de 100644 --- a/nvim/lua/keymaps.lua +++ b/nvim/lua/keymaps.lua @@ -1,134 +1,157 @@ +-- # vim:fileencoding=utf-8:foldmethod=marker + local set = vim.opt local opt = { noremap = true } local opts = { noremap = true, silent = true } local term_opts = { silent = true } --- shorten function name local keymap = vim.api.nvim_set_keymap --- Modes --- normal_mode = 'n', --- insert_mode = 'i', visual_mode = 'v', visual_block_mode = 'x', --- term_mode = 't', --- command_mode = 'c', +-- {{{ Leader Key (moved to init.lua) +-- vim.g.mapleader = " " -- set as leader key +-- vim.g.maplocalleader = " " -- set as local leader key +-- }}} -------------------------------------------------------------------------------- --- set space as leader key -vim.g.mapleader = " " -- Set space as the leader key -vim.g.maplocalleader = " " -- Optional: set local leader key to space as well --- switch colon to semicolon -keymap("n", ";", ":", opt) -keymap("n", ":", ";", opt) +-- {{{ Basic Mappings +keymap("n", ";", ":", opt) -- remap ; to : +keymap("n", ":", ";", opt) -- remap : to ; --- no arrows, move the vim way --- keymap("n", "", "", opts) --- keymap("n", "", "", opts) --- keymap("n", "", "", opts) --- keymap("n", "", "", opts) --- keymap("i", "", "", opts) --- keymap("i", "", "", opts) --- keymap("i", "", "", opts) --- keymap("i", "", "", opts) +keymap("n", "w", ":w", opts) -- save +keymap("n", "q", ":q", opts) -- quit +keymap("n", "wq", ":wq", opts) -- save and quit +keymap("n", "W", ":w!", opts) -- force save +keymap("n", "Q", ":q!", opts) -- force quit +keymap("n", "WQ", ":wq!", opts) -- force save and quit +-- }}} --- lazy write / quit -keymap("n", "w", ":w", opts) -keymap("n", "q", ":q", opts) -keymap("n", "wq", ":wq", opts) -keymap("n", "W", ":w!", opts) -keymap("n", "Q", ":q!", opts) -keymap("n", "WQ", ":wq!", opts) +-- {{{ Navigation +keymap("n", "j", "gj", opts) -- move visually down wrapped lines +keymap("n", "k", "gk", opts) -- move visually up wrapped lines --- navigate properly when lines are wrapped -keymap("n", "j", "gj", opts) -keymap("n", "k", "gk", opts) +-- Keep arrow key navigation (non-standard but you requested it) +keymap("n", "", "h", opts) -- move to left window +keymap("n", "", "l", opts) -- move to right window +keymap("n", "", "k", opts) -- move to upper window +keymap("n", "", "j", opts) -- move to lower window --- toggle linenumber -vim.keymap.set("n", "n", function() - if vim.wo.number and vim.wo.relativenumber then - vim.wo.number = false - vim.wo.relativenumber = false - elseif vim.wo.number then - vim.wo.relativenumber = true - else - vim.wo.number = true - end +keymap("n", "", ":bnext", opts) -- next buffer +keymap("n", "", ":bprevious", opts) -- previous buffer +-- }}} + +-- {{{ Window Splitting +keymap("n", "sv", ":vsplit", opts) -- split vertically +keymap("n", "sh", ":split", opts) -- split horizontally +keymap("n", "sc", ":close", opts) -- close current split +keymap("n", "so", ":only", opts) -- close all other splits +-- }}} + +-- {{{ Window Resizing +keymap("n", "+", ":resize +5", opts) -- increase window height +keymap("n", "-", ":resize -5", opts) -- decrease window height +keymap("n", "<", ":vertical resize -5", opts) -- decrease window width +keymap("n", ">", ":vertical resize +5", opts) -- increase window width +keymap("n", "=", "=", opts) -- equalize window sizes +-- }}} + +-- {{{ Visual Mode / Text, Clipboard +keymap("v", ">", ">gv", opts) -- indent right, stay in visual mode +keymap("v", "<", "", ":move '>+1gv-gv", opts) -- move selected block down +keymap("x", "", ":move '<-2gv-gv", opts) -- move selected block up + +keymap("n", "Q", "gq", opts) -- format paragraph +keymap("x", "Q", "gq", opts) -- format selection + +keymap("x", "Y", '"+y', opt) -- yank to system clipboard + +keymap("n", "", [[:%s/\<=expand("")\>/]], opt) -- replace word under cursor +-- }}} + +-- {{{ Editing / Behavior +keymap("n", "q", "", opts) -- disable q (record macro) +keymap("n", "qq", "q", opts) -- if you really want to record macro use qq + +keymap("n", "c", '"_c', opts) -- change without yanking to default register +keymap("n", "C", '"_C', opts) -- change line without yanking to default register + +vim.keymap.set("n", "n", function() -- toggle line numbers + if vim.wo.number and vim.wo.relativenumber then + vim.wo.number = false + vim.wo.relativenumber = false + elseif vim.wo.number then + vim.wo.relativenumber = true + else + vim.wo.number = true + end end, { desc = "Toggle line number modes" }) --- maintaining visual mode after shifting > and < -keymap("v", ">", ">gv", opts) -keymap("v", "<", "c", ":set cursorcolumn! cursorline! ", opts) -- toggle cursor column and line --- -- move text up and down in visual block mode -keymap("x", "", ":move '>+1gv-gv", opts) -keymap("x", "", ":move '<-2gv-gv", opts) +keymap("n", "", ":nohlsearch", opts) -- clear search highlight +-- }}} --- navigate buffers -keymap("n", "", ":bnext", opts) -keymap("n", "", ":bprevious", opts) +-- {{{ Spellcheck +keymap("n", "se", ":setlocal spell! spelllang=en_us", opts) -- toggle English spell check +keymap("n", "sd", ":setlocal spell! spelllang=de_at", opts) -- toggle Austrian German spell check +keymap("n", "ss", ":setlocal spell! spelllang=es", opts) -- toggle Spanish spell check +-- }}} --- scrolling command-line history -keymap("c", "", "", opts) -keymap("c", "", "", opts) +-- {{{ Timestamp / Date +keymap("n", "dt", [[i=strftime("%d.%m.%Y")]], opts) -- insert current date +keymap("n", "tt", [[i=strftime("%H:%M")]], opts) -- insert current time +-- }}} --- open the current file in the default program -keymap("n", "x", [[:!xdg-open %]], opts) +-- {{{ External / System +keymap("n", "x", [[:!open %]], opts) -- open current file with system default app --- -- no ex mode for me - Q reformats long lines (auto-wrap) -keymap("n", "Q", "gq", opts) -keymap("x", "Q", "gq", opts) +keymap("c", "w!!", [[w !sudo tee %]], opt) -- save file with sudo +-- }}} --- prevent accidentally record functionality -keymap("n", "q", "", opts) -keymap("n", "qq", "q", opts) +-- {{{ Diff / Git +keymap("n", "gd", ":Gvdiffsplit", opts) -- git diff split (requires fugitive) +keymap("n", "gs", ":Git", opts) -- open git status tree (requires fugitive) +keymap("n", "gr", ":terminal git log --graph --oneline --decorate --alli", opts) -- show git log graph in terminal --- redirect change operations to blackhole avoid spoiling 'y' register content -keymap("n", "c", '"_c', opts) -keymap("n", "C", '"_C', opts) +-- GitSigns toggles +vim.keymap.set('n', 'gt', function() require('gitsigns').toggle_signs() end, { desc = 'Toggle git signs' }) +vim.keymap.set('n', 'gb', function() require('gitsigns').toggle_current_line_blame() end, { desc = 'Toggle git blame' }) +vim.keymap.set('n', 'gx', function() require('gitsigns').toggle_deleted() end, { desc = 'Toggle git deleted' }) +vim.keymap.set('n', 'gn', function() require('gitsigns').toggle_numhl() end, { desc = 'Toggle git number highlights' }) +vim.keymap.set('n', 'gc', function() require('gitsigns').toggle_linehl() end, { desc = 'Toggle git line colors' }) --- toggle cursorcolumn -keymap("n", "c", ":set cursorcolumn! cursorline! ", opts) +-- LSP diagnostic toggle +vim.keymap.set('n', 'ld', function() + local config = vim.diagnostic.config() + vim.diagnostic.config({ + virtual_text = not config.virtual_text, + signs = not config.signs, + underline = not config.underline, + }) +end, { desc = 'Toggle LSP diagnostics' }) --- clear highlighting from the search -keymap("n", "", ":nohlsearch", opts) +-- Toggle fold column +vim.keymap.set("n", "un", function() + vim.wo.foldcolumn = vim.wo.foldcolumn == "0" and "1" or "0" +end, { desc = "Toggle fold column" }) --- toggle spell checking -keymap("n", "se", ":setlocal spell! spelllang=en_us,nl", opts) -keymap("n", "sd", ":setlocal spell! spelllang=de_at,nl", opts) +keymap("n", "si", ":source $MYVIMRC", opts) -- source init.lua ($MYVIMRC is auto path to your init.lua) +-- }}} --- date time stamp -keymap("n", "dt", [[i=strftime("%d.%m.%Y")]], opts) -keymap("n", "tt", [[i=strftime("%H:%M")]], opts) +-- {{{ Plugins +-- Yazi (keeping this here since it's a simple command keymap) +keymap("n", "y", ":Yazi", opt) -- open Yazi file manager --- double space over word to find and replace -keymap("n", "", [[:%s/\<=expand("")\>/]], opt) +-- mkdx checkbox toggle (disable default space key, use leader+t instead) +vim.g["mkdx#settings"] = { + checkbox = { + toggles = {' ', 'x', '-'}, + toggle_key = '' + } +} +keymap("n", "t", "(mkdx-checkbox-next-n)", opt) -- toggle markdown checkbox +-- }}} --- write file if you forgot to give it sudo permission -keymap("c", "w!!", [[w !sudo tee %]], opt) - --- diff since last save -keymap("n", "df", [[:w !diff % -]], opt) -keymap("x", "df", [[:w !diff % -]], opt) - --- Yank to System Clipbpard -keymap("x", "Y", '"+y', opt) -keymap("n", "y", ':Yazi', opt) - -local hop = require('hop') -local directions = require('hop.hint').HintDirection -vim.keymap.set('', 'f', function() - hop.hint_char1({ direction = directions.AFTER_CURSOR, }) -end, {remap=true}) -vim.keymap.set('', 'F', function() - hop.hint_char1({ direction = directions.BEFORE_CURSOR, }) -end, {remap=true}) -vim.keymap.set('', 't', function() - hop.hint_char1({ direction = directions.AFTER_CURSOR, hint_offset = -1 }) -end, {remap=true}) -vim.keymap.set('', 'T', function() - hop.hint_char1({ direction = directions.BEFORE_CURSOR, hint_offset = 1 }) -end, {remap=true}) - -vim.keymap.set('n', '', 'h', { noremap = true }) -vim.keymap.set('n', '', 'l', { noremap = true }) -vim.keymap.set('n', '', 'k', { noremap = true }) -vim.keymap.set('n', '', 'j', { noremap = true }) +-- {{{ Whole Document Select +keymap("n", "a", "ggVG", opt) -- select entire document +-- }}} diff --git a/nvim/lua/settings.lua b/nvim/lua/settings.lua index 5b5ccec..8f32609 100644 --- a/nvim/lua/settings.lua +++ b/nvim/lua/settings.lua @@ -1,21 +1,21 @@ -- Global settings -vim.opt.tabstop = 4 -- Number of spaces that a counts for -vim.opt.shiftwidth = 4 -- Number of spaces for indentation -vim.opt.expandtab = true -- Use spaces instead of tabs +vim.opt.tabstop = 4 -- Number of spaces that a counts for +vim.opt.shiftwidth = 4 -- Number of spaces for indentation +vim.opt.expandtab = true -- Use spaces instead of tabs +vim.opt.cmdheight = 0 -- Hide command line when not in use -vim.cmd [[highlight CursorLine guibg=#3c3836]] -- Darker background for the line -vim.cmd [[highlight CursorColumn guibg=#504945]] -- Slightly darker for the column +vim.cmd([[highlight CursorLine guibg=#3c3836]]) -- Darker background for the line +vim.cmd([[highlight CursorColumn guibg=#504945]]) -- Slightly darker for the column -vim.cmd [[set incsearch ]] -- Enables incremental search -vim.cmd [[set hlsearch ]] -- Highlights search results -vim.cmd [[set ignorecase]] -- Case insensitive search -vim.cmd [[set smartcase ]] -- Case sensitive if uppercase letters are used +vim.cmd([[set incsearch ]]) -- Enables incremental search +vim.cmd([[set hlsearch ]]) -- Highlights search results +vim.cmd([[set ignorecase]]) -- Case insensitive search +vim.cmd([[set smartcase ]]) -- Case sensitive if uppercase letters are used -- Coloscheme -vim.cmd [[colorscheme gruvbox]] - -vim.cmd [[set spelllang=en]] +vim.cmd([[colorscheme gruvbox]]) +vim.cmd([[set spelllang=en]]) vim.cmd([[ highlight Normal ctermbg=none guibg=none @@ -24,3 +24,12 @@ vim.cmd([[ vim.o.title = true vim.o.titlestring = "nvim: %f" + +vim.api.nvim_create_autocmd("FileType", { + pattern = "lua", + callback = function() + vim.opt_local.foldmethod = "marker" + vim.opt_local.foldlevel = 99 -- so folds are open by default + vim.opt_local.fileencoding = "utf-8" + end, +})