mirror of
https://github.com/Cian-H/my_nvim_config.git
synced 2025-12-22 20:21:57 +00:00
Moved neovim config to its own repo
This commit is contained in:
2
ftplugin/elixir.lua
Normal file
2
ftplugin/elixir.lua
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
vim.bo.tabstop = 2
|
||||||
|
vim.bo.shiftwidth = 2
|
||||||
2
ftplugin/go.lua
Normal file
2
ftplugin/go.lua
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
vim.bo.tabstop = 2
|
||||||
|
vim.bo.shiftwidth = 2
|
||||||
2
ftplugin/nix.lua
Normal file
2
ftplugin/nix.lua
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
vim.bo.tabstop = 2
|
||||||
|
vim.bo.shiftwidth = 2
|
||||||
1
ftplugin/rust.lua
Normal file
1
ftplugin/rust.lua
Normal file
@@ -0,0 +1 @@
|
|||||||
|
vim.keymap.set("i", "'", "'", { buffer = 0 })
|
||||||
31
init.lua
Normal file
31
init.lua
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
-- Enable experimental fast lua module loader
|
||||||
|
vim.loader.enable()
|
||||||
|
|
||||||
|
require("config")
|
||||||
|
require("keybindings")
|
||||||
|
|
||||||
|
-- Then, i want to load lazy as my plugin manager and have it load my plugins
|
||||||
|
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||||
|
if not vim.loop.fs_stat(lazypath) then
|
||||||
|
vim.fn.system({
|
||||||
|
"git",
|
||||||
|
"clone",
|
||||||
|
"--filter=blob:none",
|
||||||
|
"https://github.com/folke/lazy.nvim.git",
|
||||||
|
"--branch=stable", -- latest stable release
|
||||||
|
lazypath,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.opt.rtp:prepend(lazypath)
|
||||||
|
|
||||||
|
require("lazy").setup("plugins", opts)
|
||||||
|
|
||||||
|
-- Next, set up custom LSPs
|
||||||
|
local lspconfig = require("lspconfig")
|
||||||
|
lspconfig.nushell.setup({})
|
||||||
|
lspconfig.prolog_ls.setup({ root_dir = lspconfig.util.root_pattern(".git") })
|
||||||
|
lspconfig.nixd.setup({})
|
||||||
|
lspconfig.mojo.setup({})
|
||||||
|
|
||||||
|
require("nvim-web-devicons").refresh() -- This fixes screwiness with the devicon colors
|
||||||
32
lua/config/icons.lua
Normal file
32
lua/config/icons.lua
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
return {
|
||||||
|
Ada = {
|
||||||
|
icon = "",
|
||||||
|
color = "#b89843",
|
||||||
|
cterm_color = "137",
|
||||||
|
name = "Ada",
|
||||||
|
},
|
||||||
|
Fortran = {
|
||||||
|
icon = "",
|
||||||
|
color = "#734f96",
|
||||||
|
cterm_color = "96",
|
||||||
|
name = "Fortran",
|
||||||
|
},
|
||||||
|
Lisp = {
|
||||||
|
icon = "",
|
||||||
|
color = "#c40904",
|
||||||
|
cterm_color = "160",
|
||||||
|
name = "Lisp",
|
||||||
|
},
|
||||||
|
Prolog = {
|
||||||
|
icon = "",
|
||||||
|
color = "#e4b854",
|
||||||
|
cterm_color = "179",
|
||||||
|
name = "Prolog",
|
||||||
|
},
|
||||||
|
Scallop = {
|
||||||
|
icon = "",
|
||||||
|
color = "#ffa6c9",
|
||||||
|
cterm_color = "225",
|
||||||
|
name = "Scallop",
|
||||||
|
},
|
||||||
|
}
|
||||||
92
lua/config/init.lua
Normal file
92
lua/config/init.lua
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
-- First, i want to configure my vanilla nvim settings
|
||||||
|
vim.wo.number = true -- Line numbers
|
||||||
|
vim.wo.relativenumber = true
|
||||||
|
vim.opt.wrap = false
|
||||||
|
vim.opt.mouse = "a" -- enable mouse mode for window resizing
|
||||||
|
vim.opt.clipboard = "unnamedplus" -- share system and nvim clipboard
|
||||||
|
vim.g.have_nerd_font = true
|
||||||
|
vim.opt.undofile = true -- Save undo history
|
||||||
|
-- Add custom commentstring definitions
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = "nix,flake",
|
||||||
|
command = "setlocal commentstring=#\\ %s",
|
||||||
|
})
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = "scallop",
|
||||||
|
command = "setlocal commentstring=//%s",
|
||||||
|
})
|
||||||
|
-- Add custom file types
|
||||||
|
vim.filetype.add({
|
||||||
|
extension = {
|
||||||
|
scl = "scallop",
|
||||||
|
prolog = "prolog",
|
||||||
|
pro = "prolog",
|
||||||
|
nu = "nu",
|
||||||
|
mojo = "mojo",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
callback = function(args)
|
||||||
|
local bufnr = args.buf
|
||||||
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||||
|
if client.server_capabilities.completionProvider then
|
||||||
|
vim.bo[bufnr].omnifunc = "v:lua.vim.lsp.omnifunc"
|
||||||
|
end
|
||||||
|
if client.server_capabilities.definitionProvider then
|
||||||
|
vim.bo[bufnr].tagfunc = "v:lua.vim.lsp.tagfunc"
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Case-insensitive searching UNLESS \C or capital in search
|
||||||
|
vim.opt.ignorecase = true
|
||||||
|
vim.opt.smartcase = true
|
||||||
|
vim.opt.signcolumn = "yes" -- Keep signcolumn on by default
|
||||||
|
-- Decrease update time and timeout between key commands
|
||||||
|
vim.opt.updatetime = 250
|
||||||
|
vim.opt.timeoutlen = 300
|
||||||
|
-- Configure how new splits should be opened
|
||||||
|
vim.opt.splitright = true
|
||||||
|
vim.opt.splitbelow = true
|
||||||
|
-- Render markers so we don't mistakenly put tabs (and other whitespace) where we dont want them
|
||||||
|
vim.opt.list = true
|
||||||
|
vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "␣" }
|
||||||
|
-- Also, while we're at it: let's set the tab widths
|
||||||
|
vim.opt.tabstop = 4
|
||||||
|
vim.opt.softtabstop = 4
|
||||||
|
vim.opt.shiftwidth = 4
|
||||||
|
vim.opt.smartindent = true
|
||||||
|
vim.opt.expandtab = true
|
||||||
|
vim.opt.smarttab = true
|
||||||
|
vim.opt.inccommand = "split" -- Preview substitutions live, as you type!
|
||||||
|
vim.opt.cursorline = true -- Show which line your cursor is on
|
||||||
|
vim.opt.scrolloff = 4 -- Minimal number of screen lines to keep above and below the cursor.
|
||||||
|
-- Set highlight on search, but clear on pressing <Esc> in normal mode
|
||||||
|
vim.opt.hlsearch = true
|
||||||
|
vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<CR>")
|
||||||
|
|
||||||
|
-- Highlight when yanking (copying) text
|
||||||
|
vim.api.nvim_create_autocmd("TextYankPost", {
|
||||||
|
desc = "Highlight when yanking (copying) text",
|
||||||
|
group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }),
|
||||||
|
callback = function()
|
||||||
|
vim.highlight.on_yank()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Diagnostics config
|
||||||
|
vim.diagnostic.config({
|
||||||
|
float = {
|
||||||
|
focusable = false,
|
||||||
|
style = "minimal",
|
||||||
|
border = "rounded",
|
||||||
|
source = "always",
|
||||||
|
header = "",
|
||||||
|
prefix = "",
|
||||||
|
},
|
||||||
|
signs = true,
|
||||||
|
underline = true,
|
||||||
|
update_in_insert = true,
|
||||||
|
severity_sort = false,
|
||||||
|
})
|
||||||
367
lua/config/keys.lua
Normal file
367
lua/config/keys.lua
Normal file
@@ -0,0 +1,367 @@
|
|||||||
|
return {
|
||||||
|
groups = {
|
||||||
|
{ "<leader>s", group = "[S]earch" },
|
||||||
|
{ "<leader>c", group = "[C]ode" },
|
||||||
|
{ "<leader>d", group = "[D]iagnostics" },
|
||||||
|
{ "<leader>g", group = "[G]enerate" },
|
||||||
|
{ "<leader>r", group = "[R]ename" },
|
||||||
|
{ "<leader>w", group = "[W]orkspace" },
|
||||||
|
{ "<leader>t", group = "[T]ree" },
|
||||||
|
{ "<leader>l", group = "[L]azyGit" },
|
||||||
|
{ "<leader>o", group = "[O]verseer" },
|
||||||
|
{ "<leader>h", group = "[H]arpoon" },
|
||||||
|
{ "<leader>x", group = "[X] Trouble" },
|
||||||
|
{ "<leader>|", group = "[|] Copilot" },
|
||||||
|
},
|
||||||
|
copilot = {
|
||||||
|
{ "<leader>||", "<cmd>Copilot toggle<cr>", desc = "[||] Toggle Copilot", mode = "n" },
|
||||||
|
{
|
||||||
|
"<leader>|t",
|
||||||
|
"<cmd>Copilot suggestion toggle_auto_trigger<cr>",
|
||||||
|
desc = "[|] [T]oggle inline suggestions",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{ "<leader>|p", "<cmd>Copilot panel<cr>", desc = "[|] [P]anel", mode = "n" },
|
||||||
|
},
|
||||||
|
harpoon = {
|
||||||
|
{
|
||||||
|
"<leader>ha",
|
||||||
|
function()
|
||||||
|
require("harpoon"):list():add()
|
||||||
|
end,
|
||||||
|
desc = "[H]arpoon [A]dd file",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>hq",
|
||||||
|
function()
|
||||||
|
local harpoon = require("harpoon")
|
||||||
|
harpoon.ui:toggle_quick_menu(harpoon:list())
|
||||||
|
end,
|
||||||
|
desc = "[H]arpoon [Q]uick menu",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<A-a>",
|
||||||
|
function()
|
||||||
|
require("harpoon"):list():select(1)
|
||||||
|
end,
|
||||||
|
desc = "Harpoon file 1",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<A-s>",
|
||||||
|
function()
|
||||||
|
require("harpoon"):list():select(2)
|
||||||
|
end,
|
||||||
|
desc = "Harpoon file 2",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<A-d>",
|
||||||
|
function()
|
||||||
|
require("harpoon"):list():select(3)
|
||||||
|
end,
|
||||||
|
desc = "Harpoon file 3",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<A-f>",
|
||||||
|
function()
|
||||||
|
require("harpoon"):list():select(4)
|
||||||
|
end,
|
||||||
|
desc = "Harpoon file 4",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
lazygit = {
|
||||||
|
{
|
||||||
|
"<leader>lg",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("lua Snacks.lazygit()")
|
||||||
|
end,
|
||||||
|
desc = "[L]azy[G]it",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>ll",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("lua Snacks.lazygit.log()")
|
||||||
|
end,
|
||||||
|
desc = "[L]azyGit [L]og",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>lf",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("lua Snacks.lazygit.log_file()")
|
||||||
|
end,
|
||||||
|
desc = "[L]azyGit [F]ile Log",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
neogen = {
|
||||||
|
{
|
||||||
|
"<Leader>gd",
|
||||||
|
":lua require('neogen').generate()<CR>",
|
||||||
|
desc = "[G]enerate [D]ocumentation",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
neotree = {
|
||||||
|
{
|
||||||
|
"<leader>tt",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree toggle")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [T]oggle",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>ts",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree show")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [S]how",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>tc",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree close")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [C]lose",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>tf",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree focus")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [F]ocus",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>tg",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree git_status")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [G]it Status",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>tb",
|
||||||
|
function()
|
||||||
|
vim.api.nvim_command("Neotree buffers")
|
||||||
|
end,
|
||||||
|
desc = "[T]ree [B]uffers",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
oil = {
|
||||||
|
{ "<leader>te", vim.cmd.Oil, desc = "[T]ree [E]dit", mode = "n" },
|
||||||
|
},
|
||||||
|
overseer = {
|
||||||
|
{ "<leader>ob", vim.cmd.OverseerBuild, desc = "[O]verseer [B]uild", mode = "n" },
|
||||||
|
{ "<leader>oc", vim.cmd.OverseerRunCmd, desc = "[O]verseer Run [C]ommand", mode = "n" },
|
||||||
|
{ "<leader>or", vim.cmd.OverseerRun, desc = "[O]verseer [R]un", mode = "n" },
|
||||||
|
{ "<leader>ot", vim.cmd.OverseerToggle, desc = "[O]verseer [T]oggle", mode = "n" },
|
||||||
|
},
|
||||||
|
precognition = {
|
||||||
|
{
|
||||||
|
"<leader>p",
|
||||||
|
function()
|
||||||
|
if require("precognition").toggle() then
|
||||||
|
vim.notify("Precognition ON")
|
||||||
|
else
|
||||||
|
vim.notify("Precognition OFF")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "[P]recognition",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
telescope = function(telescope_builtin)
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"<leader>sh",
|
||||||
|
telescope_builtin.help_tags,
|
||||||
|
desc = "[S]earch [H]elp",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sk",
|
||||||
|
telescope_builtin.keymaps,
|
||||||
|
desc = "[S]earch [K]eymaps",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sf",
|
||||||
|
telescope_builtin.find_files,
|
||||||
|
desc = "[S]earch [F]iles",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sb",
|
||||||
|
telescope_builtin.find_files,
|
||||||
|
desc = "[S]earch file [B]rowser",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>ss",
|
||||||
|
telescope_builtin.builtin,
|
||||||
|
desc = "[S]earch [S]elect Telescope",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sw",
|
||||||
|
telescope_builtin.grep_string,
|
||||||
|
desc = "[S]earch current [W]ord",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sg",
|
||||||
|
telescope_builtin.live_grep,
|
||||||
|
desc = "[S]earch by [G]rep",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sd",
|
||||||
|
telescope_builtin.diagnostics,
|
||||||
|
desc = "[S]earch [D]iagnostics",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>sr",
|
||||||
|
telescope_builtin.resume,
|
||||||
|
desc = "[S]earch [R]esume",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>s.",
|
||||||
|
telescope_builtin.oldfiles,
|
||||||
|
desc = '[S]earch Recent Files ("." for repeat)',
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader><leader>",
|
||||||
|
telescope_builtin.buffers,
|
||||||
|
desc = "[ ] Find existing buffers",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
-- Slightly advanced example of overriding default behavior and theme
|
||||||
|
{
|
||||||
|
"<leader>/",
|
||||||
|
function()
|
||||||
|
-- You can pass additional configuration to telescope to change theme, layout, etc.
|
||||||
|
telescope_builtin.current_buffer_fuzzy_find(
|
||||||
|
require("telescope.themes").get_dropdown({
|
||||||
|
winblend = 10,
|
||||||
|
previewer = false,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
end,
|
||||||
|
desc = "[/] Fuzzily search in current buffer",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
-- Also possible to pass additional configuration options.
|
||||||
|
-- See `:help telescope.builtin.live_grep()` for information about particular keys
|
||||||
|
{
|
||||||
|
"<leader>s/",
|
||||||
|
function()
|
||||||
|
telescope_builtin.live_grep({
|
||||||
|
grep_open_files = true,
|
||||||
|
prompt_title = "Live Grep in Open Files",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
desc = "[S]earch [/] in Open Files",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
-- Shortcut for searching your neovim configuration files
|
||||||
|
{
|
||||||
|
"<leader>sn",
|
||||||
|
function()
|
||||||
|
telescope_builtin.find_files({ cwd = vim.fn.stdpath("config") })
|
||||||
|
end,
|
||||||
|
desc = "[S]earch [N]eovim files",
|
||||||
|
mode = "n",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
todo_comments = {
|
||||||
|
{
|
||||||
|
"]t",
|
||||||
|
function()
|
||||||
|
require("todo-comments").jump_next()
|
||||||
|
end,
|
||||||
|
desc = "Next Todo Comment",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"[t",
|
||||||
|
function()
|
||||||
|
require("todo-comments").jump_prev()
|
||||||
|
end,
|
||||||
|
desc = "Previous Todo Comment",
|
||||||
|
},
|
||||||
|
{ "<leader>xt", "<cmd>Trouble todo toggle<cr>", desc = "Todo" },
|
||||||
|
{
|
||||||
|
"<leader>xT",
|
||||||
|
"<cmd>Trouble todo toggle filter = {tag = {TODO,FIX,FIXME}}<cr>",
|
||||||
|
desc = "Todo/Fix/Fixme",
|
||||||
|
},
|
||||||
|
{ "<leader>st", "<cmd>TodoTelescope<cr>", desc = "Todo" },
|
||||||
|
{
|
||||||
|
"<leader>sT",
|
||||||
|
"<cmd>TodoTelescope keywords=TODO,FIX,FIXME<cr>",
|
||||||
|
desc = "Todo/Fix/Fixme",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
trouble = {
|
||||||
|
{ "<leader>xx", "<cmd>Trouble diagnostics toggle<cr>", desc = "Diagnostics" },
|
||||||
|
{
|
||||||
|
"<leader>xX",
|
||||||
|
"<cmd>Trouble diagnostics toggle filter.buf=0<cr>",
|
||||||
|
desc = "Buffer Diagnostics",
|
||||||
|
},
|
||||||
|
{ "<leader>cs", "<cmd>Trouble symbols toggle<cr>", desc = "Symbols" },
|
||||||
|
{
|
||||||
|
"<leader>cS",
|
||||||
|
"<cmd>Trouble lsp toggle<cr>",
|
||||||
|
desc = "LSP references/definitions/... (Trouble)",
|
||||||
|
},
|
||||||
|
{ "<leader>xL", "<cmd>Trouble loclist toggle<cr>", desc = "Location List" },
|
||||||
|
{ "<leader>xQ", "<cmd>Trouble qflist toggle<cr>", desc = "Quickfix List" },
|
||||||
|
{
|
||||||
|
"[q",
|
||||||
|
function()
|
||||||
|
if require("trouble").is_open() then
|
||||||
|
require("trouble").prev({ skip_groups = true, jump = true })
|
||||||
|
else
|
||||||
|
local ok, err = pcall(vim.cmd.cprev)
|
||||||
|
if not ok then
|
||||||
|
vim.notify(err, vim.log.levels.ERROR)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Previous Trouble/Quickfix Item",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"]q",
|
||||||
|
function()
|
||||||
|
if require("trouble").is_open() then
|
||||||
|
require("trouble").next({ skip_groups = true, jump = true })
|
||||||
|
else
|
||||||
|
local ok, err = pcall(vim.cmd.cnext)
|
||||||
|
if not ok then
|
||||||
|
if err then
|
||||||
|
vim.notify(err, vim.log.levels.ERROR)
|
||||||
|
else
|
||||||
|
vim.notify("An error occured but returned nil!", vim.log.levels.ERROR)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Next Trouble/Quickfix Item",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
19
lua/keybindings.lua
Normal file
19
lua/keybindings.lua
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
vim.keymap.set("n", "<A-h>", "<C-w>h", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-j>", "<C-w>j", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-k>", "<C-w>k", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-l>", "<C-w>l", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-Left>", "<C-w>h", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-Down>", "<C-w>j", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-Up>", "<C-w>k", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-Right>", "<C-w>l", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-=>", "<C-w>+", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-->", "<C-w>-", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-.>", "<C-w>>", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-,>", "<C-w><", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-n>", "<C-w>s", { noremap = true, silent = true })
|
||||||
|
-- This keymap isn't ideal but its the best i can figure out right now
|
||||||
|
vim.keymap.set("n", "<A-;>", "<C-w>x", { noremap = true, silent = true })
|
||||||
|
vim.keymap.set("n", "<A-q>", ":q<CR>", { noremap = true, silent = true })
|
||||||
|
-- Non standard key mappings are here
|
||||||
|
vim.keymap.set("n", "<leader>d", vim.diagnostic.open_float, { desc = "[D]iagnostics" })
|
||||||
|
vim.keymap.set("n", "<leader>f", vim.lsp.buf.format, { desc = "[F]ormat" })
|
||||||
49
lua/plugins/extras.lua
Normal file
49
lua/plugins/extras.lua
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
return { -- Non programming quality of life utilities go here
|
||||||
|
{ -- Definitely need to add a plugin for quickly making notes in obsidian
|
||||||
|
"epwalsh/obsidian.nvim",
|
||||||
|
version = "*",
|
||||||
|
cmd = "Obsidian",
|
||||||
|
event = "VeryLazy",
|
||||||
|
cond = function()
|
||||||
|
return vim.fn.executable("obsidian") == 1
|
||||||
|
end,
|
||||||
|
dependencies = {
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
},
|
||||||
|
opts = {
|
||||||
|
workspaces = {
|
||||||
|
{
|
||||||
|
name = "work",
|
||||||
|
path = "~/Documents/Work_Notes/",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
completion = {
|
||||||
|
nvim_cmp = true,
|
||||||
|
min_chars = 2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"MeanderingProgrammer/render-markdown.nvim",
|
||||||
|
opts = {},
|
||||||
|
ft = "markdown",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
"echasnovski/mini.nvim",
|
||||||
|
"nvim-tree/nvim-web-devicons",
|
||||||
|
},
|
||||||
|
---@module 'render-markdown'
|
||||||
|
---@type render.md.UserConfig
|
||||||
|
},
|
||||||
|
{ -- A cheatsheet will always be useful until im a bit more familiar with vim
|
||||||
|
"sudormrfbin/cheatsheet.nvim",
|
||||||
|
event = "VeryLazy",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
"nvim-lua/popup.nvim",
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
236
lua/plugins/lsp.lua
Normal file
236
lua/plugins/lsp.lua
Normal file
@@ -0,0 +1,236 @@
|
|||||||
|
return { -- LSP Config should be a standalone function, hence this module
|
||||||
|
{ -- LSP Configuration & Plugins
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
dependencies = {
|
||||||
|
-- Automatically install LSPs and related tools to stdpath for neovim
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
"williamboman/mason-lspconfig.nvim",
|
||||||
|
"WhoIsSethDaniel/mason-tool-installer.nvim",
|
||||||
|
|
||||||
|
-- Useful status updates for LSP.
|
||||||
|
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
|
||||||
|
{ "j-hui/fidget.nvim", opts = {} },
|
||||||
|
|
||||||
|
-- `neodev` configures Lua LSP for your Neovim config, runtime and plugins
|
||||||
|
-- used for completion, annotations and signatures of Neovim apis
|
||||||
|
{ "folke/neodev.nvim", opts = {} },
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
-- Brief Aside: **What is LSP?**
|
||||||
|
--
|
||||||
|
-- LSP is an acronym you've probably heard, but might not understand what it is.
|
||||||
|
--
|
||||||
|
-- LSP stands for Language Server Protocol. It's a protocol that helps editors
|
||||||
|
-- and language tooling communicate in a standardized fashion.
|
||||||
|
--
|
||||||
|
-- In general, you have a "server" which is some tool built to understand a particular
|
||||||
|
-- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc). These Language Servers
|
||||||
|
-- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone
|
||||||
|
-- processes that communicate with some "client" - in this case, Neovim!
|
||||||
|
--
|
||||||
|
-- LSP provides Neovim with features like:
|
||||||
|
-- - Go to definition
|
||||||
|
-- - Find references
|
||||||
|
-- - Autocompletion
|
||||||
|
-- - Symbol Search
|
||||||
|
-- - and more!
|
||||||
|
--
|
||||||
|
-- Thus, Language Servers are external tools that must be installed separately from
|
||||||
|
-- Neovim. This is where `mason` and related plugins come into play.
|
||||||
|
--
|
||||||
|
-- If you're wondering about lsp vs treesitter, you can check out the wonderfully
|
||||||
|
-- and elegantly composed help section, `:help lsp-vs-treesitter`
|
||||||
|
|
||||||
|
-- This function gets run when an LSP attaches to a particular buffer.
|
||||||
|
-- That is to say, every time a new file is opened that is associated with
|
||||||
|
-- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this
|
||||||
|
-- function will be executed to configure the current buffer
|
||||||
|
|
||||||
|
require("mason").setup({
|
||||||
|
PATH = "append",
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }),
|
||||||
|
callback = function(event)
|
||||||
|
-- NOTE: Remember that lua is a real programming language, and as such it is possible
|
||||||
|
-- to define small helper and utility functions so you don't have to repeat yourself
|
||||||
|
-- many times.
|
||||||
|
--
|
||||||
|
-- In this case, we create a function that lets us more easily define mappings specific
|
||||||
|
-- for LSP related items. It sets the mode, buffer and description for us each time.
|
||||||
|
local map = function(keys, func, desc)
|
||||||
|
vim.keymap.set(
|
||||||
|
"n",
|
||||||
|
keys,
|
||||||
|
func,
|
||||||
|
{ buffer = event.buf, desc = "LSP: " .. desc }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Jump to the definition of the word under your cursor.
|
||||||
|
-- This is where a variable was first declared, or where a function is defined, etc.
|
||||||
|
-- To jump back, press <C-t>.
|
||||||
|
map("gd", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
|
||||||
|
|
||||||
|
-- Find references for the word under your cursor.
|
||||||
|
map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
|
||||||
|
|
||||||
|
-- Jump to the implementation of the word under your cursor.
|
||||||
|
-- Useful when your language has ways of declaring types without an actual implementation.
|
||||||
|
map(
|
||||||
|
"gI",
|
||||||
|
require("telescope.builtin").lsp_implementations,
|
||||||
|
"[G]oto [I]mplementation"
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Jump to the type of the word under your cursor.
|
||||||
|
-- Useful when you're not sure what type a variable is and you want to see
|
||||||
|
-- the definition of its *type*, not where it was *defined*.
|
||||||
|
map(
|
||||||
|
"<leader>D",
|
||||||
|
require("telescope.builtin").lsp_type_definitions,
|
||||||
|
"Type [D]efinition"
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Fuzzy find all the symbols in your current document.
|
||||||
|
-- Symbols are things like variables, functions, types, etc.
|
||||||
|
map(
|
||||||
|
"<leader>gs",
|
||||||
|
require("telescope.builtin").lsp_document_symbols,
|
||||||
|
"[G]oto [S]ymbols"
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Fuzzy find all the symbols in your current workspace
|
||||||
|
-- Similar to document symbols, except searches over your whole project.
|
||||||
|
map(
|
||||||
|
"<leader>ws",
|
||||||
|
require("telescope.builtin").lsp_dynamic_workspace_symbols,
|
||||||
|
"[W]orkspace [S]ymbols"
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Rename the variable under your cursor
|
||||||
|
-- Most Language Servers support renaming across files, etc.
|
||||||
|
map("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame")
|
||||||
|
|
||||||
|
-- Execute a code action, usually your cursor needs to be on top of an error
|
||||||
|
-- or a suggestion from your LSP for this to activate.
|
||||||
|
map("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction")
|
||||||
|
|
||||||
|
-- Opens a popup that displays documentation about the word under your cursor
|
||||||
|
-- See `:help K` for why this keymap
|
||||||
|
map("K", vim.lsp.buf.hover, "Hover Documentation")
|
||||||
|
|
||||||
|
-- WARN: This is not Goto Definition, this is Goto Declaration.
|
||||||
|
-- For example, in C this would take you to the header
|
||||||
|
map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
|
||||||
|
|
||||||
|
-- The following two autocommands are used to highlight references of the
|
||||||
|
-- word under your cursor when your cursor rests there for a little while.
|
||||||
|
-- See `:help CursorHold` for information about when this is executed
|
||||||
|
--
|
||||||
|
-- When you move your cursor, the highlights will be cleared (the second autocommand).
|
||||||
|
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
||||||
|
if client and client.server_capabilities.documentHighlightProvider then
|
||||||
|
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
|
||||||
|
buffer = event.buf,
|
||||||
|
callback = vim.lsp.buf.document_highlight,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
|
||||||
|
buffer = event.buf,
|
||||||
|
callback = vim.lsp.buf.clear_references,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- LSP servers and clients are able to communicate to each other what features they support.
|
||||||
|
-- By default, Neovim doesn't support everything that is in the LSP Specification.
|
||||||
|
-- When you add nvim-cmp, luasnip, etc. Neovim now has *more* capabilities.
|
||||||
|
-- So, we create new capabilities with nvim cmp, and then broadcast that to the servers.
|
||||||
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
||||||
|
capabilities = vim.tbl_deep_extend(
|
||||||
|
"force",
|
||||||
|
capabilities,
|
||||||
|
require("cmp_nvim_lsp").default_capabilities()
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Enable the following language servers
|
||||||
|
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
|
||||||
|
--
|
||||||
|
-- Add any additional override configuration in the following tables. Available keys are:
|
||||||
|
-- - cmd (table): Override the default command used to start the server
|
||||||
|
-- - filetypes (table): Override the default list of associated filetypes for the server
|
||||||
|
-- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features.
|
||||||
|
-- - settings (table): Override the default settings passed when initializing the server.
|
||||||
|
-- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/
|
||||||
|
local servers = {
|
||||||
|
-- clangd = {},
|
||||||
|
-- gopls = {},
|
||||||
|
-- pyright = {},
|
||||||
|
-- rust_analyzer = {},
|
||||||
|
-- ... etc. See `:help lspconfig-all` for a list of all the pre-configured LSPs
|
||||||
|
--
|
||||||
|
-- Some languages (like typescript) have entire language plugins that can be useful:
|
||||||
|
-- https://github.com/pmizio/typescript-tools.nvim
|
||||||
|
--
|
||||||
|
-- But for many setups, the LSP (`tsserver`) will work just fine
|
||||||
|
-- tsserver = {},
|
||||||
|
--
|
||||||
|
|
||||||
|
lua_ls = {
|
||||||
|
-- cmd = {...},
|
||||||
|
-- filetypes { ...},
|
||||||
|
-- capabilities = {},
|
||||||
|
settings = {
|
||||||
|
Lua = {
|
||||||
|
completion = {
|
||||||
|
callSnippet = "Replace",
|
||||||
|
},
|
||||||
|
-- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings
|
||||||
|
-- diagnostics = { disable = { 'missing-fields' } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
-- Ensure the servers and tools above are installed
|
||||||
|
-- To check the current status of installed tools and/or manually install
|
||||||
|
-- other tools, you can run
|
||||||
|
-- :Mason
|
||||||
|
--
|
||||||
|
-- You can press `g?` for help in this menu
|
||||||
|
require("mason").setup()
|
||||||
|
|
||||||
|
-- You can add other tools here that you want Mason to install
|
||||||
|
-- for you, so that they are available from within Neovim.
|
||||||
|
local ensure_installed = vim.tbl_keys(servers or {})
|
||||||
|
-- vim.list_extend(ensure_installed, {
|
||||||
|
-- "stylua", -- Used to format lua code
|
||||||
|
-- })
|
||||||
|
require("mason-tool-installer").setup({ ensure_installed = ensure_installed })
|
||||||
|
|
||||||
|
require("mason-lspconfig").setup({
|
||||||
|
handlers = {
|
||||||
|
function(server_name)
|
||||||
|
local server = servers[server_name] or {}
|
||||||
|
-- This handles overriding only values explicitly passed
|
||||||
|
-- by the server configuration above. Useful when disabling
|
||||||
|
-- certain features of an LSP (for example, turning off formatting for tsserver)
|
||||||
|
server.capabilities = vim.tbl_deep_extend(
|
||||||
|
"force",
|
||||||
|
{},
|
||||||
|
capabilities,
|
||||||
|
server.capabilities or {}
|
||||||
|
)
|
||||||
|
require("lspconfig")[server_name].setup(server)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- Finally: add language and filetype specific plugins
|
||||||
|
{ "fladson/vim-kitty", ft = "kitty" },
|
||||||
|
{ "scallop-lang/vim-scallop", ft = "scallop" },
|
||||||
|
}
|
||||||
130
lua/plugins/mini.lua
Normal file
130
lua/plugins/mini.lua
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
return { -- Mini is so varied it's hard to categorise. So i dumped my mini installs here
|
||||||
|
{ -- Collection of various small independent plugins/modules
|
||||||
|
"echasnovski/mini.nvim",
|
||||||
|
config = function()
|
||||||
|
-- Better Around/Inside textobjects
|
||||||
|
--
|
||||||
|
-- Examples:
|
||||||
|
-- - va) - [V]isually select [A]round [)]paren
|
||||||
|
-- - yinq - [Y]ank [I]nside [N]ext [']quote
|
||||||
|
-- - ci' - [C]hange [I]nside [']quote
|
||||||
|
require("mini.ai").setup({ n_lines = 500 })
|
||||||
|
|
||||||
|
-- Add/delete/replace surroundings (brackets, quotes, etc.)
|
||||||
|
--
|
||||||
|
-- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren
|
||||||
|
-- - sd' - [S]urround [D]elete [']quotes
|
||||||
|
-- - sr)' - [S]urround [R]eplace [)] [']
|
||||||
|
require("mini.surround").setup()
|
||||||
|
|
||||||
|
-- Setup of mini.notify
|
||||||
|
local notify = require("mini.notify")
|
||||||
|
notify.setup()
|
||||||
|
vim.notify = notify.make_notify({
|
||||||
|
ERROR = { duration = 5000 },
|
||||||
|
WARN = { duration = 4000 },
|
||||||
|
INFO = { duration = 3000 },
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Some other mini.nvim plugins that look useful to me
|
||||||
|
require("mini.clue").setup()
|
||||||
|
require("mini.visits").setup()
|
||||||
|
require("mini.sessions").setup()
|
||||||
|
require("mini.pairs").setup({ mappings = { ["`"] = false } })
|
||||||
|
require("mini.comment").setup()
|
||||||
|
require("mini.splitjoin").setup()
|
||||||
|
require("mini.trailspace").setup()
|
||||||
|
|
||||||
|
-- My custom mini.starter config
|
||||||
|
local starter_items = {
|
||||||
|
{
|
||||||
|
action = "Telescope file_browser",
|
||||||
|
name = "Tree",
|
||||||
|
section = "Telescope",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action = "Telescope live_grep",
|
||||||
|
name = "Live grep",
|
||||||
|
section = "Telescope",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action = "Telescope find_files",
|
||||||
|
name = "File grep",
|
||||||
|
section = "Telescope",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action = "Telescope command_history",
|
||||||
|
name = "Command history",
|
||||||
|
section = "Telescope",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
action = "Telescope help_tags",
|
||||||
|
name = "Help tags",
|
||||||
|
section = "Telescope",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Log",
|
||||||
|
action = [[lua Snacks.lazygit.log()]],
|
||||||
|
section = "Git",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Lazygit",
|
||||||
|
action = [[lua Snacks.lazygit()]],
|
||||||
|
section = "Git",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Browser",
|
||||||
|
action = function()
|
||||||
|
local handle = io.popen("git remote show")
|
||||||
|
if handle == nil then
|
||||||
|
vim.notify("Failed to find remote", vim.log.levels.ERROR)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local result = handle:read("*a")
|
||||||
|
handle:close()
|
||||||
|
local remote = vim.split(result, "\n")[1]
|
||||||
|
handle = io.popen("git remote get-url " .. remote)
|
||||||
|
if handle == nil then
|
||||||
|
vim.notify("Failed to get url for " .. remote, vim.log.levels.ERROR)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local url = handle:read("*a")
|
||||||
|
handle:close()
|
||||||
|
handle = io.popen("xdg-open " .. url)
|
||||||
|
if handle == nil then
|
||||||
|
vim.notify("Failed to open " .. url, vim.log.levels.ERROR)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
result = handle:read("*a")
|
||||||
|
handle:close()
|
||||||
|
end,
|
||||||
|
section = "Git",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name = "Harpoon Quickmenu",
|
||||||
|
action = [[lua require("harpoon").ui:toggle_quick_menu(require("harpoon"):list())]],
|
||||||
|
section = "Misc",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
require("mini.starter").setup({
|
||||||
|
header = "⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⢀⣴⠿⢟⣛⣩⣤⣶⣶⣶⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⢀⣴⣿⠿⠸⣿⣿⣿⣿⣿⣿⡿⢿⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⢠⠞⠉⠀⠀⠀⣿⠋⠻⣿⣿⣿⠀⣦⣿⠏⠀⠀⠀⢀⣀⣀⣀⣀⣀⠀⠀\
|
||||||
|
⢠⠏⠀⠀⠀⠀⠀⠻⣤⣷⣿⣿⣿⣶⢟⣁⣒⣒⡋⠉⠉⠁⠀⠀⠀⠈⠉⡧\
|
||||||
|
⢻⡀⠀⠀⠀⠀⠀⣀⡤⠌⢙⣛⣛⣵⣿⣿⡛⠛⠿⠃⠀⠀⠀⠀⠀⢀⡜⠁\
|
||||||
|
⠀⠉⠙⠒⠒⠛⠉⠁⠀⠸⠛⠉⠉⣿⣿⣿⣿⣦⣄⠀⠀⠀⢀⣠⠞⠁⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⣿⣿⡿⣿⣿⣷⡄⠞⠋⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣷⡻⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢨⣑⡙⠻⠿⠿⠈⠙⣿⣧⠀⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣿⣷⡀⠀⠀⠀⠀⢹⣿⣆⠀⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⡇⠀⠀⠀⠀⠸⣿⣿⡄⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⠀⡿⣿⣿⠀⠀⠀⠀\
|
||||||
|
⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠈⠙⠀⠀⠀⠀⠀",
|
||||||
|
items = starter_items,
|
||||||
|
footer = "",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
14
lua/plugins/snacks.lua
Normal file
14
lua/plugins/snacks.lua
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
return {
|
||||||
|
{
|
||||||
|
"folke/snacks.nvim",
|
||||||
|
priority = 1000,
|
||||||
|
lazy = false,
|
||||||
|
---@type snacks.Config
|
||||||
|
opts = {
|
||||||
|
bigfile = { enabled = true },
|
||||||
|
lazygit = { enabled = true },
|
||||||
|
quickfile = { enabled = true },
|
||||||
|
},
|
||||||
|
keys = require("config.keys").lazygit,
|
||||||
|
},
|
||||||
|
}
|
||||||
74
lua/plugins/telescope.lua
Normal file
74
lua/plugins/telescope.lua
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
return { -- Telescope is so core to nvim that it gets its own module
|
||||||
|
{ -- Fuzzy Finder (files, lsp, etc)
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
event = "VimEnter",
|
||||||
|
branch = "0.1.x",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
{ -- If encountering errors, see telescope-fzf-native README for install instructions
|
||||||
|
"nvim-telescope/telescope-fzf-native.nvim",
|
||||||
|
|
||||||
|
-- `build` is used to run some command when the plugin is installed/updated.
|
||||||
|
-- This is only run then, not every time Neovim starts up.
|
||||||
|
build = "make",
|
||||||
|
|
||||||
|
-- `cond` is a condition used to determine whether this plugin should be
|
||||||
|
-- installed and loaded.
|
||||||
|
cond = function()
|
||||||
|
return vim.fn.executable("make") == 1
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ "nvim-telescope/telescope-ui-select.nvim" },
|
||||||
|
-- Useful for getting pretty icons, but requires a Nerd Font.
|
||||||
|
{ "nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font },
|
||||||
|
-- A really nice filetree browser built on telescope
|
||||||
|
{ "nvim-telescope/telescope-file-browser.nvim" },
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
-- Telescope is a fuzzy finder that comes with a lot of different things that
|
||||||
|
-- it can fuzzy find! It's more than just a "file finder", it can search
|
||||||
|
-- many different aspects of Neovim, your workspace, LSP, and more!
|
||||||
|
--
|
||||||
|
-- The easiest way to use telescope, is to start by doing something like:
|
||||||
|
-- :Telescope help_tags
|
||||||
|
--
|
||||||
|
-- After running this command, a window will open up and you're able to
|
||||||
|
-- type in the prompt window. You'll see a list of help_tags options and
|
||||||
|
-- a corresponding preview of the help.
|
||||||
|
--
|
||||||
|
-- Two important keymaps to use while in telescope are:
|
||||||
|
-- - Insert mode: <c-/>
|
||||||
|
-- - Normal mode: ?
|
||||||
|
--
|
||||||
|
-- This opens a window that shows you all of the keymaps for the current
|
||||||
|
-- telescope picker. This is really useful to discover what Telescope can
|
||||||
|
-- do as well as how to actually do it!
|
||||||
|
|
||||||
|
-- [[ Configure Telescope ]]
|
||||||
|
-- See `:help telescope` and `:help telescope.setup()`
|
||||||
|
require("telescope").setup({
|
||||||
|
-- You can put your default mappings / updates / etc. in here
|
||||||
|
-- All the info you're looking for is in `:help telescope.setup()`
|
||||||
|
--
|
||||||
|
-- defaults = {
|
||||||
|
-- mappings = {
|
||||||
|
-- i = { ['<c-enter>'] = 'to_fuzzy_refine' },
|
||||||
|
-- },
|
||||||
|
-- },
|
||||||
|
-- pickers = {}
|
||||||
|
extensions = {
|
||||||
|
["ui-select"] = {
|
||||||
|
require("telescope.themes").get_dropdown(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Enable telescope extensions, if they are installed
|
||||||
|
pcall(require("telescope").load_extension, "fzf")
|
||||||
|
pcall(require("telescope").load_extension, "ui-select")
|
||||||
|
pcall(require("telescope").load_extension, "file-browser")
|
||||||
|
end,
|
||||||
|
-- See `:help telescope.builtin`
|
||||||
|
keys = require("config.keys").telescope(require("telescope.builtin")),
|
||||||
|
},
|
||||||
|
}
|
||||||
152
lua/plugins/ui.lua
Normal file
152
lua/plugins/ui.lua
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
return { -- UI components and other visual elements are declared here
|
||||||
|
{ -- Theme
|
||||||
|
"folke/tokyonight.nvim",
|
||||||
|
lazy = false,
|
||||||
|
priority = 1000,
|
||||||
|
init = function()
|
||||||
|
vim.cmd.colorscheme("tokyonight-night")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ "MunifTanjim/nui.nvim", lazy = true },
|
||||||
|
{ -- Useful plugin to show you pending keybinds.
|
||||||
|
"folke/which-key.nvim",
|
||||||
|
event = "VimEnter",
|
||||||
|
config = function()
|
||||||
|
local wk = require("which-key")
|
||||||
|
local groups = require("config.keys").groups
|
||||||
|
wk.add(groups)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvim-tree/nvim-web-devicons",
|
||||||
|
config = function()
|
||||||
|
local icons = require("config.icons")
|
||||||
|
require("nvim-web-devicons").setup({
|
||||||
|
color_icons = true,
|
||||||
|
override_by_extension = {
|
||||||
|
["scl"] = icons.Scallop,
|
||||||
|
["prolog"] = icons.Prolog,
|
||||||
|
["pro"] = icons.Prolog,
|
||||||
|
["lisp"] = icons.Lisp,
|
||||||
|
["lsp"] = icons.Lisp,
|
||||||
|
["asd"] = icons.Lisp,
|
||||||
|
["f"] = icons.Fortran,
|
||||||
|
["f77"] = icons.Fortran,
|
||||||
|
["f90"] = icons.Fortran,
|
||||||
|
["f18"] = icons.Fortran,
|
||||||
|
["adb"] = icons.Ada,
|
||||||
|
["ads"] = icons.Ada,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ -- A file explorer, because i'm not used to the vim workflow yet
|
||||||
|
"nvim-neo-tree/neo-tree.nvim",
|
||||||
|
branch = "v3.x",
|
||||||
|
event = "VimEnter",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
"nvim-tree/nvim-web-devicons", -- not strictly required, but recommended
|
||||||
|
"MunifTanjim/nui.nvim",
|
||||||
|
},
|
||||||
|
keys = require("config.keys").neotree,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"s1n7ax/nvim-window-picker",
|
||||||
|
name = "window-picker",
|
||||||
|
event = "VeryLazy",
|
||||||
|
version = "2.*",
|
||||||
|
config = function()
|
||||||
|
require("window-picker").setup()
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ -- Adds git related signs to the gutter, as well as utilities for managing changes
|
||||||
|
"mhinz/vim-signify",
|
||||||
|
event = "VimEnter",
|
||||||
|
config = function()
|
||||||
|
-- defer config for 5ms. Old vim plugins can be janky in neovim
|
||||||
|
vim.defer_fn(function()
|
||||||
|
vim.g.signify_sign_show_count = 0
|
||||||
|
vim.g.signify_sign_add = "┃"
|
||||||
|
vim.g.signify_sign_change = "┃"
|
||||||
|
vim.g.signify_sign_delete = "_"
|
||||||
|
vim.g.signify_sign_delete_first_line = "‾"
|
||||||
|
vim.g.signify_sign_change_delete = "~"
|
||||||
|
vim.cmd.highlight({ "SignifySignAdd", "guifg=#449dab" })
|
||||||
|
vim.cmd.highlight({ "SignifySignChange", "guifg=#6183bb" })
|
||||||
|
vim.cmd.highlight({ "SignifySignDelete", "guifg=#914c54" })
|
||||||
|
vim.cmd.highlight({ "link", "SignifySignDeleteFirstLine", "SignifySignDelete" })
|
||||||
|
vim.cmd.highlight({ "link", "SignifySignChangeDelete", "SignifySignChange" })
|
||||||
|
end, 5)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- Modular, configurable status bar
|
||||||
|
{
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||||
|
config = function()
|
||||||
|
local hl_color = require("tokyonight").load({ style = "night" }).orange
|
||||||
|
vim.cmd.highlight({ "LualineHarpoonActive", "guifg=" .. hl_color })
|
||||||
|
|
||||||
|
require("lualine").setup({
|
||||||
|
options = {
|
||||||
|
component_separators = { left = "", right = "" },
|
||||||
|
section_separators = { left = "", right = "" },
|
||||||
|
},
|
||||||
|
sections = {
|
||||||
|
lualine_c = {
|
||||||
|
{
|
||||||
|
"harpoon2",
|
||||||
|
icon = "",
|
||||||
|
indicators = { "A", "S", "D", "F" },
|
||||||
|
active_indicators = {
|
||||||
|
"%#LualineHarpoonActive#A%*",
|
||||||
|
"%#LualineHarpoonActive#S%*",
|
||||||
|
"%#LualineHarpoonActive#D%*",
|
||||||
|
"%#LualineHarpoonActive#F%*",
|
||||||
|
},
|
||||||
|
_separator = "∙",
|
||||||
|
no_harpoon = "Harpoon not loaded",
|
||||||
|
},
|
||||||
|
"filename",
|
||||||
|
},
|
||||||
|
lualine_x = {
|
||||||
|
{ "copilot", show_colors = true },
|
||||||
|
"encoding",
|
||||||
|
"fileformat",
|
||||||
|
"filetype",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
extensions = {
|
||||||
|
"fugitive",
|
||||||
|
"fzf",
|
||||||
|
"lazy",
|
||||||
|
"mason",
|
||||||
|
"neo-tree",
|
||||||
|
"oil",
|
||||||
|
"overseer",
|
||||||
|
"quickfix",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"letieu/harpoon-lualine",
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"ThePrimeagen/harpoon",
|
||||||
|
branch = "harpoon2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AndreM222/copilot-lualine",
|
||||||
|
event = "VeryLazy",
|
||||||
|
dependencies = { "zbirenbaum/copilot.lua" },
|
||||||
|
},
|
||||||
|
-- Assistant for refreshers on vim motions
|
||||||
|
{
|
||||||
|
"tris203/precognition.nvim",
|
||||||
|
keys = require("config.keys").precognition,
|
||||||
|
},
|
||||||
|
}
|
||||||
266
lua/plugins/utils.lua
Normal file
266
lua/plugins/utils.lua
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
return { -- General programming utilities go here
|
||||||
|
-- Tools for configuration and plugin development
|
||||||
|
{ "folke/neoconf.nvim", cmd = "Neoconf" },
|
||||||
|
{
|
||||||
|
"folke/neodev.nvim",
|
||||||
|
opts = {
|
||||||
|
override = function(root_dir, library)
|
||||||
|
if
|
||||||
|
root_dir:find(
|
||||||
|
os.getenv("XDG_CONFIG_HOME")
|
||||||
|
.. "/nix/home-manager/core/dotfiles/dot_config/nvim/",
|
||||||
|
1,
|
||||||
|
true
|
||||||
|
) == 1
|
||||||
|
then
|
||||||
|
library.enabled = true
|
||||||
|
library.plugins = true
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- Privilege escalation plugin
|
||||||
|
{ "lambdalisue/suda.vim", event = "VeryLazy" },
|
||||||
|
{
|
||||||
|
"folke/trouble.nvim",
|
||||||
|
cmd = { "Trouble" },
|
||||||
|
opts = {
|
||||||
|
modes = {
|
||||||
|
lsp = {
|
||||||
|
win = { position = "right" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
keys = require("config.keys").trouble,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"folke/todo-comments.nvim",
|
||||||
|
cmd = { "TodoTrouble", "TodoTelescope" },
|
||||||
|
event = "VimEnter",
|
||||||
|
dependencies = { "nvim-lua/plenary.nvim" },
|
||||||
|
keys = require("config.keys").todo_comments,
|
||||||
|
},
|
||||||
|
"tpope/vim-fugitive", -- Also want to add fugitive, since it's apparently a great git plugin
|
||||||
|
"jlfwong/vim-mercenary", -- Mercenary is the mercurial equivalent of fugitive
|
||||||
|
{ -- Oil is a very nice buffer-based filetree editor
|
||||||
|
"stevearc/oil.nvim",
|
||||||
|
event = "VeryLazy",
|
||||||
|
opts = {},
|
||||||
|
dependencies = { "nvim-tree/nvim-web-devicons" },
|
||||||
|
keys = require("config.keys").oil,
|
||||||
|
},
|
||||||
|
{ -- Harpoon, because i keep losing track of my markers
|
||||||
|
"theprimeagen/harpoon",
|
||||||
|
branch = "harpoon2",
|
||||||
|
dependencies = { "nvim-lua/plenary.nvim" },
|
||||||
|
config = function()
|
||||||
|
require("harpoon"):setup({})
|
||||||
|
end,
|
||||||
|
keys = require("config.keys").harpoon,
|
||||||
|
},
|
||||||
|
-- Snippets
|
||||||
|
"SirVer/ultisnips",
|
||||||
|
"honza/vim-snippets",
|
||||||
|
"rafamadriz/friendly-snippets",
|
||||||
|
{ -- Package and devenv plugins
|
||||||
|
"danymat/neogen",
|
||||||
|
event = "VimEnter",
|
||||||
|
config = function()
|
||||||
|
require("neogen").setup({
|
||||||
|
enabled = true,
|
||||||
|
snippet_engine = "luasnip",
|
||||||
|
languages = {
|
||||||
|
python = {
|
||||||
|
template = {
|
||||||
|
annotation_convention = "google_docstrings",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
keys = require("config.keys").neogen,
|
||||||
|
},
|
||||||
|
{ -- Autoformat
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
event = "VimEnter",
|
||||||
|
opts = {
|
||||||
|
notify_on_error = false,
|
||||||
|
format_on_save = {
|
||||||
|
timeout_ms = 500,
|
||||||
|
lsp_fallback = true,
|
||||||
|
},
|
||||||
|
formatters_by_ft = {
|
||||||
|
lua = { "stylua" },
|
||||||
|
nix = { "alejandra" },
|
||||||
|
-- Conform can also run multiple formatters sequentially
|
||||||
|
-- python = { "isort", "black" },
|
||||||
|
--
|
||||||
|
-- You can use a sub-list to tell conform to run *until* a formatter
|
||||||
|
-- is found.
|
||||||
|
-- javascript = { { "prettierd", "prettier" } },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ -- Autocompletion
|
||||||
|
"hrsh7th/nvim-cmp",
|
||||||
|
event = "InsertEnter",
|
||||||
|
dependencies = {
|
||||||
|
-- Snippet Engine & its associated nvim-cmp source
|
||||||
|
{
|
||||||
|
"L3MON4D3/LuaSnip",
|
||||||
|
build = (function()
|
||||||
|
-- Build Step is needed for regex support in snippets
|
||||||
|
-- This step is not supported in many windows environments
|
||||||
|
-- Remove the below condition to re-enable on windows
|
||||||
|
if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return "make install_jsregexp"
|
||||||
|
end)(),
|
||||||
|
},
|
||||||
|
"saadparwaiz1/cmp_luasnip",
|
||||||
|
|
||||||
|
-- Adds other completion capabilities.
|
||||||
|
-- nvim-cmp does not ship with all sources by default. They are split
|
||||||
|
-- into multiple repos for maintenance purposes.
|
||||||
|
"hrsh7th/cmp-nvim-lsp",
|
||||||
|
"hrsh7th/cmp-path",
|
||||||
|
|
||||||
|
-- If you want to add a bunch of pre-configured snippets,
|
||||||
|
-- you can use this plugin to help you. It even has snippets
|
||||||
|
-- for various frameworks/libraries/etc. but you will have to
|
||||||
|
-- set up the ones that are useful for you.
|
||||||
|
-- 'rafamadriz/friendly-snippets',
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
-- See `:help cmp`
|
||||||
|
local cmp = require("cmp")
|
||||||
|
local luasnip = require("luasnip")
|
||||||
|
luasnip.config.setup({})
|
||||||
|
|
||||||
|
cmp.setup({
|
||||||
|
snippet = {
|
||||||
|
expand = function(args)
|
||||||
|
luasnip.lsp_expand(args.body)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
completion = { completeopt = "menu,menuone,noinsert" },
|
||||||
|
|
||||||
|
-- For an understanding of why these mappings were
|
||||||
|
-- chosen, you will need to read `:help ins-completion`
|
||||||
|
--
|
||||||
|
-- No, but seriously. Please read `:help ins-completion`, it is really good!
|
||||||
|
mapping = cmp.mapping.preset.insert({
|
||||||
|
-- Select the [n]ext item
|
||||||
|
["<M-n>"] = cmp.mapping.select_next_item(),
|
||||||
|
-- Select the [p]revious item
|
||||||
|
["<M-p>"] = cmp.mapping.select_prev_item(),
|
||||||
|
|
||||||
|
-- Accept ([y]es) the completion.
|
||||||
|
-- This will auto-import if your LSP supports it.
|
||||||
|
-- This will expand snippets if the LSP sent a snippet.
|
||||||
|
["<M-y>"] = cmp.mapping.confirm({ select = true }),
|
||||||
|
|
||||||
|
-- Manually trigger a completion from nvim-cmp.
|
||||||
|
-- Generally you don't need this, because nvim-cmp will display
|
||||||
|
-- completions whenever it has completion options available.
|
||||||
|
["<M-Space>"] = cmp.mapping.complete({}),
|
||||||
|
|
||||||
|
-- Think of <c-l> as moving to the right of your snippet expansion.
|
||||||
|
-- So if you have a snippet that's like:
|
||||||
|
-- function $name($args)
|
||||||
|
-- $body
|
||||||
|
-- end
|
||||||
|
--
|
||||||
|
-- <c-,> will move you to the right of each of the expansion locations.
|
||||||
|
-- <c-.> is similar, except moving you backwards.
|
||||||
|
["<M-,>"] = cmp.mapping(function()
|
||||||
|
if luasnip.expand_or_locally_jumpable() then
|
||||||
|
luasnip.expand_or_jump()
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
["<M-.>"] = cmp.mapping(function()
|
||||||
|
if luasnip.locally_jumpable(-1) then
|
||||||
|
luasnip.jump(-1)
|
||||||
|
end
|
||||||
|
end, { "i", "s" }),
|
||||||
|
}),
|
||||||
|
sources = {
|
||||||
|
{ name = "nvim_lsp" },
|
||||||
|
{ name = "luasnip" },
|
||||||
|
{ name = "path" },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ -- Highlight, edit, and navigate code
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
build = ":TSUpdate",
|
||||||
|
opts = {
|
||||||
|
ensure_installed = { "bash", "c", "html", "lua", "markdown", "vim", "vimdoc" },
|
||||||
|
auto_install = true,
|
||||||
|
highlight = { enable = true },
|
||||||
|
indent = { enable = true },
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
---@diagnostic disable-next-line: missing-fields
|
||||||
|
require("nvim-treesitter.configs").setup(opts)
|
||||||
|
end,
|
||||||
|
dependencies = {
|
||||||
|
{ "nushell/tree-sitter-nu", build = ":TSUpdate nu" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{ -- Undo tree
|
||||||
|
"mbbill/undotree",
|
||||||
|
event = "VeryLazy",
|
||||||
|
opts = {},
|
||||||
|
config = function()
|
||||||
|
vim.keymap.set("n", "U", vim.cmd.UndotreeToggle, { desc = "[U]ndotree" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{ -- Add Overseer as a task running tool
|
||||||
|
"stevearc/overseer.nvim",
|
||||||
|
event = "VeryLazy",
|
||||||
|
opts = {},
|
||||||
|
config = function()
|
||||||
|
require("overseer").setup()
|
||||||
|
end,
|
||||||
|
keys = require("config.keys").overseer,
|
||||||
|
},
|
||||||
|
{ -- A plugin to integrate tests is helpful, so i'm adding neotest
|
||||||
|
"nvim-neotest/neotest",
|
||||||
|
event = "VeryLazy",
|
||||||
|
dependencies = {
|
||||||
|
"nvim-neotest/nvim-nio",
|
||||||
|
"nvim-lua/plenary.nvim",
|
||||||
|
"antoinemadec/FixCursorHold.nvim",
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- Github copilot, cos its pretty handy
|
||||||
|
{
|
||||||
|
"zbirenbaum/copilot.lua",
|
||||||
|
cmd = "Copilot",
|
||||||
|
event = "InsertEnter",
|
||||||
|
config = function()
|
||||||
|
require("copilot").setup({
|
||||||
|
panel = {
|
||||||
|
auto_refresh = true,
|
||||||
|
layout = {
|
||||||
|
position = "right",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
suggestion = {
|
||||||
|
keymap = {
|
||||||
|
accept = "<M-CR>",
|
||||||
|
accept_word = "<M-w>",
|
||||||
|
accept_line = "<M-f>",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
keys = require("config.keys").copilot,
|
||||||
|
},
|
||||||
|
-- Rust tools like inlay hints are absolutely essential
|
||||||
|
{ "simrat39/rust-tools.nvim", ft = "rust" },
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user