Refactor back to a more modular configuration

This commit is contained in:
Oliver Davies 2025-04-22 17:42:24 +01:00
parent f85d4968ed
commit f7ba471218
178 changed files with 2245 additions and 1847 deletions

View file

@ -0,0 +1,13 @@
P = function(v)
print(vim.inspect(v))
return v
end
RELOAD = function(...)
return require("plenary.reload").reload_module(...)
end
R = function(name)
RELOAD(name)
return require(name)
end

View file

@ -0,0 +1,4 @@
require "opdavies.globals"
require "opdavies.options"
require "opdavies.keymaps"
require "opdavies.lsp"

View file

@ -0,0 +1,86 @@
local set = vim.keymap.set
set("n", "<C-f>", "<cmd>silent !tmux new-window tmux-sessionizer<CR>")
-- Execute Lua in the current file, line or range.
set("n", "<leader><leader>x", "<cmd>source %<CR>")
set("n", "<leader>x", ":.lua<CR>")
set("v", "<leader>x", ":lua<CR>")
-- Yank from the current column to the end of the line
set("n", "Y", "yg$")
-- Keep things centred
set("n", "n", "nzzzv")
set("n", "N", "Nzzzv")
-- Disable up and down arrow keys.
set("v", "<down>", "<nop>")
set("v", "<up>", "<nop>")
-- Easily switch back to visual mode.
set("i", "jj", "<Esc>")
set("i", "jk", "<Esc>")
-- Easy insertion of a trailing ; or , from insert mode
set("i", ",,", "<Esc>A,<Esc>")
set("i", ";;", "<Esc>A;<Esc>")
-- Automatically resize buffers.
set("n", "<leader>=", ":wincmd =<cr>", { noremap = true, silent = true })
-- Move line(s) up and down.
local opts = { noremap = true, silent = true }
set("i", "<M-j>", "<Esc>:m .+1<CR>==gi", opts)
set("i", "<M-k>", "<Esc>:m .-2<CR>==gi", opts)
set("n", "<M-j>", ":m .+1<CR>==", opts)
set("n", "<M-k>", ":m .-2<CR>==", opts)
set("v", "<M-j>", ":m '>+1<CR>gv=gv", opts)
set("v", "<M-k>", ":m '<-2<CR>gv=gv", opts)
-- Re-centre when navigating.
set("n", "#", "#zz", opts)
set("n", "%", "%zz", opts)
set("n", "*", "*zz", opts)
set("n", "<C-d>", "<C-d>zz", opts)
set("n", "<C-i>", "<C-i>zz", opts)
set("n", "<C-o>", "<C-o>zz", opts)
set("n", "<C-u>", "<C-u>zz", opts)
set("n", "G", "Gzz", opts)
set("n", "N", "Nzz", opts)
set("n", "gg", "ggzz", opts)
set("n", "n", "Nzz", opts)
set("n", "{", "{zz", opts)
set("n", "}", "}zz", opts)
-- Clears hlsearch after doing a search, otherwise just does normal <CR> stuff
vim.cmd [[ nnoremap <expr> <CR> {-> v:hlsearch ? ":nohl\<CR>" : "\<CR>"}() ]]
-- Quicker macro playback.
set("n", "Q", "@qj")
set("x", "Q", ":norm @q<CR>")
set("v", "Q", "<nop>")
set("v", "J", ":m '>+1<CR>gvrgv")
set("v", "K", ":m '<-2<CR>gv=gv")
set("n", "J", "mzJ`z")
set("n", "<C-d>", "<C-d>zz")
set("n", "<C-u>", "<C-u>zz")
set("n", "n", "nzzzv")
set("n", "N", "Nzzzv")
set("n", "<leader>ec", ":edit composer.json<CR>")
set("n", "<leader>ef", ":edit flake.nix<CR>")
set("n", "<leader>er", ":edit run<CR>")
set({ "n", "v" }, "<leader>y", [["+y]])
set("n", "<leader>Y", [["+Y]])
-- Re-add functionality to open the URL under the cursor.
-- This is overridden by mini.operators to exchange text regions.
vim.keymap.set("n", "<leader>gx", function()
local url = vim.fn.expand "<cfile>"
vim.fn["netrw#BrowseX"](url, 0)
end, { desc = "Open URL under cursor" })

View file

@ -0,0 +1,73 @@
local M = {}
local function should_remove_diagnostic(messages_to_filter, message)
for _, filter_message in ipairs(messages_to_filter) do
if message:match(filter_message) then
return true
end
end
return false
end
M.definition = function()
local params = vim.lsp.util.make_position_params()
vim.lsp.buf_request(0, "textDocument/definition", params, function(err, result, ctx, config)
local bufnr = ctx.bufnr
local ft = vim.api.nvim_buf_get_option(bufnr, "filetype")
local new_result = vim.tbl_filter(function(v)
-- Remove any definitions within the nix store via the .direnv directory.
if string.find(v.targetUri, ".direnv") then
return false
end
-- Remove definitions within vendor-bin directory for PHP files.
if ft == "php" then
if string.find(v.targetUri, "vendor%-bin") then
return false
end
end
return true
end, result)
if #new_result > 0 then
result = new_result
end
vim.lsp.handlers["textDocument/definition"](err, result, ctx, config)
vim.cmd [[normal! zz]]
end)
end
M.on_publish_diagnostics = function(_, result, ctx, config)
local client = vim.lsp.get_client_by_id(ctx.client_id)
if client.name == "cssls" then
local filtered_diagnostics = {}
local messages_to_filter = {
"Unknown at rule @apply",
"Unknown at rule @plugin",
"Unknown at rule @tailwind",
"Unknown at rule @theme",
}
-- For each diagnostic, ensure its mesages doesn't match one I want to
-- ignore before adding it to the result. If it matches, don't add it to the
-- result and it won't be shown.
for _, diagnostic in ipairs(result.diagnostics) do
if not should_remove_diagnostic(messages_to_filter, diagnostic.message) then
table.insert(filtered_diagnostics, diagnostic)
end
end
result.diagnostics = filtered_diagnostics
end
vim.lsp.diagnostic.on_publish_diagnostics(_, result, ctx, config)
end
return M

View file

@ -0,0 +1,142 @@
local cmp_nvim_lsp = require "cmp_nvim_lsp"
local handlers = require "opdavies.lsp.handlers"
local lspconfig = require "lspconfig"
local capabilities = cmp_nvim_lsp.default_capabilities(vim.lsp.protocol.make_client_capabilities())
lspconfig.bashls.setup {
capabilities = capabilities,
}
lspconfig.cssls.setup {
capabilities = capabilities,
on_attach = function(_, _)
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(handlers.on_publish_diagnostics, {})
end,
}
lspconfig.emmet_language_server.setup {
capabilities = capabilities,
filetypes = { "css", "html", "sass", "scss", "twig" },
}
lspconfig.gopls.setup {
capabilities = capabilities,
}
lspconfig.html.setup {
capabilities = capabilities,
}
lspconfig.phpactor.setup {
capabilities = capabilities,
}
lspconfig.lua_ls.setup {
capabilities = capabilities,
settings = {
Lua = {
completion = {
callSnippet = "Replace",
},
diagnostics = {
globals = { "vim" },
},
runtime = {
version = "LuaJIT",
},
telemetry = {
enabled = false,
},
workspace = {
library = vim.api.nvim_get_runtime_file("", true),
},
},
},
}
lspconfig.marksman.setup {
capabilities = capabilities,
}
lspconfig.nixd.setup {
capabilities = capabilities,
cmd = { "nixd" },
settings = {
nixd = {
nixpkgs = {
expr = "import <nixpkgs> { }",
},
formatting = {
command = "nix fmt",
},
},
},
}
lspconfig.tailwindcss.setup {
capabilities = capabilities,
filetypes = { "html", "javascript", "twig", "typescript", "vue" },
settings = {
init_options = {
userLanguages = {
["html.twig"] = "html",
},
},
},
}
lspconfig.terraformls.setup {
capabilities = capabilities,
}
lspconfig.ts_ls.setup {
capabilities = capabilities,
}
lspconfig.vuels.setup {
capabilities = capabilities,
}
lspconfig.yamlls.setup {
capabilities = capabilities,
settings = {
yaml = {
keyOrdering = false,
},
},
}
vim.diagnostic.config {
float = { source = true },
signs = true,
underline = false,
update_in_insert = false,
virtual_text = { spacing = 2 },
}
vim.api.nvim_create_autocmd("LspAttach", {
callback = function()
local builtin = require "telescope.builtin"
vim.keymap.set("n", "gd", builtin.lsp_definitions, { buffer = 0 })
vim.keymap.set("n", "gr", builtin.lsp_references, { buffer = 0 })
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { buffer = 0 })
vim.keymap.set("n", "gT", vim.lsp.buf.type_definition, { buffer = 0 })
vim.keymap.set("n", "K", vim.lsp.buf.hover, { buffer = 0 })
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, { buffer = 0 })
vim.keymap.set("n", "<leader>cr", vim.lsp.buf.rename, { buffer = 0 })
vim.keymap.set("n", "<leader>dl", vim.diagnostic.setqflist, { buffer = 0 })
end,
})
vim.keymap.set("n", "<leader>dd", function()
vim.diagnostic.enable(false)
vim.diagnostic.reset()
end)
vim.keymap.set("n", "<leader>de", function()
vim.diagnostic.enable(true)
end)

View file

@ -0,0 +1,53 @@
vim.g.mapleader = " "
vim.g.snippets = "luasnip"
local settings = {
autoindent = true,
backup = false,
breakindent = true,
expandtab = true,
exrc = true,
foldlevel = 1,
foldlevelstart = 99,
foldmethod = "indent",
formatoptions = "clqjp",
hidden = false,
hlsearch = false,
inccommand = "split",
laststatus = 3,
linebreak = true,
list = true,
mouse = "a",
number = true,
pumblend = 10,
pumheight = 10,
relativenumber = true,
scrolloff = 5,
shiftwidth = 2,
showmode = false,
signcolumn = "yes:1",
smartindent = true,
softtabstop = 2,
spellfile = "/home/opdavies/Code/personal/nixos-config/modules/home-manager/cli/neovim/config/spell/en.utf-8.add",
splitbelow = true,
splitright = true,
swapfile = false,
syntax = "on",
tabstop = 2,
termguicolors = true,
textwidth = 0,
undodir = os.getenv "XDG_STATE_HOME" .. "/nvim/undodir",
undofile = true,
updatetime = 1000,
wrap = false,
}
for key, value in pairs(settings) do
vim.o[key] = value
end
vim.opt.backupdir:remove "." -- keep backups out of the current directory
vim.opt.completeopt = { "menu", "menuone", "noinsert", "noselect" }
vim.opt.listchars:append {
trail = "·",
}

View file

@ -0,0 +1,12 @@
require("luasnip.session.snippet_collection").clear_snippets "javascript"
local ls = require "luasnip"
local i = ls.insert_node
local s = ls.snippet
local fmta = require("luasnip.extras.fmt").fmta
ls.add_snippets("javascript", {
s("log", fmta("console.log(<>);", { i(1, "value") })),
})

View file

@ -0,0 +1,23 @@
require("luasnip.session.snippet_collection").clear_snippets "lua"
local ls = require "luasnip"
local f = ls.function_node
local i = ls.insert_node
local s = ls.snippet
local fmt = require("luasnip.extras.fmt").fmt
ls.add_snippets("lua", {
s(
"req",
fmt([[local {} = require "{}"]], {
f(function(import_name)
local parts = vim.split(import_name[1][1], ".", true)
return parts[#parts] or ""
end, { 1 }),
i(1),
})
),
})

View file

@ -0,0 +1,66 @@
require("luasnip.session.snippet_collection").clear_snippets "php"
local ls = require "luasnip"
local c = ls.choice_node
local i = ls.insert_node
local s = ls.snippet
local t = ls.text_node
local fmta = require("luasnip.extras.fmt").fmta
ls.add_snippets("php", {
s("func", fmta("function <>(<>)<> {\n <>\n}<>", { i(1), i(2), i(3), i(4), i(0) })),
s(
"met",
fmta(
[[
<> function <>(<>)<> {
<>
}<>
]],
{ c(1, { t "public", t "protected", t "private" }), i(2), i(3), i(4), i(5), i(0) }
)
),
s("pest", fmta("<>('<>', function() {\n <>\n});", { c(1, { t "it", t "test" }), i(2), i(0) })),
s(
"test",
fmta(
[[
public function test<>(): void {
<>
}<>
]],
{ i(1), i(2), i(0) }
)
),
s(
"testan",
fmta(
[[
/** @test */
public function <>(): void {
<>
}<>
]],
{ i(1), i(2), i(0) }
)
),
s(
"testat",
fmta(
[[
[#Test]
public function <>(): void {
<>
}<>
]],
{ i(1), i(2), i(0) }
)
),
})

View file

@ -0,0 +1,63 @@
require("luasnip.session.snippet_collection").clear_snippets "rst"
local ls = require "luasnip"
local i = ls.insert_node
local f = ls.function_node
local s = ls.snippet
local t = ls.text_node
local fmta = require("luasnip.extras.fmt").fmta
local fill_line = function(char)
return function()
local row = vim.api.nvim_win_get_cursor(0)[1]
local lines = vim.api.nvim_buf_get_lines(0, row - 2, row, false)
return string.rep(char, #lines[1])
end
end
ls.add_snippets("rst", {
s("class", t(".. class:: ", i(1))),
s("footer", t(".. footer:: ", i(1))),
s("link", t(".. _", i(1), ":")),
s("raw", t(".. raw:: ", i(1))),
-- TODO: add an optional new line and ":width" property.
s("image", t(".. image:: ", i(1))),
s("head", f(fill_line "=", {})),
s("sub", f(fill_line "-", {})),
s("subsub", f(fill_line "^", {})),
-- Add a page break with an optional page template.
s(
"pb",
fmta(
[[
.. raw:: pdf
PageBreak<>
]],
{ i(0) }
)
),
-- Add a new speaker note.
s(
"ta",
fmta(
[[
.. raw:: pdf
TextAnnotation "<>"
]],
{ i(0) }
)
),
})

View file

@ -0,0 +1,12 @@
require("luasnip.session.snippet_collection").clear_snippets "scss"
local ls = require "luasnip"
local i = ls.insert_node
local s = ls.snippet
local fmta = require("luasnip.extras.fmt").fmta
ls.add_snippets("scss", {
s("bp", fmta("@include breakpoint(<>) {\n <>\n}", { i(1), i(0) })),
})

View file

@ -0,0 +1,28 @@
require("luasnip.session.snippet_collection").clear_snippets "twig"
local ls = require "luasnip"
local s = ls.snippet
local i = ls.insert_node
local fmta = require("luasnip.extras.fmt").fmta
ls.add_snippets("twig", {
s("do", fmta("{% <> %}<>", { i(1), i(0) })),
s("dump", fmta("{{ dump(<>) }}<>", { i(1), i(0) })),
s("echo", fmta("{{ <> }}<>", { i(1), i(0) })),
s(
"for",
fmta(
[[
{% for <> in <> %}
<>
{% endfor %}<>
]],
{ i(1), i(2), i(3), i(0) }
)
),
s("if", fmta("{% if <> %}<>{% endif %}<>", { i(1), i(2), i(0) })),
})

View file

@ -0,0 +1,47 @@
require("luasnip.session.snippet_collection").clear_snippets "yaml"
local ls = require "luasnip"
local c = ls.choice_node
local i = ls.insert_node
local s = ls.snippet
local t = ls.text_node
local fmta = require("luasnip.extras.fmt").fmta
local rep = require("luasnip.extras").rep
ls.add_snippets("yaml", {
s(
"drupal_info",
fmta(
[[
name: <module_name>
description: <description>
core_version_requirement: ^10 || ^11
type: <type>
package: <package>
]],
{ module_name = i(1), description = i(2), type = c(3, { t "module", t "theme" }), package = i(0) }
)
),
s(
"drupal_route",
fmta(
[[
<module>.<route>:
path: /<path>
defaults:
_controller: Drupal\<module_same>\Controller\<class>
# _form:
# _title:
# _title_callback:
methods: [GET]
requirements:
_permission: access content
# _access: TRUE<finish>
]],
{ module = i(1), route = i(2), path = i(3), module_same = rep(1), class = i(4), finish = i(0) }
)
),
})

View file

@ -0,0 +1,57 @@
local conf = require("telescope.config").values
local finders = require "telescope.finders"
local make_entry = require "telescope.make_entry"
local pickers = require "telescope.pickers"
local M = {}
local live_multigrep = function(opts)
opts = opts or {}
opts.cwd = opts.cwd or vim.uv.cwd()
local finder = finders.new_async_job {
command_generator = function(prompt)
if not prompt or prompt == "" then
return nil
end
local pieces = vim.split(prompt, " ")
local args = { "rg" }
if pieces[1] then
table.insert(args, "-e")
table.insert(args, pieces[1])
end
if pieces[2] then
table.insert(args, "-g")
table.insert(args, pieces[2])
end
---@diagnostic disable-next-line: deprecated
return vim.tbl_flatten {
args,
{ "--color=never", "--no-heading", "--with-filename", "--line-number", "--column", "--smart-case" },
}
end,
cwd = opts.cwd,
entry_maker = make_entry.gen_from_vimgrep(opts),
}
pickers
.new(opts, {
debounce = 100,
finder = finder,
previewer = conf.grep_previewer(opts),
prompt_title = "Multi Grep",
sorter = require("telescope.sorters").empty(),
})
:find()
end
M.setup = function()
vim.keymap.set("n", "<leader>fg", live_multigrep)
end
return M