diff options
| author | Thomas Vanbesien <tvanbesi@proton.me> | 2026-05-04 08:44:50 +0200 |
|---|---|---|
| committer | Thomas Vanbesien <tvanbesi@proton.me> | 2026-05-06 16:43:16 +0200 |
| commit | 0bc002288b984d8ec8123c135456570c78a22da3 (patch) | |
| tree | 020ed3f6a7f28a081687a3e46ea190e3aa724f7c /.config/nvim/init.lua | |
| download | dotfiles-0bc002288b984d8ec8123c135456570c78a22da3.tar.gz dotfiles-0bc002288b984d8ec8123c135456570c78a22da3.zip | |
feat: initial setup
- `dotfiles` (this project's CLI)
- foot configuration
- tmux configuration
- bash configuration
- nvim (as a git submodule) + configuration
- ranger configuration
- fzf configuration
- KDE global shortcuts
- Other miscellaneous dependencies
Diffstat (limited to '.config/nvim/init.lua')
| -rw-r--r-- | .config/nvim/init.lua | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..0a116d5 --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,178 @@ +if vim.env.DOTFILES_DIR == nil then + vim.notify("DOTFILES_DIR is not set!", vim.log.levels.WARN) +end + +vim.g.dotfiles = { augroup = vim.api.nvim_create_augroup("dotfiles", {}) } + +------------------------------------------------------------------------------------------------------------------------ +-- Local functions +------------------------------------------------------------------------------------------------------------------------ + +-- Show the diff between the current buffer and the file it was loaded from +local function show_buf_diff_orig() + vim.cmd.new({ mods = { vertical = true } }) + vim.b.buftype = "nofile" + vim.cmd.read("++edit #") + vim.api.nvim_buf_set_lines(0, 0, 2, true, {}) + vim.cmd.diffthis() + vim.cmd.wincmd("p") + vim.cmd.diffthis() +end + +local function reload_buffer() + local view = vim.fn.winsaveview() + if vim.o.filetype == "netrw" then + vim.cmd.edit(".") + else + vim.cmd.edit() + end + vim.fn.winrestview(view) +end + +local function toggle_wrap() + vim.o.wrap = not vim.o.wrap +end + +------------------------------------------------------------------------------------------------------------------------ +-- Miscellaneous +------------------------------------------------------------------------------------------------------------------------ + +vim.g.mapleader = " " -- Set before any `vim.keymap.set()` call + +-- Highlight on yank +vim.api.nvim_create_autocmd("TextYankPost", { + desc = "Highlight on yank", + group = vim.g.dotfiles.augroup, + callback = function() + vim.hl.on_yank() + end, +}) + +-- Start terminal mode automatically +vim.api.nvim_create_autocmd({ "WinEnter", "TermOpen" }, { + desc = "Start terminal mode", + group = vim.g.dotfiles.augroup, + pattern = "term://*", + callback = function() + vim.cmd.startinsert() + end, +}) + +------------------------------------------------------------------------------------------------------------------------ +-- Plugins +------------------------------------------------------------------------------------------------------------------------ + +vim.pack.add({ + "https://github.com/qadzek/link.vim", -- Tidy URLs + "https://github.com/tpope/vim-surround", -- Manipulate delimiters + "https://github.com/airblade/vim-gitgutter", -- Show git status in the gutter +}) + +------------------------------------------------------------------------------------------------------------------------ +-- Commands (there's more in the different plugins) +------------------------------------------------------------------------------------------------------------------------ + +vim.api.nvim_create_user_command("DiffOrig", show_buf_diff_orig, { desc = "Show diff between current buffer and file" }) + +------------------------------------------------------------------------------------------------------------------------ +-- Keymaps (there's more in the different plugins) +------------------------------------------------------------------------------------------------------------------------ +-- See `:help key-notation` and `:help <Cmd>` + +-- Miscellaneous +vim.keymap.set("n", "<Leader>s", "<Cmd>update<CR>", { desc = "Save buffer" }) +vim.keymap.set("n", "<Leader>be", reload_buffer, { desc = "Reload buffer" }) +vim.keymap.set("n", "<Leader>bd", "<Cmd>bdelete<CR>", { desc = "Delete current buffer" }) +vim.keymap.set("n", "<Leader>bb", "<Cmd>close<CR>", { desc = "Delete current window" }) +vim.keymap.set("n", "<Leader>bw", toggle_wrap, { desc = "Toggle text wrap" }) +vim.keymap.set("n", "<M-z>", "zA", { desc = "Toggle fold (recursively) under cursor" }) +vim.keymap.set("n", "ZR", vim.cmd.SessionRestart, { desc = "Save and load default session and restart" }) +vim.keymap.set("n", "ZZ", vim.cmd.SessionExitSave, { desc = "Save to default session and exit" }) +vim.keymap.set("n", "ZQ", vim.cmd.SessionExitNoSave, { desc = "Save to default session and exit" }) +vim.keymap.set("t", "<C-\\><C-\\>", "<C-\\><C-n>", { desc = "Exit terminal mode" }) +vim.keymap.set("n", "<Leader>mm", "<Cmd>messages<CR>", { desc = "Show all messages" }) +vim.keymap.set("n", "<Leader>mc", "<Cmd>messages clear<CR>", { desc = "Clear all messages" }) +vim.keymap.set("n", "<Leader>lh", vim.cmd.LspHintToggle, { desc = "Toggle inlay hints (LSP)" }) +-- These two mappings work well together to start command mode and insert from history in two keystrokes. +vim.keymap.set("n", "<C-p>", ":", { desc = "Enter command mode" }) +vim.keymap.set("c", "<C-p>", "<Up>", { desc = "Insert previous history entry" }) +-- Navigate files +vim.keymap.set("n", "<M-e>", vim.cmd.GotoExplorer, { desc = "Open/close/focus netrw window" }) +-- Navigate window +vim.keymap.set({ "n", "i" }, "<M-h>", "<C-w>h", { desc = "Move left a window" }) +vim.keymap.set({ "n", "i" }, "<M-j>", "<C-w>j", { desc = "Move down a window" }) +vim.keymap.set({ "n", "i" }, "<M-k>", "<C-w>k", { desc = "Move up a window" }) +vim.keymap.set({ "n", "i" }, "<M-l>", "<C-w>l", { desc = "Move right a window" }) +vim.keymap.set("t", "<M-h>", "<C-\\><C-n><C-w>h", { desc = "Move left a window" }) +vim.keymap.set("t", "<M-j>", "<C-\\><C-n><C-w>j", { desc = "Move down a windowd" }) +vim.keymap.set("t", "<M-k>", "<C-\\><C-n><C-w>k", { desc = "Move up a window" }) +vim.keymap.set("t", "<M-l>", "<C-\\><C-n><C-w>l", { desc = "Move right a window" }) +-- Navigate tab +vim.keymap.set({ "n", "i", "t" }, "<M-n>", "<Cmd>tabnext #<CR>", { desc = "Move to last accessed tab page" }) +vim.keymap.set({ "n", "i", "t" }, "<M-n>", "<Cmd>tabnext<CR>", { desc = "Move to next tab page" }) +vim.keymap.set({ "n", "i", "t" }, "<M-b>", "<Cmd>tabprevious<CR>", { desc = "Move to previous tab page" }) +vim.keymap.set("i", "<M-h>", "<Space><BS><Left>") +vim.keymap.set("i", "<M-l>", "<Space><BS><Right>") +-- Navigate in command/insert mode +vim.keymap.set({ "c", "i" }, "<M-h>", "<Space><BS><Left>") +vim.keymap.set({ "c", "i" }, "<M-l>", "<Space><BS><Right>") +vim.keymap.set("c", "<M-H>", "<C-Left>") +vim.keymap.set("c", "<M-L>", "<C-Right>") +-- Non incremental history search, works when the completion menu is active +vim.keymap.set("c", "<C-k>", function() + return vim.fn.pumvisible() == 1 and "<C-e><Up>" or "<Up>" +end, { expr = true }) +vim.keymap.set("c", "<C-j>", function() + return vim.fn.pumvisible() == 1 and "<C-e><Down>" or "<Down>" +end, { expr = true }) + +------------------------------------------------------------------------------------------------------------------------ +-- Options +------------------------------------------------------------------------------------------------------------------------ + +vim.opt.shell = "/usr/bin/bash" +vim.opt.foldenable = true -- Folds are closed by default +vim.opt.pumheight = 0 -- Popup menu height +vim.opt.confirm = true -- Confirm before losing buffer unsaved changes +vim.opt.splitbelow = false +vim.opt.splitright = false +vim.opt.clipboard = "unnamedplus" -- Sync clipboard +vim.opt.cursorline = true -- Highlight the line where the cursor is on. +vim.opt.scrolloff = 2 -- Keep this many screen lines above/below the cursor +vim.opt.ignorecase = true -- Search ignores case by default +vim.opt.smartcase = true -- Search is case-sensitive if searching for uppercase characters +vim.opt.conceallevel = 2 -- Hide text with the "conceal" syntax attribute +vim.opt.list = true -- Display <Tab> and other non-printables +vim.opt.listchars = { -- Characters used by 'list' + tab = "> ", -- Tab + trail = "-", -- Trailing space + nbsp = "+", -- Non-breakable space + extends = "→", -- Last column when 'wrap' is off + precedes = "←", -- First column when there is text before it +} +-- See `'cpoptions'` +-- Use a `\` like `CTRL_V` in mappings, abbreviations, user commands and the "to" part of menu commands +-- Useful for example for matching mappings that start with space: `:map \ ` +vim.opt.cpoptions:remove("B") +-- Backup +vim.opt.swapfile = true -- Store a swap file, see `:help swap-file` +vim.opt.undofile = true -- Save buffer undo history +vim.opt.backup = true -- Backup file before overwriting +vim.opt.backupdir = { vim.fn.stdpath("state") .. "/nvim/backup//" } +vim.opt.writebackup = true -- Keep backup after writing file +-- Gutter +vim.opt.number = true -- Show line number +vim.opt.relativenumber = true -- Show relative line number +vim.opt.numberwidth = 4 -- Minimal number of columns for line number (includes the space before the text) +vim.opt.signcolumn = "auto" -- Always show sign column +vim.opt.foldcolumn = "0" -- Fixed number of fold columns +-- Wrapping +vim.opt.wrap = false -- Don't wrap text by default +vim.opt.showbreak = "+++ " -- String to show wrapped lines +vim.opt.linebreak = true -- Wrap at characters in 'breakat' +vim.opt.breakindent = true -- Indent wrapped lines +-- Tab and backspace (See `help 30.5`) +vim.opt.tabstop = 4 -- <Tab> and <Bs> visually expand at columns multiple of 'tabstop' +vim.opt.shiftwidth = 0 -- Number of space in first indendation. If 0 use 'tabstop' value. +vim.opt.softtabstop = -1 -- <Tab> and <Bs> stop at columns multiple of 'softtabstop'. If <0 use 'shiftwidth' value. +vim.opt.expandtab = false -- Don't turn tabs into spaces |
