diff --git a/.gitignore b/.gitignore index 0cc9af9..ed11bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coc-settings.json lazy-lock.json after **/.DS_Store +lua/custom/secret diff --git a/lua/core/init.lua b/lua/core/init.lua index 19804e1..ce8db46 100644 --- a/lua/core/init.lua +++ b/lua/core/init.lua @@ -71,42 +71,6 @@ autocmd("FileType", { end, }) --- reload some chadrc options on-save -autocmd("BufWritePost", { - pattern = vim.tbl_map(function(path) - return vim.fs.normalize(vim.loop.fs_realpath(path)) - end, vim.fn.glob(vim.fn.stdpath "config" .. "/lua/custom/**/*.lua", true, true, true)), - group = vim.api.nvim_create_augroup("ReloadNvChad", {}), - - callback = function(opts) - local fp = vim.fn.fnamemodify(vim.fs.normalize(vim.api.nvim_buf_get_name(opts.buf)), ":r") --[[@as string]] - local app_name = vim.env.NVIM_APPNAME and vim.env.NVIM_APPNAME or "nvim" - local module = string.gsub(fp, "^.*/" .. app_name .. "/lua/", ""):gsub("/", ".") - - require("plenary.reload").reload_module "base46" - require("plenary.reload").reload_module(module) - require("plenary.reload").reload_module "custom.chadrc" - - config = require("core.utils").load_config() - - vim.g.nvchad_theme = config.ui.theme - vim.g.transparency = config.ui.transparency - - -- statusline - require("plenary.reload").reload_module("nvchad.statusline." .. config.ui.statusline.theme) - vim.opt.statusline = "%!v:lua.require('nvchad.statusline." .. config.ui.statusline.theme .. "').run()" - - -- tabufline - if config.ui.tabufline.enabled then - require("plenary.reload").reload_module "nvchad.tabufline.modules" - vim.opt.tabline = "%!v:lua.require('nvchad.tabufline.modules').run()" - end - - require("base46").load_all_highlights() - -- vim.cmd("redraw!") - end, -}) - -------------------------------------- commands ------------------------------------------ local new_cmd = vim.api.nvim_create_user_command diff --git a/lua/custom/chadrc.lua b/lua/custom/chadrc.lua index f028aa5..f39ceda 100644 --- a/lua/custom/chadrc.lua +++ b/lua/custom/chadrc.lua @@ -5,8 +5,8 @@ local M = {} local highlights = require "custom.highlights" M.ui = { - theme = "chadracula", - theme_toggle = { "kanagawa", "chadracula" }, + theme = "oceanic-next", + theme_toggle = { "oceanic-next", "ayu_light" }, hl_override = highlights.override, hl_add = highlights.add, @@ -64,7 +64,8 @@ local get_info = function() }, { " Mappings", "ch", "NvCheatsheet" }, { " Git", "gg", "LazyGit" }, - { " Files", "", "NvimTreeToggle" }, + { " Files", "", "NvimTreeToggle" }, + { " Change Directory", ";cd", "Telescope zoxide list" }, { " Terminal", "", "ToggleTerm direction=float" }, } return buf diff --git a/lua/custom/configs/conform.lua b/lua/custom/configs/conform.lua index 4b142bd..766f55e 100644 --- a/lua/custom/configs/conform.lua +++ b/lua/custom/configs/conform.lua @@ -1,24 +1,29 @@ local options = { - lsp_fallback = true, + lsp_fallback = true, - formatters_by_ft = { - lua = { "stylua" }, + formatters_by_ft = { + lua = { "stylua" }, - javascript = { "prettier" }, - css = { "prettier" }, - html = { "prettier" }, + javascript = { "prettier" }, + css = { "prettier" }, + html = { "prettier" }, - sh = { "shfmt" }, - }, + sh = { "shfmt" }, + toml = { "taplo" }, + rust = { "rustfmt" }, + + tex = { "latexindent" }, + latex = { "latexindent" }, + }, -- adding same formatter for multiple filetypes can look too much work for some -- instead of the above code you could just use a loop! the config is just a table after all! - -- format_on_save = { - -- -- These options will be passed to conform.format() - -- timeout_ms = 500, - -- lsp_fallback = true, - -- }, + -- format_on_save = { + -- -- These options will be passed to conform.format() + -- timeout_ms = 500, + -- lsp_fallback = true, + -- }, } require("conform").setup(options) diff --git a/lua/custom/configs/lspconfig.lua b/lua/custom/configs/lspconfig.lua index fad87e4..7498a2a 100644 --- a/lua/custom/configs/lspconfig.lua +++ b/lua/custom/configs/lspconfig.lua @@ -2,6 +2,7 @@ local on_attach = require("plugins.configs.lspconfig").on_attach local capabilities = require("plugins.configs.lspconfig").capabilities local lspconfig = require "lspconfig" +local lspsettings = require "custom.configs.lspsettings" -- if you just want default config for the servers then put them in a table local servers = { @@ -10,9 +11,11 @@ local servers = { "tsserver", "clangd", "pyright", - "rust_analyzer", "bashls", "cmake", + "yamlls", + "texlab", + "csharp_ls", } for _, lsp in ipairs(servers) do @@ -21,3 +24,13 @@ for _, lsp in ipairs(servers) do capabilities = capabilities, } end + +local server_with_settings = { + -- "textlsp", + "ltex", + "rust_analyzer", +} + +for _, lsp in ipairs(server_with_settings) do + lspconfig[lsp].setup(lspsettings[lsp]) +end diff --git a/lua/custom/configs/lspsettings.lua b/lua/custom/configs/lspsettings.lua new file mode 100644 index 0000000..f1450ff --- /dev/null +++ b/lua/custom/configs/lspsettings.lua @@ -0,0 +1,195 @@ +local on_attach = require("plugins.configs.lspconfig").on_attach +local capabilities = require("plugins.configs.lspconfig").capabilities + +local M = {} + +M.rust_analyzer = { + on_attach = on_attach, + capabilities = capabilities, + settings = { + ["rust-analyzer"] = { + check = { + command = "clippy", + }, + imports = { + granularity = { + group = "module", + }, + prefix = "self", + }, + cargo = { + buildScripts = { + enable = true, + }, + }, + procMacro = { + enable = true, + }, + }, + }, +} + +M.ltex = { + on_attach = on_attach, + capabilities = capabilities, + use_spellfile = false, + settings = { + ltex = { + checkFrequency = "save", -- shut up while i'm just editing, see + -- specific language (such as en-GB or de-DE is recommended, but I + -- want multilingual) + language = "auto", + enabled = { + "bibtex", + "tex", + "latex", + "gitcommit", + "markdown", + "org", + "restructuredtext", + "rsweave", + "quarto", + "rmd", + "context", + -- "html", + -- "xhtml", + }, + additionalRules = { + enablePickyRules = true, + -- thats cool, but often adds diagnostics in + -- places where a german might confuse words that are similar + -- between english and german REGARDLESS of context. I seem to use the + -- english words only in the proper contexts, so leaving this on + -- just adds annoying hints like 'Hinweis: "list/NN.*" (English) bedeutet "Liste", + -- "Verzeichnis" (German). Meinten Sie vielleicht 'cunning', 'trick'?' + -- everytime I use the word "list". I liked that this makes the hints be + -- in german regardless of the language I'm working in through... + --motherTongue = "de", + }, + -- load token and additional languagetool items later + }, + }, +} + +M.textlsp = { + on_attach = on_attach, + capabilities = capabilities, + filetypes = { + "bibtex", + "tex", + "latex", + "gitcommit", + "markdown", + "org", + "restructuredtext", + "rsweave", + "quarto", + "rmd", + "context", + "html", + "xhtml", + }, + settings = { + textLSP = { + analysers = { + languagetool = { + enabled = true, + check_text = { + on_open = true, + on_save = true, + on_change = false, + }, + }, + gramformer = { + -- gramformer dependency needs to be installed manually + enabled = true, + gpu = false, + check_text = { + on_open = false, + on_save = true, + on_change = false, + }, + }, + hf_checker = { + enabled = false, + gpu = false, + quantize = 32, + model = "pszemraj/flan-t5-large-grammar-synthesis", + min_length = 40, + check_text = { + on_open = false, + on_save = true, + on_change = false, + }, + }, + hf_instruction_checker = { + enabled = true, + gpu = false, + quantize = 32, + model = "grammarly/coedit-large", + min_length = 40, + check_text = { + on_open = false, + on_save = true, + on_change = false, + }, + }, + hf_completion = { + enabled = true, + gpu = false, + quantize = 32, + model = "bert-base-multilingual-cased", + topk = 5, + }, + -- openai = { + -- enabled = false, + -- api_key = "", + -- check_text = { + -- on_open = false, + -- on_save = false, + -- on_change = false, + -- }, + -- model = "gpt-3.5-turbo", + -- max_token = 16, + -- }, + -- grammarbot = { + -- enabled = false, + -- api_key = "", + -- -- longer texts are split, this parameter sets the maximum number of splits per analysis + -- input_max_requests = 1, + -- check_text = { + -- on_open = false, + -- on_save = false, + -- on_change = false, + -- }, + -- }, + }, + documents = { + -- org = { + -- org_todo_keywords = { + -- "TODO", + -- "IN_PROGRESS", + -- "DONE", + -- }, + -- }, + txt = { + parse = true, + }, + }, + }, + }, +} + +-- load secrets +-- the secret module should just return a string with the token +local available, token = require("custom.utils").try_require "custom.secret.languagetool_token" +if available then + M.ltex.languageToolOrg = { + apiKey = token, + username = "accounts@cscherr.de", + languageToolHttpServerUrl = "https://api.languagetoolplus.com/v2/", + } + M.ltex.languageToolHttpServerUrl = "https://api.languagetoolplus.com/v2/" +end + +return M diff --git a/lua/custom/configs/overrides.lua b/lua/custom/configs/overrides.lua index 713113d..5226d76 100644 --- a/lua/custom/configs/overrides.lua +++ b/lua/custom/configs/overrides.lua @@ -30,38 +30,25 @@ M.treesitter = { M.mason = { ensure_installed = { - -- general purpose "purpose", - - -- lua stuff "lua-language-server", "stylua", - - -- web dev stuff "css-lsp", "html-lsp", "typescript-language-server", "deno", "prettier", - - -- c/cpp stuff "clangd", "clang-format", "cmake-language-server", - - -- rust "rust-analyzer", "taplo", - - -- python "pyright", - - -- english?? - "write-good", - - -- shell "shellcheck", "bash-language-server", + "ltex-ls", + "shellcheck", + "taplo", }, } diff --git a/lua/custom/highlights.lua b/lua/custom/highlights.lua index a3c1d31..6ff2e60 100644 --- a/lua/custom/highlights.lua +++ b/lua/custom/highlights.lua @@ -7,16 +7,19 @@ local M = {} ---@type Base46HLGroupsList M.override = { Comment = { - italic = true, - }, - NvDashAscii = { - fg = "#b33366", - bg = "#1a1a1a", - }, - NvDashButtons = { - fg = "White", - bg = "#241e1e", + italic = false, }, + -- NvDashAscii = { + -- fg = "#b33366", + -- bg = "#1a1a1a", + -- }, + -- NvDashButtons = { + -- fg = "White", + -- bg = "#241e1e", + -- }, + TodoFgNOTE = { + fg = "#cccccc" + } } ---@type HLTable diff --git a/lua/custom/init.lua b/lua/custom/init.lua index 75bd82e..2e82000 100644 --- a/lua/custom/init.lua +++ b/lua/custom/init.lua @@ -1,9 +1,10 @@ local opt = vim.opt local g = vim.g g.maplocalleader = ";" +g.python3_host_prog = "/usr/bin/python3" +opt.mouse = "a" -- mouse does annoying things for me if it's not 'a' opt.signcolumn = "yes" -opt.spelllang = "en,de" opt.clipboard = "" -- don't just use the system clipboard opt.wrap = false opt.breakindent = false @@ -29,10 +30,16 @@ opt.shiftround = true -- Round indent to multiple of 'shiftwidth' -- Timing -- === +-- NOTE: the which-key plugin makes this a little different. Instead of going +-- to a newline after "o", the which-key panel opens. Only when we input +-- something other than "o" it will go to the line and write that. I don't +-- really like this behavior. We can disable this for specific triggers. +-- See https://github.com/folke/which-key.nvim +opt.timeout = true opt.ttimeout = true -opt.timeoutlen = 500 -- Time out on mappings +opt.timeoutlen = 250 -- Time out on mappings opt.ttimeoutlen = 10 -- Time out on key codes -opt.updatetime = 500 -- Idle time to write swap and trigger CursorHold +opt.updatetime = 300 -- Idle time to write swap and trigger CursorHold -- Searching -- === @@ -62,7 +69,7 @@ opt.wildmode = "longest:full,full" -- Command-line completion mode -- Folds -- === -opt.foldlevel = 10000 -- start with all folds open +opt.foldlevel = 10 -- start with all folds open -- Editor UI -- === @@ -75,6 +82,7 @@ opt.scrolloff = 2 -- Keep at least n lines above/below opt.sidescrolloff = 0 -- Keep at least n lines left/right opt.numberwidth = 2 -- Minimum number of columns to use for the line number opt.number = true -- Show line numbers +opt.relativenumber = true -- Show relative line numbers opt.ruler = true -- Default status ruler opt.list = true -- Show hidden characters opt.showtabline = 1 -- Don't change this, goes back to a vanilla vim default @@ -83,6 +91,24 @@ opt.laststatus = 3 -- Always show laststatus if vim.g.started_by_firenvim == true then opt.showtabline = 1 -- Don't show tabline in firenvim, unless multitab opt.laststatus = 1 -- Don't show laststatus in firenvim + opt.wrap = true +end + +if vim.g.neovide == true then + -- fulscreen with F11 + vim.api.nvim_set_keymap("n", "", ":let g:neovide_fullscreen = !g:neovide_fullscreen", {}) + + vim.g.neovide_underline_automatic_scaling = true + + -- vim.g.neovide_floating_blur_amount_x = 2.0 + -- vim.g.neovide_floating_blur_amount_y = 2.0 + + vim.g.neovide_scroll_animation_length = 0.1 + -- vim.g.neovide_cursor_animation_length = 0 + -- vim.g.neovide_cursor_trail_size = 0 + vim.g.neovide_hide_mouse_when_typing = true + + vim.g.neovide_fullscreen = true end opt.helpheight = 0 -- Disable help window resizing @@ -104,6 +130,13 @@ opt.pumheight = 10 -- Maximum number of items to show in the popup menu opt.pumwidth = 10 -- Minimum width for the popup menu opt.pumblend = 10 -- Popup blend +-- Spelling correction +-- === + +opt.spell = false -- manually enable spell with `set spell` or `ts` +opt.spelllang = "en,de_de," +opt.spellsuggest = "double,50,timeout:5000" + -- autocommands -- === local function augroup(name) @@ -136,12 +169,15 @@ vim.api.nvim_create_autocmd("VimResized", { }) -- Wrap and enable spell-checker in text filetypes +-- also enable wrap on these text filetypes vim.api.nvim_create_autocmd("FileType", { group = augroup "spell_conceal", pattern = { "gitcommit", "markdown", "tex", "latex", "norg" }, callback = function() vim.opt_local.spell = true vim.opt_local.conceallevel = 0 + vim.opt.wrap = true + -- vim.opt.formatoptions = "" end, }) @@ -154,3 +190,7 @@ if vim.g.started_by_firenvim == true then vim.o.lines = vim.o.lines - 1 end, { expr = true, desc = "Make Display smaller" }) end + +-- alias filetypes +vim.filetype.add { extension = { tera = "html" } } +vim.filetype.add { extension = { plaintex = "tex" } } diff --git a/lua/custom/mappings.lua b/lua/custom/mappings.lua index fdbc0f9..a783009 100644 --- a/lua/custom/mappings.lua +++ b/lua/custom/mappings.lua @@ -1,4 +1,5 @@ ---@type MappingsTable + local M = {} -- NOTE: The mappings here are case sensitive!!! Removing a specific default @@ -40,7 +41,6 @@ M.disabled = { ["td"] = "", ["wk"] = "", ["#"] = "", - ["?"] = "", }, t = { [""] = "", @@ -206,6 +206,9 @@ M.telescope = { ["fo"] = { " Telescope oldfiles ", "Find oldfiles" }, ["fz"] = { " Telescope current_buffer_fuzzy_find ", "Find in current buffer" }, + -- directory + ["cd"] = { " Telescope zoxide list", "telescope zoxide cd" }, + -- git ["cm"] = { " Telescope git_commits ", "Git commits" }, ["gt"] = { " Telescope git_status ", "Git status" }, @@ -217,6 +220,14 @@ M.telescope = { ["th"] = { " Telescope themes ", "Nvchad themes" }, ["ma"] = { " Telescope marks ", "telescope bookmarks" }, + + -- lsp stuff + ["cw"] = { + " Telescope lsp_dynamic_workspace_symbols ", + "telescope dynamic workspace symbols", + }, + ["cf"] = { " Telescope lsp_document_symbols ", "telescope document symbols" }, + ["ci"] = { " Telescope diagnostics ", "telescope diagnostics" }, }, } @@ -224,45 +235,89 @@ M.toggleterm = { plugin = true, n = { [""] = { - "ToggleTerm direction=float", + 'exe v:count1 "ToggleTerm direction=float"', "toggle terminal", }, [""] = { - "ToggleTerm direction=float", + 'exe v:count1 "ToggleTerm direction=float"', "toggle terminal", }, [""] = { - "ToggleTerm direction=tab", + 'exe v:count1 "ToggleTerm direction=tab"', "toggle terminal", }, [""] = { - "ToggleTerm direction=horizontal", + 'exe v:count1 "ToggleTerm direction=horizontal"', "toggle terminal", }, [""] = { - "ToggleTerm direction=vertical", + 'exe v:count1 "ToggleTerm direction=vertical"', + "toggle terminal", + }, + }, + i = { + [""] = { + 'exe v:count1 "ToggleTerm direction=float"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=float"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=tab"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=horizontal"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=vertical"', "toggle terminal", }, }, t = { [""] = { - "ToggleTerm direction=float", + 'exe v:count1 "ToggleTerm direction=float"', "toggle terminal", }, [""] = { - "ToggleTerm direction=float", + 'exe v:count1 "ToggleTerm direction=float"', "toggle terminal", }, [""] = { - "ToggleTerm direction=tab", + 'exe v:count1 "ToggleTerm direction=tab"', "toggle terminal", }, [""] = { - "ToggleTerm direction=horizontal", + 'exe v:count1 "ToggleTerm direction=horizontal"', "toggle terminal", }, [""] = { - "ToggleTerm direction=vertical", + 'exe v:count1 "ToggleTerm direction=vertical"', + "toggle terminal", + }, + }, + x = { + [""] = { + 'exe v:count1 "ToggleTerm direction=float"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=float"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=tab"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=horizontal"', + "toggle terminal", + }, + [""] = { + 'exe v:count1 "ToggleTerm direction=vertical"', "toggle terminal", }, }, @@ -274,6 +329,7 @@ M.nvimtree = { -- toggle [""] = { " NvimTreeToggle ", "Toggle nvimtree" }, [""] = { " NvimTreeToggle ", "Toggle nvimtree" }, + ["tf"] = { " NvimTreeToggle ", "Toggle nvimtree" }, -- focus ["e"] = { " NvimTreeFocus ", "Focus nvimtree" }, @@ -306,12 +362,13 @@ M.movements = { ["H"] = { "", "Beginning of line" }, ["L"] = { "", "End of line" }, - -- go to mark with "#" - ["#"] = { "'", "go to mark" }, - -- spell ["]s"] = { "]s", "go to next spelling mark" }, ["[s"] = { "[s", "go to last spelling mark" }, + + -- just scroll a line + ["zk"] = { "", "scroll up a line" }, + ["zj"] = { "", "scroll down a line" }, }, v = { --big move @@ -327,6 +384,10 @@ M.movements = { vim.api.nvim_replace_termcodes("", true, true, true), "Escape terminal mode", }, + [""] = { + '"+pi', + "paste into terminal", + }, }, } @@ -334,25 +395,27 @@ M.edit = { plugin = false, n = { -- easy newline - ["OO"] = { "O", "insert a line above", opts = { nowait = false } }, - ["oo"] = { "o", "insert a line below", opts = { nowait = false } }, + ["OO"] = { "O", "insert a line above" }, + ["oo"] = { "o", "insert a line below" }, + + -- substitute (change hovered/selection with insert mode) + -- normally, this is s, but that is leaps binding now + ["s"] = { "s", "replace with insert mode" }, -- split and join lines - -- "J" for join is defaul - ["S"] = { - "il", - "split line", - }, + [""] = { "join", "join lines" }, + [""] = { "il", "split line" }, -- do something useful with the arrows - [""] = { " move-2", "Move line up", opts = { expr = true } }, - [""] = { " move+", "Move line down", opts = { expr = true } }, - [""] = { " << ", "Less indentation", opts = { expr = true } }, - [""] = { " >> ", "More indentation", opts = { expr = true } }, + [""] = { " move-2", "Move line up" }, + [""] = { " move+", "Move line down" }, + [""] = { "<<", "Less indentation" }, + [""] = { ">>", "More indentation" }, -- format with conform ["ff"] = { function() + -- vim.lsp.buf.format() require("conform").format() end, "format buffer", @@ -371,13 +434,15 @@ M.edit = { ["z="] = { "Telescope spell_suggest", "Spell suggest" }, }, v = { + -- NOTE: I would love to know why these commands work, they seem really + -- crazy. + [""] = { ":move'<-2gv=gv", "Move lines up", opts = { silent = true } }, + [""] = { ":move'>+gv=gv", "Move lines down", opts = { silent = true } }, [""] = { ""] = { ">gv", "More indentation" }, + ["fl"] = { ":!fmt -w80", "Reorder lines" }, }, - x = { - [""] = { "move'<-2gv=gv", "Move line up", opts = { expr = true } }, - [""] = { "move'<-2gv=gv", "Move line down", opts = { expr = true } }, - }, + x = {}, t = { --big move [""] = { "", "big step down" }, @@ -495,4 +560,104 @@ M.goto_preview = { }, } +M.debug = { + plugin = true, + n = { + ["db"] = { + function() + require("dap").toggle_breakpoint() + end, + "toggle breakpoint", + noremap = true, + }, + ["dc"] = { + function() + require("dap").continue() + end, + "debug continue", + noremap = true, + }, + ["ds"] = { + function() + require("dap").step_over() + end, + "debug step over", + noremap = true, + }, + ["di"] = { + function() + require("dap").step_into() + end, + "debug step into", + noremap = true, + }, + ["dr"] = { + function() + require("dap").repl.open() + end, + "debug open repl", + noremap = true, + }, + ["dws"] = { + function() + local widgets = require "dap.ui.widgets" + local my_sidebar = widgets.sidebar(widgets.scopes) + my_sidebar.open() + end, + "debug window scopes", + noremap = true, + }, + ["dwt"] = { + function() + local widgets = require "dap.ui.widgets" + local my_sidebar = widgets.sidebar(widgets.threads) + my_sidebar.open() + end, + "debug window threads", + noremap = true, + }, + ["dwe"] = { + function() + local widgets = require "dap.ui.widgets" + local my_sidebar = widgets.sidebar(widgets.expression) + my_sidebar.open() + end, + "debug window expressions", + noremap = true, + }, + ["dwi"] = { + function() + local widgets = require "dap.ui.widgets" + local my_sidebar = widgets.sidebar(widgets.sessions) + my_sidebar.open() + end, + "debug window sessions", + noremap = true, + }, + ["dwf"] = { + function() + local widgets = require "dap.ui.widgets" + local my_sidebar = widgets.sidebar(widgets.frames) + my_sidebar.open() + end, + "debug window frames", + noremap = true, + }, + ["dK"] = { + function() + require("dap.ui.widgets").hover() + end, + "debug hover", + noremap = true, + }, + ["du"] = { + function() + require("dapui").toggle() + end, + "debug ui toggle", + noremap = true, + }, + }, +} + return M diff --git a/lua/custom/plugins.lua b/lua/custom/plugins.lua index 2b8222f..70723a4 100644 --- a/lua/custom/plugins.lua +++ b/lua/custom/plugins.lua @@ -30,7 +30,9 @@ local plugins = { -- Install a plugin { + -- exit insert mode with 'jk' "max397574/better-escape.nvim", + enabled = true, event = "InsertEnter", config = function() require("better_escape").setup() @@ -92,14 +94,41 @@ local plugins = { ["]"] = { name = "+next" }, ["["] = { name = "+prev" }, ["x"] = { name = "+diagnostics/quickfix" }, + ["d"] = { name = "+debug" }, ["c"] = { name = "+code" }, ["g"] = { name = "+git" }, ["t"] = { name = "+toggle/tools" }, ["w"] = { name = "+window/which" }, ["f"] = { name = "+formatting" }, }, + opts = { + triggers_nowait = { + -- marks + "`", + "'", + "g`", + "g'", + -- registers + '"', + "", + -- spelling + "z=", + }, + triggers_blacklist = { + -- list of mode / prefixes that should never be hooked by WhichKey + -- this is mostly relevant for keymaps that start with a native binding + i = { "j", "k" }, + v = { "j", "k" }, + n = { "o", "O" }, + }, + }, + }, + { + "echasnovski/mini.trailspace", + lazy = false, + event = { "BufReadPost", "BufNewFile" }, + opts = {}, }, - { "echasnovski/mini.trailspace", lazy = false, event = { "BufReadPost", "BufNewFile" }, opts = {} }, { "itchyny/vim-cursorword", event = "FileType", @@ -213,16 +242,26 @@ local plugins = { icon = " ", -- icon used for the sign, and in search results color = "error", -- can be a hex color, or a named color (see below) alt = { "FIXME", "BUG", "FIXIT", "ISSUE" }, -- a set of other keywords that all map to this FIX keywords - -- signs = false, -- configure signs for some keywords individually }, - TODO = { icon = " ", color = "info" }, - HACK = { icon = " ", color = "warning" }, - SECURITY = { icon = "󰒃 ", color = "warning" }, + TODO = { icon = " ", color = "todo" }, + HACK = { icon = " ", color = "hack" }, + SECURITY = { icon = "󰒃 ", color = "security" }, WARN = { icon = " ", color = "warning", alt = { "WARNING", "XXX" } }, - PERF = { icon = " ", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } }, - NOTE = { icon = " ", color = "hint", alt = { "INFO" } }, + PERF = { icon = " ", color = "perf", alt = { "OPTIM", "PERFORMANCE", "OPTIMIZE" } }, + NOTE = { icon = " ", color = "hint", alt = { "INFO" } }, TEST = { icon = "⏲ ", color = "test", alt = { "TESTING", "PASSED", "FAILED" } }, }, + colors = { + error = { "DiagnosticError", "ErrorMsg", "#DC2626" }, + warning = { "DiagnosticWarn", "WarningMsg", "#FBBF24" }, + todo = { "DiagnosticTodo", "#80e64d" }, + hint = { "DiagnosticHint", "#10B981" }, + hack = { "DiagnosticHack", "#FF33FF" }, + security = { "DiagnosticSecurity", "#FF6600" }, + default = { "Identifier", "#7C3AED" }, + test = { "DiagnosticTest", "#E6E600" }, + perf = { "DiagnosticPerf", "#9999ff" }, + }, }, }, { @@ -314,6 +353,9 @@ local plugins = { "rcarriga/nvim-notify", }, config = function() + require("notify").setup { + top_down = false, + } require("noice").setup { lsp = { override = { @@ -325,14 +367,37 @@ local plugins = { -- produce a conflict signature = { enabled = false }, hover = { enabled = false }, + progress = { + enabled = true, + -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin + -- See the section on formatting for more details on how to customize. + --- @type NoiceFormat|string + format = "lsp_progress", + --- @type NoiceFormat|string + format_done = "lsp_progress_done", + throttle = 1000 / 30, -- frequency to update lsp progress message + view = "mini", -- default: mini + }, }, -- you can enable a preset for easier configuration presets = { bottom_search = true, -- use a classic bottom cmdline for search command_palette = true, -- position the cmdline and popupmenu together long_message_to_split = true, -- long messages will be sent to a split - inc_rename = false, -- enables an input dialog for inc-rename.nvim - lsp_doc_border = false, -- add a border to hover docs and signature help + inc_rename = true, -- enables an input dialog for inc-rename.nvim + lsp_doc_border = true, -- add a border to hover docs and signature help + }, + messages = { + enabled = true, + -- NOTE: we keep it with notify, + -- change this to something else if you want + view_error = "notify", + }, + popupmenu = { + enabled = true, + }, + notify = { + enabled = true, }, } end, @@ -451,7 +516,8 @@ local plugins = { }, { "glacambre/firenvim", - lazy = not vim.g.started_by_firenvim, + enabled = vim.g.started_by_firenvim, + lazy = false, build = function() vim.fn["firenvim#install"](0) end, @@ -461,7 +527,7 @@ local plugins = { [".*"] = { filename = "/tmp/{hostname}_{pathname%10}.{extension%5}", cmdline = "firenvim", - takeover = "never", -- activate manually () + takeover = "never", -- can't open it with never at all? }, }, } @@ -489,11 +555,11 @@ local plugins = { { "kevinhwang91/nvim-ufo", event = { "BufReadPost", "BufNewFile" }, - -- stylua: ignore - keys = { - { 'zR', function() require('ufo').openAllFolds() end }, - { 'zM', function() require('ufo').closeAllFolds() end }, - }, + -- stylua: ignore + keys = { + { 'zR', function() require('ufo').openAllFolds() end }, + { 'zM', function() require('ufo').closeAllFolds() end }, + }, dependencies = { "kevinhwang91/promise-async", "nvim-treesitter/nvim-treesitter", @@ -546,7 +612,6 @@ local plugins = { -- :Chmod -- and also some more, but those are easy done with shell "tpope/vim-eunuch", - enabled = false, lazy = false, }, { @@ -557,23 +622,18 @@ local plugins = { local nls = require "null-ls" local builtins = nls.builtins local sources = { - builtins.formatting.black, - builtins.formatting.fixjson, - builtins.formatting.golines, - builtins.formatting.markdownlint, - builtins.formatting.shellharden, - builtins.formatting.sql_formatter, - builtins.diagnostics.markdownlint, - builtins.diagnostics.mypy, - builtins.diagnostics.vint, - builtins.diagnostics.yamllint, - builtins.code_actions.shellcheck, - builtins.formatting.shfmt, - builtins.diagnostics.write_good.with { - diagnostics_postprocess = function(diagnostic) - diagnostic.severity = vim.diagnostic.severity.HINT - end, + builtins.formatting.djlint.with { + filetypes = { "django", "jinja.html", "htmldjango", "tera", "html" }, }, + builtins.diagnostics.djlint.with { + filetypes = { "django", "jinja.html", "htmldjango", "tera", "html" }, + }, + builtins.formatting.shfmt, + -- builtins.diagnostics.write_good.with { + -- diagnostics_postprocess = function(diagnostic) + -- diagnostic.severity = vim.diagnostic.severity.HINT + -- end, + -- }, } for _, source in ipairs(sources) do table.insert(opts.sources, source) @@ -608,17 +668,19 @@ local plugins = { end, }) -- change how the highlighting looks - vim.cmd "hi LspInlayHint guibg=bg guifg=#804d66" + vim.cmd "hi LspInlayHint guibg=(bg*0.8) guifg=#6699b3" end, }, { "kosayoda/nvim-lightbulb", event = { "BufReadPre", "BufNewFile" } }, { "Wansmer/treesj", - lazy = false, - cmd = { "TSJJoin", "TSJSplit" }, + cmd = { "TSJJoin", "TSJSplit", "TSJSplit" }, keys = { - { "k", "TSJJoin" }, - { "S", "TSJSplit" }, + { "", "TSJJoin" }, + { "", "TSJSplit" }, + }, + opts = { + use_default_keymaps = false, }, }, { @@ -643,13 +705,13 @@ local plugins = { local function get_git_diff(props) local icons = { removed = "", changed = "", added = "" } local labels = {} - local signs = vim.api.nvim_buf_get_var(props.buf, "gitsigns_status_dict") + -- local signs = vim.api.nvim_buf_get_var(props.buf, "gitsigns_status_dict") -- local signs = vim.b.gitsigns_status_dict - for name, icon in pairs(icons) do - if tonumber(signs[name]) and signs[name] > 0 then - table.insert(labels, { icon .. " " .. signs[name] .. " ", group = "Diff" .. name }) - end - end + -- for name, icon in pairs(icons) do + -- if tonumber(signs[name]) and signs[name] > 0 then + -- table.insert(labels, { icon .. " " .. signs[name] .. " ", group = "Diff" .. name }) + -- end + -- end if #labels > 0 then table.insert(labels, { "| " }) end @@ -674,6 +736,238 @@ local plugins = { } end, }, + { + "mikesmithgh/kitty-scrollback.nvim", + enabled = true, + lazy = true, + cmd = { "KittyScrollbackGenerateKittens", "KittyScrollbackCheckHealth" }, + event = { "User KittyScrollbackLaunch" }, + -- version = '*', -- latest stable version, may have breaking changes if major version changed + -- version = '^3.0.0', -- pin major version, include fixes and features that do not have breaking changes + config = function() + require("kitty-scrollback").setup { + myconfig = function() + return { keymaps_enabled = false } + end, + } + end, + }, + { + "hrsh7th/nvim-cmp", + enabled = not vim.g.started_by_firenvim, + }, + { + "ziontee113/icon-picker.nvim", + keys = { + { "", "IconPickerNormal", desc = "pick icon" }, + { "y", "IconPickerYank", desc = "yank icon" }, + }, + cmd = { "IconPickerInsert", "IconPickerYank", "IconPickerNormal" }, + config = function() + require("icon-picker").setup { disable_legacy_commands = true } + end, + }, + { + "mfussenegger/nvim-dap", + lazy = false, + init = function() + require("core.utils").load_mappings "debug" + end, + config = function() + local dap = require "dap" + local mason_registry = require "mason-registry" + local codelldb_root = mason_registry.get_package("codelldb"):get_install_path() .. "/extension/" + local codelldb_path = codelldb_root .. "adapter/codelldb" + local liblldb_path = codelldb_root .. "lldb/lib/liblldb.so" + dap.defaults.fallback.external_terminal = { + command = "/home/plex/.local/bin/kitty", + args = {}, + } + dap.adapters.gdb = { + type = "executable", + command = "gdb", + args = { "-i", "dap" }, + } + dap.adapters.codelldb = { + type = "server", + port = "30333", + executable = { + command = codelldb_path, + args = { "--port", "30333" }, + detached = false, + }, + } + dap.configurations.cpp = { + { + name = "Launch file", + type = "codelldb", + request = "launch", + program = function() + return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file") + end, + args = function() + return require("custom.utils").tokenize_args(vim.fn.input "args: ") + end, + cwd = "${workspaceFolder}", + -- FIXME: perhaps we can put the stdio somewhere more practical + stopOnEntry = false, + }, + } + dap.configurations.c = dap.configurations.cpp + dap.configurations.rust = dap.configurations.cpp + end, + }, + { + "rcarriga/nvim-dap-ui", + init = function() + require("core.utils").load_mappings "debug" + end, + dependencies = { + "mfussenegger/nvim-dap", + }, + config = function(_, opts) + local dap = require "dap" + local dapui = require "dapui" + dapui.setup(opts) + dap.listeners.after.event_initialized["dapui_config"] = function() + dapui.open {} + end + dap.listeners.before.event_terminated["dapui_config"] = function() + -- dapui.close {} + end + dap.listeners.before.event_exited["dapui_config"] = function() + -- dapui.close {} + end + end, + }, + { "folke/neodev.nvim", opts = {} }, + { + "mrcjkb/rustaceanvim", + enabled = false, + version = "^4", -- Recommended + ft = { "rust" }, + config = function() + local dap = require "dap" + vim.g.rustaceanvim = { + enable_clippy = true, + -- Plugin configuration + tools = { + enable_clippy = true, + }, + -- LSP configuration + server = { + on_attach = function(client, bufnr) + -- you can also put keymaps in here + end, + settings = { + -- rust-analyzer language server configuration + ["rust-analyzer"] = { + cargo = { + features = "all", + }, + }, + }, + }, + -- DAP configuration + dap = { + -- FIXME: the rustaceanvim debug config does not map the stdout/stderr to the + -- opened terminal, effectively rendering debugging with it useless. Luckily, + -- we can use the regular nvim-dap and nvim-dap-ui. + adapter = dap.adapters.codelldb, + }, + } + end, + }, + { + "theHamsta/nvim-dap-virtual-text", + lazy = false, -- PERF: this can be done more elegant + config = function() + require("nvim-dap-virtual-text").setup() + end, + }, + { + "jvgrootveld/telescope-zoxide", + dependencies = "nvim-telescope/telescope.nvim", + config = function() + -- Useful for easily creating commands + local z_utils = require "telescope._extensions.zoxide.utils" + + require("telescope").setup { + -- (other Telescope configuration...) + extensions = { + zoxide = { + prompt_title = "[ Walking on the shoulders of TJ ]", + mappings = { + default = { + after_action = function(selection) + print("Update to (" .. selection.z_score .. ") " .. selection.path) + end, + }, + [""] = { + before_action = function(selection) + print "before C-s" + end, + action = function(selection) + vim.cmd.edit(selection.path) + end, + }, + -- Opens the selected entry in a new split + [""] = { action = z_utils.create_basic_command "split" }, + }, + }, + }, + } + require("telescope").load_extension "zoxide" + end, + }, + { "nanotee/zoxide.vim", lazy = false, enabled = false }, + { + "iamcco/markdown-preview.nvim", + cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" }, + ft = { "markdown" }, + build = function() + vim.fn["mkdp#util#install"]() + end, + config = function() + -- Ugly fix for wsl not finding my browser + -- I HATE windows + vim.g.mkdp_echo_preview_url = 1 + end, + }, + { + "rhysd/vim-grammarous", + enabled = false, + -- TODO: figure out how i can login to languagetool.org + lazy = false, + config = function() + vim.g["grammarous#jar_url"] = "https://www.languagetool.org/download/LanguageTool-5.9.zip" + vim.g["grammarous#use_vim_spelllang"] = 1 + vim.cmd [[ + let g:grammarous#default_comments_only_filetypes = { + \ '*' : 1, 'help' : 0, 'markdown' : 0, + \ } + ]] + end, + }, + { + "NvChad/ui", + enabled = true, + branch = "v2.0", + lazy = false, + }, + { + "nvim-lualine/lualine.nvim", + lazy = false, + dependencies = { + "nvim-tree/nvim-web-devicons", + "NvChad/ui", -- load after nvchad ui + }, + config = function() + -- TODO: add lsp module for lualine + -- Maybe we can steal modules from the nvchad ui + require("lualine").setup() + end, + }, } return plugins diff --git a/lua/custom/utils.lua b/lua/custom/utils.lua new file mode 100644 index 0000000..cef1dc2 --- /dev/null +++ b/lua/custom/utils.lua @@ -0,0 +1,83 @@ +local M = {} +--- this function will split a string into a table of tokens, like it would +--- be passed into the `argv` of a program that was executed from the commandline +--- +--- @param raw string string of cli args that should be split +--- @return table tokens args as a table +M.tokenize_args = function(raw) + -- NOTE: string.gmatch is does not use regex, but a smaller pattern matcher! + -- A complete regex parser would be larger than lua itself. See + -- [Programming in Lua 20.2](https://www.lua.org/pil/20.2.html). + -- + -- Notable differences: + -- '-' is ungreedy wildcard + -- '*?' does not work + -- '|' is not or + -- + -- This means we're better of implementing the lexer with an algorithm. + local t = {} + local current = "" + local in_str = false + local str_seek + for c in string.gmatch(raw, ".") do -- iterate through all chars + if c == " " and not in_str then + if string.len(current) > 0 then + table.insert(t, current) + current = "" + end + elseif c == '"' and not in_str then + in_str = true + str_seek = '"' + elseif c == "'" and not in_str then + in_str = true + str_seek = "'" + elseif c == str_seek and in_str then + in_str = false + table.insert(t, current) + current = "" + else + current = current .. c + end + end + if string.len(current) > 0 then + table.insert(t, current) + end + return t +end + +--- dumps a variable into a string, so it can be printed. This is meant for +--- debug prints +--- @param t any variable +--- @return string t_dumped t dumped to string +M.dump = function(t) + if type(t) == "table" then + local s = "{ " + for k, v in pairs(t) do + if type(k) ~= "number" then + k = '"' .. k .. '"' + end + if k ~= 1 then + s = s .. ", " + end + s = s .. "[" .. k .. "] = '" .. M.dump(v) .. "'" + end + return s .. " }" + else + return tostring(t) + end +end + +--- Try to require a module +--- @param module string module name +--- @return boolean available is the module available? +--- @return any loaded_module the loaded module if it is available +M.try_require = function(module) + local available, loaded_module = pcall(require, module) + if not available then + return available, nil + else + return available, loaded_module + end +end + +return M diff --git a/lua/plugins/configs/lazy_nvim.lua b/lua/plugins/configs/lazy_nvim.lua index cd170bd..03cdf47 100644 --- a/lua/plugins/configs/lazy_nvim.lua +++ b/lua/plugins/configs/lazy_nvim.lua @@ -33,7 +33,6 @@ return { "vimballPlugin", "zip", "zipPlugin", - "tutor", "rplugin", "syntax", "synmenu", diff --git a/lua/plugins/init.lua b/lua/plugins/init.lua index 27d9e7f..8f458ec 100644 --- a/lua/plugins/init.lua +++ b/lua/plugins/init.lua @@ -1,34 +1,8 @@ -- All plugins have lazy=true by default,to load a plugin on startup just lazy=false -- List of all default plugins & their definitions local default_plugins = { - "nvim-lua/plenary.nvim", - { - "NvChad/base46", - branch = "v2.0", - build = function() - require("base46").load_all_highlights() - end, - }, - - { - "NvChad/ui", - branch = "v2.0", - lazy = false, - }, - - { - "NvChad/nvterm", - init = function() - require("core.utils").load_mappings "nvterm" - end, - config = function(_, opts) - require "base46.term" - require("nvterm").setup(opts) - end, - }, - { "NvChad/nvim-colorizer.lua", init = function() @@ -73,7 +47,6 @@ local default_plugins = { { "nvim-treesitter/nvim-treesitter", - tag = "v0.9.2", init = function() require("core.utils").lazy_load "nvim-treesitter" end, diff --git a/mini.lua b/mini.lua new file mode 100644 index 0000000..6b85f01 --- /dev/null +++ b/mini.lua @@ -0,0 +1,138 @@ +local opt = vim.opt +local g = vim.g +g.maplocalleader = ";" +g.python3_host_prog = '/usr/bin/python3' + +opt.mouse = "a" -- mouse does annoying things for me if it's not 'a' +opt.signcolumn = "yes" +opt.clipboard = "" -- don't just use the system clipboard +opt.wrap = false +opt.breakindent = false +opt.spell = false +opt.list = true +opt.conceallevel = 2 +opt.undofile = true +opt.undolevels = 10000 +opt.writebackup = false +opt.history = 5000 +opt.shada = { "'1000", "<50", "s10", "h" } + +-- Tabs and Indents +-- === + +opt.textwidth = 80 -- Text width maximum chars before wrapping +opt.tabstop = 4 -- The number of spaces a tab is +opt.shiftwidth = 4 -- Number of spaces to use in auto(indent) +opt.smarttab = true -- Tab insert blanks according to 'shiftwidth' +opt.autoindent = true -- Use same indenting on new lines +opt.smartindent = true -- Smart autoindenting on new lines +opt.shiftround = true -- Round indent to multiple of 'shiftwidth' + +-- Timing +-- === +opt.ttimeout = true +opt.timeoutlen = 500 -- Time out on mappings +opt.ttimeoutlen = 10 -- Time out on key codes +opt.updatetime = 500 -- Idle time to write swap and trigger CursorHold + +-- Searching +-- === +opt.ignorecase = true -- Search ignoring case +opt.smartcase = true -- Keep case when searching with * +opt.infercase = true -- Adjust case in insert completion mode +opt.incsearch = true -- Incremental search + +-- Formatting +-- === + +opt.wrap = false -- No wrap by default +opt.linebreak = true -- Break long lines at 'breakat' +opt.breakat = "\\ \\ ;:,!?" -- Long lines break chars +opt.startofline = false -- Cursor in same column for few commands +opt.splitbelow = true -- Splits open bottom right +opt.splitright = true +opt.breakindentopt = { shift = 2, min = 20 } +opt.formatoptions = "" -- see :h fo-table & :h formatoptions + +-- Diff +-- === + +opt.diffopt:append { "iwhite", "indent-heuristic", "algorithm:patience" } +opt.wildmode = "longest:full,full" -- Command-line completion mode + +-- Folds +-- === + +opt.foldlevel = 10 -- start with all folds open + +-- Editor UI +-- === + +vim.o.guifont = "FiraCode Nerd Font:h15" +opt.termguicolors = true +opt.shortmess = "xsTOInfFitloCaAs" +opt.showmode = true -- Show mode in cmd window +opt.scrolloff = 2 -- Keep at least n lines above/below +opt.sidescrolloff = 0 -- Keep at least n lines left/right +opt.numberwidth = 2 -- Minimum number of columns to use for the line number +opt.number = true -- Show line numbers +opt.relativenumber = true -- Show relative line numbers +opt.ruler = true -- Default status ruler +opt.list = true -- Show hidden characters +opt.showtabline = 1 -- Don't change this, goes back to a vanilla vim default +opt.laststatus = 3 -- Always show laststatus + +if vim.g.started_by_firenvim == true then + opt.showtabline = 1 -- Don't show tabline in firenvim, unless multitab + opt.laststatus = 1 -- Don't show laststatus in firenvim + opt.wrap = true +end + +if vim.g.neovide == true then + -- fulscreen with F11 + vim.api.nvim_set_keymap("n", "", ":let g:neovide_fullscreen = !g:neovide_fullscreen", {}) + + vim.g.neovide_underline_automatic_scaling = true + + -- vim.g.neovide_floating_blur_amount_x = 2.0 + -- vim.g.neovide_floating_blur_amount_y = 2.0 + + vim.g.neovide_scroll_animation_length = 0.1 + -- vim.g.neovide_cursor_animation_length = 0 + -- vim.g.neovide_cursor_trail_size = 0 + vim.g.neovide_hide_mouse_when_typing = true + + vim.g.neovide_fullscreen = true +end + +opt.helpheight = 0 -- Disable help window resizing +opt.winwidth = 30 -- Minimum width for active window +opt.winminwidth = 1 -- Minimum width for inactive windows +opt.winheight = 1 -- Minimum height for active window +opt.winminheight = 1 -- Minimum height for inactive window + +opt.showcmd = false -- show command in status line +opt.cmdheight = 0 +opt.cmdwinheight = 5 -- Command-line lines +opt.equalalways = true -- Resize windows on split or close +opt.colorcolumn = "+0" -- Column highlight at textwidth's max character-limit + +opt.cursorline = true +opt.cursorlineopt = { "number", "screenline" } + +opt.pumheight = 10 -- Maximum number of items to show in the popup menu +opt.pumwidth = 10 -- Minimum width for the popup menu +opt.pumblend = 10 -- Popup blend + +-- Spelling correction +-- === + +opt.spell = false -- manually enable spell with `set spell` or `ts` +opt.spelllang = "en,de_de," +opt.spellsuggest = "double,50,timeout:5000" + +-- autocommands +-- === +local function augroup(name) + return vim.api.nvim_create_augroup("plex_" .. name, {}) +end diff --git a/spell/en.utf-8.add b/spell/en.utf-8.add index 38ee409..f165737 100644 --- a/spell/en.utf-8.add +++ b/spell/en.utf-8.add @@ -260,3 +260,96 @@ popupmenu #m ufo treesitter +GitLab +Gitea +Autocrate +YAML +TOML +autocrate +TBD +PRs +yaml +netpong +gehostet +IoT +einen +NTSecureGateway +SoC +Lockscreen +licht/! +Licht +ESRDD +erstmal +warmweißer +WG +SilverBullet +Forgejo +additional +scriptable +Autcrate +rustaceans +serv0 +serv1 +serv2 +sequenceDiagram +style +BT +style +logdir +traceback +timestamp +LoggerBuilder +libpt +T2000 +TINF22CS +Fliegendes/! +Gewöhnungsphase +Notfallmaßnahmen +übergriffig +Eligswalde +Usecases +OpenAPI +homeserver +theseus +Kernelmodus +entziehbares +vorkompiliert +vorkompilierte +Wordle +Quotientenkriterium +neovim +authentik +auth +Mesum +Raza +letsencrypt +MTA +STS +BIMI +Minecraft +exfiltrate +VPS +JVM +Dammit/! +Maxdorf +Leininger +Dockerfile +yml +CMD +UDPP +Unknowability +unknowability +talmann +Goldberger +ofc +shockwaves +deerhash +argon2 +SCSS +Eligswalde's +Achmarel +aswell +AGI +FTL +Houten +Gabriella diff --git a/spell/en.utf-8.add.spl b/spell/en.utf-8.add.spl index 36d14d9..5a11cdf 100644 Binary files a/spell/en.utf-8.add.spl and b/spell/en.utf-8.add.spl differ