mirror of
https://github.com/pratiktri/dotfiles.git
synced 2026-02-04 08:41:43 +05:30
feat(Neovim): Sensible keymaps, prune plugins, Kickstart.nvim LSP code
This commit is contained in:
@@ -6,39 +6,16 @@
|
|||||||
-- Check all notifications -> :Notifications
|
-- Check all notifications -> :Notifications
|
||||||
-- Check past messages -> :messages
|
-- Check past messages -> :messages
|
||||||
|
|
||||||
-- TIP: Keymap structure:
|
|
||||||
-- b+: [B]buffer Operations
|
|
||||||
-- c+: [C]oding Stuff
|
|
||||||
-- d+: [D]iagnostics
|
|
||||||
-- f+: [F]ile Operations
|
|
||||||
-- g+: [G]it Operations
|
|
||||||
-- l+: [L]ist Things
|
|
||||||
-- n+: [N]eoVim Stuff
|
|
||||||
-- q+: DB [Q]ueries
|
|
||||||
-- r+: [R]efactor Things
|
|
||||||
-- s+: Grep/[S]earch Things
|
|
||||||
-- t+: [T]est runner stuff
|
|
||||||
-- x+: close/dismiss something
|
|
||||||
-- e: explorer
|
|
||||||
-- j: EasyMotion jump
|
|
||||||
-- p: Paste from system clipboard
|
|
||||||
-- y: Copy selected stuff to system clipboard
|
|
||||||
-- u: Open undo-tree side-panel
|
|
||||||
-- v: Open document symbol explorer
|
|
||||||
|
|
||||||
-- TODO:
|
|
||||||
-- Reduce noice timeout
|
|
||||||
|
|
||||||
-- Load keymaps & options
|
-- Load keymaps & options
|
||||||
require("config")
|
require("config")
|
||||||
|
|
||||||
-- `:help lazy.nvim.txt` for more info
|
-- `:help lazy.nvim.txt` for more info
|
||||||
local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim'
|
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||||
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
||||||
local lazyrepo = 'https://github.com/folke/lazy.nvim.git'
|
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
|
||||||
local out = vim.fn.system { 'git', 'clone', '--filter=blob:none', '--branch=stable', lazyrepo, lazypath }
|
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
|
||||||
if vim.v.shell_error ~= 0 then
|
if vim.v.shell_error ~= 0 then
|
||||||
error('Error cloning lazy.nvim:\n' .. out)
|
error("Error cloning lazy.nvim:\n" .. out)
|
||||||
end
|
end
|
||||||
end ---@diagnostic disable-next-line: undefined-field
|
end ---@diagnostic disable-next-line: undefined-field
|
||||||
vim.opt.rtp:prepend(lazypath)
|
vim.opt.rtp:prepend(lazypath)
|
||||||
|
|||||||
@@ -52,6 +52,12 @@ vim.keymap.set({ "i", "x", "n", "s" }, "<C-s>", "<cmd>w<cr><esc>", { desc = "Sav
|
|||||||
vim.keymap.set({ "i", "x", "n", "s" }, "<C-q>", "<cmd>wqa<cr><esc>", { desc = "Save all files and Quit Neovim" })
|
vim.keymap.set({ "i", "x", "n", "s" }, "<C-q>", "<cmd>wqa<cr><esc>", { desc = "Save all files and Quit Neovim" })
|
||||||
|
|
||||||
-- Close Current Buffer
|
-- Close Current Buffer
|
||||||
|
vim.keymap.set({ "n", "v" }, "<leader>bx", function()
|
||||||
|
if vim.bo.modified then
|
||||||
|
vim.cmd.write()
|
||||||
|
end
|
||||||
|
vim.cmd("bdelete")
|
||||||
|
end, { desc = "Save and close current buffer" })
|
||||||
vim.keymap.set({ "n", "v" }, "<leader>xb", function()
|
vim.keymap.set({ "n", "v" }, "<leader>xb", function()
|
||||||
if vim.bo.modified then
|
if vim.bo.modified then
|
||||||
vim.cmd.write()
|
vim.cmd.write()
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ return {
|
|||||||
-- Build Step is needed for regex support in snippets.
|
-- Build Step is needed for regex support in snippets.
|
||||||
-- This step is not supported in many windows environments.
|
-- This step is not supported in many windows environments.
|
||||||
-- Remove the below condition to re-enable on windows.
|
-- Remove the below condition to re-enable on windows.
|
||||||
if vim.fn.has 'win32' == 1 or vim.fn.executable 'make' == 0 then
|
if vim.fn.has("win32") == 1 or vim.fn.executable("make") == 0 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
return 'make install_jsregexp'
|
return "make install_jsregexp"
|
||||||
end)(),
|
end)(),
|
||||||
dependencies = {
|
dependencies = {
|
||||||
-- `friendly-snippets` contains a variety of premade snippets.
|
-- `friendly-snippets` contains a variety of premade snippets.
|
||||||
@@ -27,7 +27,7 @@ return {
|
|||||||
{
|
{
|
||||||
"rafamadriz/friendly-snippets",
|
"rafamadriz/friendly-snippets",
|
||||||
config = function()
|
config = function()
|
||||||
require('luasnip.loaders.from_vscode')
|
require("luasnip.loaders.from_vscode")
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -90,12 +90,12 @@ return {
|
|||||||
if luasnip.expand_or_locally_jumpable() then
|
if luasnip.expand_or_locally_jumpable() then
|
||||||
luasnip.expand_or_jump()
|
luasnip.expand_or_jump()
|
||||||
end
|
end
|
||||||
end, { 'i', 's' }),
|
end, { "i", "s" }),
|
||||||
["<C-h>"] = cmp.mapping(function()
|
["<C-h>"] = cmp.mapping(function()
|
||||||
if luasnip.locally_jumpable(-1) then
|
if luasnip.locally_jumpable(-1) then
|
||||||
luasnip.jump(-1)
|
luasnip.jump(-1)
|
||||||
end
|
end
|
||||||
end, { 'i', 's' }),
|
end, { "i", "s" }),
|
||||||
}),
|
}),
|
||||||
sources = {
|
sources = {
|
||||||
{ name = "nvim_lsp" },
|
{ name = "nvim_lsp" },
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ return {
|
|||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>qq", desc = "Query UI" },
|
{ "<leader>qq", desc = "DB: UI" },
|
||||||
{ "<leader>qq", "<cmd>DBUIToggle<cr>", desc = "Query UI Toggle" },
|
{ "<leader>qq", "<cmd>DBUIToggle<cr>", desc = "DB: UI Toggle" },
|
||||||
{ "<leader>qa", "<cmd>DBUIAddConnection<cr>", desc = "Query: Add Connection" },
|
{ "<leader>qa", "<cmd>DBUIAddConnection<cr>", desc = "DB: Add Connection" },
|
||||||
{ "<leader>qf", "<cmd>DBUIFindBuffer<cr>", desc = "Query: Find Connection" },
|
{ "<leader>qf", "<cmd>DBUIFindBuffer<cr>", desc = "DB: Find Connection" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,77 +1 @@
|
|||||||
-- Primarily focused on configuring the debugger for Go, but can
|
return {}
|
||||||
-- be extended to other languages as well.
|
|
||||||
|
|
||||||
return {
|
|
||||||
"mfussenegger/nvim-dap",
|
|
||||||
cond = require("config.util").is_not_vscode(),
|
|
||||||
dependencies = {
|
|
||||||
-- Creates a beautiful debugger UI
|
|
||||||
"rcarriga/nvim-dap-ui",
|
|
||||||
"nvim-neotest/nvim-nio",
|
|
||||||
|
|
||||||
-- Installs the debug adapters for you
|
|
||||||
"williamboman/mason.nvim",
|
|
||||||
"jay-babu/mason-nvim-dap.nvim",
|
|
||||||
|
|
||||||
-- Add your own debuggers here
|
|
||||||
"leoluz/nvim-dap-go",
|
|
||||||
},
|
|
||||||
config = function()
|
|
||||||
local dap = require("dap")
|
|
||||||
local dapui = require("dapui")
|
|
||||||
|
|
||||||
require("mason-nvim-dap").setup({
|
|
||||||
-- Makes a best effort to setup the various debuggers with reasonable debug configurations
|
|
||||||
automatic_setup = true,
|
|
||||||
|
|
||||||
-- see mason-nvim-dap README for more information
|
|
||||||
handlers = {},
|
|
||||||
|
|
||||||
-- You'll need to check that you have the required things installed online
|
|
||||||
ensure_installed = {
|
|
||||||
-- Update this to ensure that you have the debuggers for the langs you want
|
|
||||||
-- "delve",
|
|
||||||
-- TODO: Rust, C#, TS/JS, Python
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<F5>", dap.continue, { desc = "Debug: Start/Continue" })
|
|
||||||
vim.keymap.set("n", "<F11>", dap.step_into, { desc = "Debug: Step Into" })
|
|
||||||
vim.keymap.set("n", "<S-F11>", dap.step_over, { desc = "Debug: Step Over" })
|
|
||||||
vim.keymap.set("n", "<F12>", dap.step_out, { desc = "Debug: Step Out" })
|
|
||||||
vim.keymap.set("n", "<F9>", dap.toggle_breakpoint, { desc = "Debug: Toggle Breakpoint" })
|
|
||||||
vim.keymap.set("n", "<S-F9>", function()
|
|
||||||
dap.set_breakpoint(vim.fn.input("Breakpoint condition: "))
|
|
||||||
end, { desc = "Debug: Set Breakpoint" })
|
|
||||||
|
|
||||||
-- For more information, see |:help nvim-dap-ui|
|
|
||||||
dapui.setup({
|
|
||||||
-- Set icons to characters that are more likely to work in every terminal.
|
|
||||||
icons = { expanded = "▾", collapsed = "▸", current_frame = "*" },
|
|
||||||
controls = {
|
|
||||||
icons = {
|
|
||||||
pause = "⏸",
|
|
||||||
play = "▶",
|
|
||||||
step_into = "⏎",
|
|
||||||
step_over = "⏭",
|
|
||||||
step_out = "⏮",
|
|
||||||
step_back = "b",
|
|
||||||
run_last = "▶▶",
|
|
||||||
terminate = "⏹",
|
|
||||||
disconnect = "⏏",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
-- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
|
|
||||||
vim.keymap.set("n", "<F7>", dapui.toggle, { desc = "Debug: See last session result." })
|
|
||||||
|
|
||||||
dap.listeners.after.event_initialized["dapui_config"] = dapui.open
|
|
||||||
dap.listeners.before.event_terminated["dapui_config"] = dapui.close
|
|
||||||
dap.listeners.before.event_exited["dapui_config"] = dapui.close
|
|
||||||
|
|
||||||
-- Install golang specific config
|
|
||||||
-- require("dap-go").setup()
|
|
||||||
-- TODO: Rust, C#, TS/JS, Python
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
return {
|
return {
|
||||||
|
|
||||||
|
-- TODO:
|
||||||
|
-- Reduce noice timeout
|
||||||
{ "tpope/vim-repeat" },
|
{ "tpope/vim-repeat" },
|
||||||
|
|
||||||
-- Better code folding
|
-- Better code folding
|
||||||
@@ -16,8 +19,8 @@ return {
|
|||||||
require("statuscol").setup({
|
require("statuscol").setup({
|
||||||
relculright = true,
|
relculright = true,
|
||||||
segments = {
|
segments = {
|
||||||
{ text = { "%s" }, click = "v:lua.ScSa" },
|
{ text = { "%s" }, click = "v:lua.ScSa" },
|
||||||
{ text = { builtin.foldfunc }, click = "v:lua.ScFa" },
|
{ text = { builtin.foldfunc }, click = "v:lua.ScFa" },
|
||||||
{ text = { builtin.lnumfunc, " " }, click = "v:lua.ScLa" },
|
{ text = { builtin.lnumfunc, " " }, click = "v:lua.ScLa" },
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@@ -110,34 +113,6 @@ return {
|
|||||||
main = "ibl",
|
main = "ibl",
|
||||||
},
|
},
|
||||||
|
|
||||||
-- Collection of various small independent plugins/modules
|
|
||||||
{
|
|
||||||
"chasnovski/mini.nvim",
|
|
||||||
config = function()
|
|
||||||
-- Better Around/Inside textobjects
|
|
||||||
--
|
|
||||||
-- Examples:
|
|
||||||
-- - va) - [V]isually select [A]round [)]paren
|
|
||||||
-- - yinq - [Y]ank [I]nside [N]ext [Q]uote
|
|
||||||
-- - 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()
|
|
||||||
|
|
||||||
require("mini.pairs").setup()
|
|
||||||
require("mini.comment").setup()
|
|
||||||
require("mini.completion").setup()
|
|
||||||
|
|
||||||
-- ... and there is more!
|
|
||||||
-- Check out: https://github.com/echasnovski/mini.nvim
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Highlights the current level of indentation, and animates the highlighting.
|
-- Highlights the current level of indentation, and animates the highlighting.
|
||||||
{
|
{
|
||||||
"echasnovski/mini.indentscope",
|
"echasnovski/mini.indentscope",
|
||||||
@@ -162,6 +137,72 @@ return {
|
|||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- mini.nvim: Collection of various small independent plugins/modules
|
||||||
|
{
|
||||||
|
"echasnovski/mini.nvim",
|
||||||
|
version = false,
|
||||||
|
config = function()
|
||||||
|
-- Better Around/Inside textobjects
|
||||||
|
--
|
||||||
|
-- - va) - [V]isually select [A]round [)]paren
|
||||||
|
-- - yinq - [Y]ank [I]nside [N]ext [Q]uote
|
||||||
|
-- - 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()
|
||||||
|
|
||||||
|
-- gc
|
||||||
|
require("mini.comment").setup()
|
||||||
|
|
||||||
|
require("mini.pairs").setup()
|
||||||
|
require("mini.completion").setup()
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Automatically highlights other instances of the word under cursor
|
||||||
|
{
|
||||||
|
"RRethy/vim-illuminate",
|
||||||
|
lazy = false,
|
||||||
|
opts = {
|
||||||
|
delay = 200,
|
||||||
|
large_file_cutoff = 2000,
|
||||||
|
large_file_override = {
|
||||||
|
providers = { "lsp" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
-- Copied from LazyNvim
|
||||||
|
require("illuminate").configure(opts)
|
||||||
|
|
||||||
|
local function map(key, dir, buffer)
|
||||||
|
vim.keymap.set("n", key, function()
|
||||||
|
require("illuminate")["goto_" .. dir .. "_reference"](false)
|
||||||
|
end, { desc = dir:sub(1, 1):upper() .. dir:sub(2) .. " Reference", buffer = buffer })
|
||||||
|
end
|
||||||
|
|
||||||
|
map("]]", "next")
|
||||||
|
map("[[", "prev")
|
||||||
|
|
||||||
|
-- also set it after loading ftplugins, since a lot overwrite [[ and ]]
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
callback = function()
|
||||||
|
local buffer = vim.api.nvim_get_current_buf()
|
||||||
|
map("]]", "next", buffer)
|
||||||
|
map("[[", "prev", buffer)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
keys = {
|
||||||
|
{ "]]", desc = "Next Reference" },
|
||||||
|
{ "[[", desc = "Prev Reference" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
-- Finds and lists all of the TODO, HACK, BUG, etc comment
|
-- Finds and lists all of the TODO, HACK, BUG, etc comment
|
||||||
{
|
{
|
||||||
"folke/todo-comments.nvim",
|
"folke/todo-comments.nvim",
|
||||||
@@ -191,7 +232,7 @@ return {
|
|||||||
},
|
},
|
||||||
|
|
||||||
-- TODO: Include hidden files
|
-- TODO: Include hidden files
|
||||||
{ "<leader>fT", "<cmd>TodoTelescope<cr>", desc = "List Todo/Fix/Fixme" },
|
{ "<leader>fT", "<cmd>TodoTelescope<cr>", desc = "List Todo/Fix/Fixme" },
|
||||||
{ "<leader>ft", "<cmd>TodoTelescope keywords=TODO,FIX,FIXME<cr>", desc = "List Todo" },
|
{ "<leader>ft", "<cmd>TodoTelescope keywords=TODO,FIX,FIXME<cr>", desc = "List Todo" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@@ -243,10 +284,10 @@ return {
|
|||||||
},
|
},
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>dd", "<cmd>Trouble project_errors toggle focus=true<cr>", desc = "Trouble: Document Diagnostics" },
|
{ "<leader>dd", "<cmd>Trouble project_errors toggle focus=true<cr>", desc = "Trouble: Document Diagnostics" },
|
||||||
{ "<leader>dw", "<cmd>Trouble most_severe toggle focus=true<cr>", desc = "Trouble: List Project Diagnostics" },
|
{ "<leader>dw", "<cmd>Trouble most_severe toggle focus=true<cr>", desc = "Trouble: List Project Diagnostics" },
|
||||||
{ "<leader>dl", "<cmd>Trouble loclist toggle focus=true<cr>", desc = "Trouble: Location List" },
|
{ "<leader>dl", "<cmd>Trouble loclist toggle focus=true<cr>", desc = "Trouble: Location List" },
|
||||||
{ "<leader>dq", "<cmd>Trouble quickfix toggle focus=true<cr>", desc = "Trouble: Quickfix List" },
|
{ "<leader>dq", "<cmd>Trouble quickfix toggle focus=true<cr>", desc = "Trouble: Quickfix List" },
|
||||||
{ "gr", "<cmd>Trouble lsp_references toggle focus=true<cr>", desc = "Code: List References" },
|
{ "gr", "<cmd>Trouble lsp_references toggle focus=true<cr>", desc = "Code: List References" },
|
||||||
{
|
{
|
||||||
"[q",
|
"[q",
|
||||||
function()
|
function()
|
||||||
@@ -278,7 +319,6 @@ return {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
-- LspSaga
|
-- LspSaga
|
||||||
{
|
{
|
||||||
"nvimdev/lspsaga.nvim",
|
"nvimdev/lspsaga.nvim",
|
||||||
@@ -297,20 +337,12 @@ return {
|
|||||||
hide_keyword = true,
|
hide_keyword = true,
|
||||||
},
|
},
|
||||||
lightbulb = {
|
lightbulb = {
|
||||||
enable = false,
|
|
||||||
sign = false,
|
|
||||||
virtual_text = false,
|
virtual_text = false,
|
||||||
},
|
},
|
||||||
outline = { auto_preview = false },
|
outline = { auto_preview = false },
|
||||||
})
|
})
|
||||||
|
|
||||||
vim.keymap.set("n", "<leader>cR", "<cmd>Lspsaga finder<cr>", { desc = "Code: Goto References" })
|
-- Keymaps in code-lsp.lua
|
||||||
vim.keymap.set("n", "<leader>cd", "<cmd>Lspsaga peek_definition<cr>",
|
|
||||||
{ desc = "Code: Peek definition: Function" })
|
|
||||||
vim.keymap.set("n", "<leader>cD", "<cmd>Lspsaga peek_type_definition<cr>",
|
|
||||||
{ desc = "Code: Peek definition: Class" })
|
|
||||||
|
|
||||||
vim.keymap.set("n", "K", "<cmd>Lspsaga hover_doc<cr>", { desc = "Hover Documentation" })
|
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -381,7 +413,7 @@ return {
|
|||||||
--
|
--
|
||||||
-- ["g?"] = actions.help(), -- Open mappings help window
|
-- ["g?"] = actions.help(), -- Open mappings help window
|
||||||
{
|
{
|
||||||
"<leader>o",
|
"<leader>O",
|
||||||
function()
|
function()
|
||||||
return require("nvim-navbuddy").open()
|
return require("nvim-navbuddy").open()
|
||||||
end,
|
end,
|
||||||
@@ -389,4 +421,131 @@ return {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- Treesitter
|
||||||
|
{
|
||||||
|
-- nvim-treesitter provides parsers for individual languages
|
||||||
|
-- Output of these parses are fed to the NVIM's native treesitter(vim.treesitter)
|
||||||
|
-- What is fed to the native treesitter is essentially the AST
|
||||||
|
-- This AST is then used for syntax-highlighting and many other operations on the code
|
||||||
|
-- Hence, this plugin is only to make installing parsers easier
|
||||||
|
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
lazy = false,
|
||||||
|
build = ":TSUpdate",
|
||||||
|
init = function(plugin)
|
||||||
|
-- PERF: add nvim-treesitter queries to the rtp and it's custom query predicates early
|
||||||
|
-- This is needed because a bunch of plugins no longer `require("nvim-treesitter")`, which
|
||||||
|
-- no longer trigger the **nvim-treeitter** module to be loaded in time.
|
||||||
|
-- Luckily, the only thing that those plugins need are the custom queries, which we make available
|
||||||
|
-- during startup.
|
||||||
|
require("lazy.core.loader").add_to_rtp(plugin)
|
||||||
|
require("nvim-treesitter.query_predicates")
|
||||||
|
end,
|
||||||
|
dependencies = {
|
||||||
|
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||||
|
config = function()
|
||||||
|
-- When in diff mode, we want to use the default
|
||||||
|
-- vim text objects c & C instead of the treesitter ones.
|
||||||
|
local move = require("nvim-treesitter.textobjects.move") ---@type table<string,fun(...)>
|
||||||
|
local configs = require("nvim-treesitter.configs")
|
||||||
|
for name, fn in pairs(move) do
|
||||||
|
if name:find("goto") == 1 then
|
||||||
|
move[name] = function(q, ...)
|
||||||
|
if vim.wo.diff then
|
||||||
|
local config = configs.get_module("textobjects.move")[name] ---@type table<string,string>
|
||||||
|
for key, query in pairs(config or {}) do
|
||||||
|
if q == query and key:find("[%]%[][cC]") then
|
||||||
|
vim.cmd("normal! " .. key)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return fn(q, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
config = function()
|
||||||
|
-- See `:help nvim-treesitter`
|
||||||
|
-- Defer Treesitter setup after first render to improve startup time of 'nvim {filename}'
|
||||||
|
vim.defer_fn(function()
|
||||||
|
require("nvim-treesitter.configs").setup({
|
||||||
|
ensure_installed = {
|
||||||
|
-- These 2 are required for cmdline
|
||||||
|
"regex",
|
||||||
|
"markdown",
|
||||||
|
"markdown_inline",
|
||||||
|
},
|
||||||
|
|
||||||
|
auto_install = true,
|
||||||
|
highlight = { enable = true },
|
||||||
|
indent = { enable = true },
|
||||||
|
|
||||||
|
incremental_selection = {
|
||||||
|
enable = true,
|
||||||
|
keymaps = {
|
||||||
|
init_selection = "<C-space>",
|
||||||
|
node_incremental = "<C-space>",
|
||||||
|
scope_incremental = "<C-CR>",
|
||||||
|
node_decremental = "<bs>",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
textobjects = {
|
||||||
|
select = {
|
||||||
|
enable = true,
|
||||||
|
lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
|
||||||
|
keymaps = {
|
||||||
|
-- You can use the capture groups defined in textobjects.scm (:TSEditQuery textobjects)
|
||||||
|
["aa"] = { query = "@parameter.outer", desc = "Select around the parameter" },
|
||||||
|
["ia"] = { query = "@parameter.inner", desc = "Select inside the parameter" },
|
||||||
|
["af"] = { query = "@function.outer", desc = "Select around the function" },
|
||||||
|
["if"] = { query = "@function.inner", desc = "Select inside of the function" },
|
||||||
|
["ac"] = { query = "@class.outer", desc = "Select around the class" },
|
||||||
|
["ic"] = { query = "@class.inner", desc = "Select inside of the class" },
|
||||||
|
|
||||||
|
["al"] = { query = "@loop.outer", desc = "Select around the loop" },
|
||||||
|
["il"] = { query = "@loop.inner", desc = "Select inside of the loop" },
|
||||||
|
["as"] = { query = "@scope", query_group = "locals", desc = "Select around the scope" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
move = {
|
||||||
|
-- Jump to next and previous text objects
|
||||||
|
enable = true,
|
||||||
|
goto_next_start = {
|
||||||
|
["]f"] = { query = "@function.outer", desc = "Goto next inner function start" },
|
||||||
|
["]c"] = { query = "@class.outer", desc = "Goto next inner class start" },
|
||||||
|
},
|
||||||
|
goto_next_end = {
|
||||||
|
["]F"] = { query = "@function.outer", desc = "Goto next outer function end" },
|
||||||
|
["]C"] = { query = "@class.outer", desc = "Goto next outer class end" },
|
||||||
|
},
|
||||||
|
goto_previous_start = {
|
||||||
|
["[f"] = { query = "@function.outer", desc = "Goto goto previous inner function start" },
|
||||||
|
["[c"] = { query = "@class.outer", desc = "Previous inner class start" },
|
||||||
|
},
|
||||||
|
goto_previous_end = {
|
||||||
|
["[F"] = { query = "@function.outer", desc = "Goto goto previous outer function start" },
|
||||||
|
["[C"] = { query = "@class.outer", desc = "Goto previous outer class start" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
lsp_interop = {
|
||||||
|
enable = true,
|
||||||
|
border = "none",
|
||||||
|
floating_preview_opts = {},
|
||||||
|
-- peek_definition_code = {
|
||||||
|
-- ["<leader>cd"] = { query = "@function.outer", desc = "Peek function definition on a popup" },
|
||||||
|
-- ["<leader>cD"] = { query = "@class.outer", desc = "Peek class definition on a popup" },
|
||||||
|
-- },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end, 0)
|
||||||
|
end,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,17 +107,4 @@ return {
|
|||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- Git worktree
|
|
||||||
{
|
|
||||||
"ThePrimeagen/git-worktree.nvim",
|
|
||||||
cond = require("config.util").is_not_vscode(),
|
|
||||||
config = function()
|
|
||||||
-- FIX: Open files do NOT get replaced with the changed branch
|
|
||||||
require("telescope").load_extension("git_worktree")
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<leader>gw",
|
|
||||||
"<cmd> lua require('telescope').extensions.git_worktree.git_worktrees()<CR>")
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +1,172 @@
|
|||||||
-- This function gets run when an LSP connects to a particular buffer.
|
|
||||||
-- Define mappings specific for LSP related items.
|
|
||||||
-- It sets the mode, buffer and description for us each time.
|
|
||||||
local on_attach = function(_, bufnr)
|
|
||||||
local nmap = function(keys, func, desc)
|
|
||||||
if desc then
|
|
||||||
desc = "LSP: " .. desc
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc })
|
|
||||||
end
|
|
||||||
|
|
||||||
nmap("<leader>cr", vim.lsp.buf.rename, "Rename Symbol")
|
|
||||||
nmap("<leader>ca", vim.lsp.buf.code_action, "Code Action")
|
|
||||||
nmap("<C-.>", vim.lsp.buf.code_action, "Code Action: VSCode Style")
|
|
||||||
-- See `:help K` for why this keymap
|
|
||||||
-- nmap("K", vim.lsp.buf.hover, "Hover Documentation")
|
|
||||||
-- nmap("<C-k>", vim.lsp.buf.signature_help, "Signature Documentation")
|
|
||||||
|
|
||||||
-- Lesser used LSP functionality
|
|
||||||
nmap("<leader>cS", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Search Workspace Symbols")
|
|
||||||
nmap("<leader>clf", function()
|
|
||||||
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
|
|
||||||
end, "Workspace List Folders")
|
|
||||||
|
|
||||||
-- Create a command `:Format` local to the LSP buffer
|
|
||||||
vim.api.nvim_buf_create_user_command(bufnr, "Format", function(_)
|
|
||||||
vim.lsp.buf.format()
|
|
||||||
end, { desc = "Format current buffer with LSP" })
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
{
|
{
|
||||||
-- LSP Configuration & Plugins
|
-- TODO: Disable it for VSCode
|
||||||
|
--
|
||||||
|
-- Main LSP Configuration
|
||||||
"neovim/nvim-lspconfig",
|
"neovim/nvim-lspconfig",
|
||||||
cond = require("config.util").is_not_vscode(),
|
|
||||||
dependencies = {
|
dependencies = {
|
||||||
-- Automatically install LSPs to stdpath for neovim
|
{ "williamboman/mason.nvim", config = true }, -- NOTE: Must be loaded before dependants
|
||||||
{ "williamboman/mason.nvim", config = true },
|
"williamboman/mason-lspconfig.nvim",
|
||||||
{ "williamboman/mason-lspconfig.nvim" },
|
"WhoIsSethDaniel/mason-tool-installer.nvim",
|
||||||
{ "folke/neodev.nvim" },
|
|
||||||
|
|
||||||
-- Useful status updates for LSP
|
-- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})`
|
||||||
{ "j-hui/fidget.nvim", opts = {} },
|
{ "j-hui/fidget.nvim", opts = {} },
|
||||||
|
|
||||||
-- Allows extra capabilities provided by nvim-cmp
|
-- Allows extra capabilities provided by nvim-cmp
|
||||||
'hrsh7th/cmp-nvim-lsp',
|
"hrsh7th/cmp-nvim-lsp",
|
||||||
},
|
},
|
||||||
},
|
|
||||||
|
|
||||||
{
|
|
||||||
"williamboman/mason-lspconfig.nvim",
|
|
||||||
cond = require("config.util").is_not_vscode(),
|
|
||||||
config = function()
|
config = function()
|
||||||
-- Configure LSP
|
-- Every time a new file is opened that is associated with
|
||||||
|
-- an lsp this function will be executed to configure the current buffer
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
group = vim.api.nvim_create_augroup("lsp-attach", { clear = true }),
|
||||||
|
callback = function(event)
|
||||||
|
local map = function(keys, func, desc, mode)
|
||||||
|
mode = mode or "n"
|
||||||
|
vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc })
|
||||||
|
end
|
||||||
|
|
||||||
-- mason-lspconfig requires that these setup functions are called in this order
|
-- Lspsaga Keymaps
|
||||||
-- BEFORE setting up the servers.
|
-- Hover Documentation
|
||||||
require("mason").setup()
|
-- Press K 2 times to jump into the hover window
|
||||||
local mason_lspconfig = require("mason-lspconfig")
|
-- Place cursor on "View Documentation" gx -> Open the docs on browser
|
||||||
mason_lspconfig.setup()
|
map("K", "<cmd>Lspsaga hover_doc<cr>", "Hover Documentation")
|
||||||
|
map("<F2>", vim.lsp.buf.rename, "Rename Symbol")
|
||||||
|
map("<C-.>", "<cmd>Lspsaga code_action<cr>", "Code Actions")
|
||||||
|
map("<leader>ca", "<cmd>Lspsaga code_action<cr>", "Code Actions")
|
||||||
|
-- e to jump to the symbol under cursor; q to quit
|
||||||
|
map("<leader>o", "<cmd>Lspsaga outline<cr>", "Outline Panel on Left")
|
||||||
|
map("<leader>cr", "<cmd>Lspsaga finder<cr>", "Goto References")
|
||||||
|
map("<leader>cpf", "<cmd>Lspsaga peek_definition<cr>", "Peek definition: Function")
|
||||||
|
map("<leader>cpt", "<cmd>Lspsaga peek_type_definition<cr>", "Peek definition: Class")
|
||||||
|
map("<leader>cpi", "<cmd>Lspsaga finder imp<cr>", "Peek: Implementations")
|
||||||
|
|
||||||
|
-- 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")
|
||||||
|
map("<F12>", require("telescope.builtin").lsp_definitions, "[G]oto [D]efinition")
|
||||||
|
map("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
|
||||||
|
map("gr", require("telescope.builtin").lsp_references, "[G]oto [R]eferences")
|
||||||
|
map("gI", require("telescope.builtin").lsp_implementations, "[G]oto [I]mplementation")
|
||||||
|
|
||||||
|
-- Fuzzy find all the symbols in your current document.
|
||||||
|
-- Symbols are things like variables, functions, types, etc.
|
||||||
|
map("<leader>cs", require("telescope.builtin").lsp_document_symbols, "Search Document Symbols")
|
||||||
|
map("<leader>cS", require("telescope.builtin").lsp_dynamic_workspace_symbols, "Search Workspace Symbols")
|
||||||
|
map("<leader>ci", require("telescope.builtin").lsp_implementations, "Goto Implementation")
|
||||||
|
map("<leader>ct", require("telescope.builtin").lsp_type_definitions, "Goto Type Definition")
|
||||||
|
|
||||||
|
map("<leader>cd", require("telescope.builtin").diagnostics, "List Diagnostics")
|
||||||
|
|
||||||
|
map("<leader>nf", function()
|
||||||
|
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
|
||||||
|
end, "Workspace Folders on Notification")
|
||||||
|
|
||||||
|
-- The following two autocommands are used to highlight references of the
|
||||||
|
-- word under your cursor when your cursor rests there for a little while.
|
||||||
|
-- When you move your cursor, the highlights will be cleared
|
||||||
|
local client = vim.lsp.get_client_by_id(event.data.client_id)
|
||||||
|
if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then
|
||||||
|
local highlight_augroup = vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = false })
|
||||||
|
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, {
|
||||||
|
buffer = event.buf,
|
||||||
|
group = highlight_augroup,
|
||||||
|
callback = vim.lsp.buf.document_highlight,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, {
|
||||||
|
buffer = event.buf,
|
||||||
|
group = highlight_augroup,
|
||||||
|
callback = vim.lsp.buf.clear_references,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("LspDetach", {
|
||||||
|
group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }),
|
||||||
|
callback = function(event2)
|
||||||
|
vim.lsp.buf.clear_references()
|
||||||
|
vim.api.nvim_clear_autocmds({ group = "kickstart-lsp-highlight", buffer = event2.buf })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- TODO: Make inlay_hint enabled by default
|
||||||
|
-- Change this keymap
|
||||||
|
--
|
||||||
|
-- The following code creates a keymap to toggle inlay hints
|
||||||
|
if client and client.supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then
|
||||||
|
map("<leader>ni", function()
|
||||||
|
vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf }))
|
||||||
|
end, "Toggle Inlay Hints")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Change diagnostic symbols in the sign column (gutter)
|
||||||
|
if vim.g.have_nerd_font then
|
||||||
|
local signs = { ERROR = "", WARN = "", INFO = "", HINT = "" }
|
||||||
|
local diagnostic_signs = {}
|
||||||
|
for type, icon in pairs(signs) do
|
||||||
|
diagnostic_signs[vim.diagnostic.severity[type]] = icon
|
||||||
|
end
|
||||||
|
vim.diagnostic.config({ signs = { text = diagnostic_signs } })
|
||||||
|
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.
|
||||||
|
-- Here, we broadcast the new capabilities 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
|
-- Enable the following language servers
|
||||||
-- Add any additional override configuration in the following tables. They will be passed to the `settings` field of the server config
|
-- Add any additional override configuration in the following tables. Available keys are:
|
||||||
-- If you want to override the default filetypes that your language server will attach to you can define the property 'filetypes' to the map in question.
|
-- - 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 = {
|
local servers = {
|
||||||
|
html = { filetypes = { "html", "twig", "hbs" } },
|
||||||
|
cssls = {},
|
||||||
|
jsonls = {},
|
||||||
|
|
||||||
|
bashls = { filetypes = { "sh", "bash", "zsh" } },
|
||||||
|
pylsp = {},
|
||||||
|
ts_ls = {},
|
||||||
lua_ls = {
|
lua_ls = {
|
||||||
Lua = {
|
-- cmd = { ... },
|
||||||
workspace = { checkThirdParty = false },
|
-- filetypes = { ... },
|
||||||
telemetry = { enable = false },
|
-- capabilities = {},
|
||||||
completion = { callSnippet = "Replace" },
|
settings = {
|
||||||
hint = { enable = true },
|
Lua = {
|
||||||
-- NOTE: toggle below to ignore Lua_LS's noisy `missing-fields` warnings
|
workspace = { checkThirdParty = false },
|
||||||
-- diagnostics = { disable = { 'missing-fields' } },
|
telemetry = { enable = false },
|
||||||
|
completion = { callSnippet = "Replace" },
|
||||||
|
hint = { enable = true },
|
||||||
|
diagnostics = { disable = { "missing-fields" } },
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
bashls = { filetypes = { "sh", "bash", "zsh" } },
|
omnisharp = {
|
||||||
html = { filetypes = { "html", "twig", "hbs" } },
|
settings = {
|
||||||
|
DotNet = {
|
||||||
|
enablePackageRestore = true,
|
||||||
|
FormattingOptions = { OrganizeImports = true },
|
||||||
|
RoslynExtensionOptions = {
|
||||||
|
EnableAnalyzerSupport = true,
|
||||||
|
EnableImportCompletion = true,
|
||||||
|
},
|
||||||
|
Sdk = { IncludePrereleases = false },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
sqlls = {},
|
||||||
|
dockerls = {},
|
||||||
|
docker_compose_language_service = {},
|
||||||
|
|
||||||
|
marksman = {},
|
||||||
ltex = {
|
ltex = {
|
||||||
filetypes = { "markdown", "text" },
|
filetypes = { "markdown", "text" },
|
||||||
flags = { debounce_text_changes = 3000 },
|
flags = { debounce_text_changes = 3000 },
|
||||||
@@ -95,52 +186,35 @@ return {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
omnisharp = {
|
|
||||||
-- DotNet = {
|
|
||||||
-- enablePackageRestore = true,
|
|
||||||
-- },
|
|
||||||
settings = {
|
|
||||||
FormattingOptions = {
|
|
||||||
OrganizeImports = true,
|
|
||||||
},
|
|
||||||
RoslynExtensionOptions = {
|
|
||||||
EnableAnalyzerSupport = true,
|
|
||||||
EnableImportCompletion = true,
|
|
||||||
},
|
|
||||||
Sdk = {
|
|
||||||
IncludePrereleases = false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- https://github.com/joe-re/sql-language-server?tab=readme-ov-file#configuration
|
|
||||||
sqlls = {},
|
|
||||||
marksman = {},
|
|
||||||
cssls = {},
|
|
||||||
dockerls = {},
|
|
||||||
docker_compose_language_service = {},
|
|
||||||
jsonls = {},
|
|
||||||
pylsp = {},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
|
-- Ensure the servers and tools above are installed
|
||||||
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
require("mason").setup()
|
||||||
capabilities = require("cmp_nvim_lsp").default_capabilities(capabilities)
|
|
||||||
|
|
||||||
mason_lspconfig.setup({
|
-- Add other tools here that you want Mason to install for you
|
||||||
ensure_installed = vim.tbl_keys(servers),
|
local ensure_installed = vim.tbl_keys(servers or {})
|
||||||
|
vim.list_extend(ensure_installed, {
|
||||||
|
"stylua",
|
||||||
|
"codespell",
|
||||||
|
"bash-language-server",
|
||||||
|
"marksman",
|
||||||
|
"html-lsp",
|
||||||
|
"css-lsp",
|
||||||
|
"dockerfile-language-server",
|
||||||
|
"python-lsp-server",
|
||||||
})
|
})
|
||||||
|
require("mason-tool-installer").setup({ ensure_installed = ensure_installed })
|
||||||
|
|
||||||
mason_lspconfig.setup_handlers({
|
require("mason-lspconfig").setup({
|
||||||
function(server_name)
|
handlers = {
|
||||||
require("lspconfig")[server_name].setup({
|
function(server_name)
|
||||||
inlay_hints = { enabled = true },
|
local server = servers[server_name] or {}
|
||||||
capabilities = capabilities,
|
-- This handles overriding only values explicitly passed
|
||||||
on_attach = on_attach,
|
-- by the server configuration above. Useful when disabling
|
||||||
settings = servers[server_name],
|
-- certain features of an LSP (for example, turning off formatting for ts_ls)
|
||||||
filetypes = (servers[server_name] or {}).filetypes,
|
server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {})
|
||||||
diagnostics = {
|
server.inlay_hints = { enabled = true }
|
||||||
|
server.diagnostics = {
|
||||||
underline = true,
|
underline = true,
|
||||||
update_in_insert = false,
|
update_in_insert = false,
|
||||||
virtual_text = {
|
virtual_text = {
|
||||||
@@ -149,17 +223,10 @@ return {
|
|||||||
prefix = "●",
|
prefix = "●",
|
||||||
},
|
},
|
||||||
severity_sort = true,
|
severity_sort = true,
|
||||||
signs = {
|
}
|
||||||
text = {
|
require("lspconfig")[server_name].setup(server)
|
||||||
[vim.diagnostic.severity.ERROR] = require("config.util").icons.diagnostics.Error,
|
end,
|
||||||
[vim.diagnostic.severity.WARN] = require("config.util").icons.diagnostics.Warn,
|
},
|
||||||
[vim.diagnostic.severity.HINT] = require("config.util").icons.diagnostics.Hint,
|
|
||||||
[vim.diagnostic.severity.INFO] = require("config.util").icons.diagnostics.Info,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
})
|
})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
@@ -169,11 +236,11 @@ return {
|
|||||||
cond = require("config.util").is_not_vscode(),
|
cond = require("config.util").is_not_vscode(),
|
||||||
opts = {
|
opts = {
|
||||||
progress = {
|
progress = {
|
||||||
poll_rate = 1, -- How and when to poll for progress messages
|
poll_rate = 1, -- How and when to poll for progress messages
|
||||||
suppress_on_insert = true, -- Suppress new messages while in insert mode
|
suppress_on_insert = true, -- Suppress new messages while in insert mode
|
||||||
ignore_done_already = true, -- Ignore new tasks that are already complete
|
ignore_done_already = true, -- Ignore new tasks that are already complete
|
||||||
ignore_empty_message = true, -- Ignore new tasks that don't contain a message
|
ignore_empty_message = true, -- Ignore new tasks that don't contain a message
|
||||||
ignore = {}, -- List of LSP servers to ignore
|
ignore = {}, -- List of LSP servers to ignore
|
||||||
|
|
||||||
display = {
|
display = {
|
||||||
render_limit = 1, -- How many LSP messages to show at once
|
render_limit = 1, -- How many LSP messages to show at once
|
||||||
@@ -182,7 +249,7 @@ return {
|
|||||||
},
|
},
|
||||||
|
|
||||||
notification = {
|
notification = {
|
||||||
poll_rate = 2, -- How often to udate and render notifications
|
poll_rate = 2, -- How often to udate and render notifications
|
||||||
filter = vim.log.levels.WARN, -- Minimum notifications level
|
filter = vim.log.levels.WARN, -- Minimum notifications level
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,170 +1,4 @@
|
|||||||
return {
|
return {
|
||||||
{ "easymotion/vim-easymotion" },
|
{ "easymotion/vim-easymotion" },
|
||||||
{ "unblevable/quick-scope" },
|
{ "unblevable/quick-scope" },
|
||||||
|
|
||||||
-- Automatically highlights other instances of the word under cursor
|
|
||||||
{
|
|
||||||
"RRethy/vim-illuminate",
|
|
||||||
lazy = false,
|
|
||||||
opts = {
|
|
||||||
delay = 200,
|
|
||||||
large_file_cutoff = 2000,
|
|
||||||
large_file_override = {
|
|
||||||
providers = { "lsp" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
config = function(_, opts)
|
|
||||||
-- Copied from LazyNvim
|
|
||||||
require("illuminate").configure(opts)
|
|
||||||
|
|
||||||
local function map(key, dir, buffer)
|
|
||||||
vim.keymap.set("n", key, function()
|
|
||||||
require("illuminate")["goto_" .. dir .. "_reference"](false)
|
|
||||||
end, { desc = dir:sub(1, 1):upper() .. dir:sub(2) .. " Reference", buffer = buffer })
|
|
||||||
end
|
|
||||||
|
|
||||||
map("]]", "next")
|
|
||||||
map("[[", "prev")
|
|
||||||
|
|
||||||
-- also set it after loading ftplugins, since a lot overwrite [[ and ]]
|
|
||||||
vim.api.nvim_create_autocmd("FileType", {
|
|
||||||
callback = function()
|
|
||||||
local buffer = vim.api.nvim_get_current_buf()
|
|
||||||
map("]]", "next", buffer)
|
|
||||||
map("[[", "prev", buffer)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
keys = {
|
|
||||||
{ "]]", desc = "Next Reference" },
|
|
||||||
{ "[[", desc = "Prev Reference" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Treesitter
|
|
||||||
{
|
|
||||||
-- nvim-treesitter provides parsers for individual languages
|
|
||||||
-- Output of these parses are fed to the NVIM's native treesitter(vim.treesitter)
|
|
||||||
-- What is fed to the native treesitter is essentially the AST
|
|
||||||
-- This AST is then used for syntax-highlighting and many other operations on the code
|
|
||||||
-- Hence, this plugin is only to make installing parsers easier
|
|
||||||
|
|
||||||
"nvim-treesitter/nvim-treesitter",
|
|
||||||
lazy = false,
|
|
||||||
build = ":TSUpdate",
|
|
||||||
init = function(plugin)
|
|
||||||
-- PERF: add nvim-treesitter queries to the rtp and it's custom query predicates early
|
|
||||||
-- This is needed because a bunch of plugins no longer `require("nvim-treesitter")`, which
|
|
||||||
-- no longer trigger the **nvim-treeitter** module to be loaded in time.
|
|
||||||
-- Luckily, the only thing that those plugins need are the custom queries, which we make available
|
|
||||||
-- during startup.
|
|
||||||
require("lazy.core.loader").add_to_rtp(plugin)
|
|
||||||
require("nvim-treesitter.query_predicates")
|
|
||||||
end,
|
|
||||||
dependencies = {
|
|
||||||
"nvim-treesitter/nvim-treesitter-textobjects",
|
|
||||||
config = function()
|
|
||||||
-- When in diff mode, we want to use the default
|
|
||||||
-- vim text objects c & C instead of the treesitter ones.
|
|
||||||
local move = require("nvim-treesitter.textobjects.move") ---@type table<string,fun(...)>
|
|
||||||
local configs = require("nvim-treesitter.configs")
|
|
||||||
for name, fn in pairs(move) do
|
|
||||||
if name:find("goto") == 1 then
|
|
||||||
move[name] = function(q, ...)
|
|
||||||
if vim.wo.diff then
|
|
||||||
local config = configs.get_module("textobjects.move")[name] ---@type table<string,string>
|
|
||||||
for key, query in pairs(config or {}) do
|
|
||||||
if q == query and key:find("[%]%[][cC]") then
|
|
||||||
vim.cmd("normal! " .. key)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return fn(q, ...)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
config = function()
|
|
||||||
-- See `:help nvim-treesitter`
|
|
||||||
-- Defer Treesitter setup after first render to improve startup time of 'nvim {filename}'
|
|
||||||
vim.defer_fn(function()
|
|
||||||
require("nvim-treesitter.configs").setup({
|
|
||||||
ensure_installed = {
|
|
||||||
-- These 2 are required for cmdline
|
|
||||||
"regex",
|
|
||||||
"markdown",
|
|
||||||
"markdown_inline",
|
|
||||||
},
|
|
||||||
|
|
||||||
auto_install = true,
|
|
||||||
highlight = { enable = true },
|
|
||||||
indent = { enable = true },
|
|
||||||
|
|
||||||
incremental_selection = {
|
|
||||||
enable = true,
|
|
||||||
keymaps = {
|
|
||||||
init_selection = "<C-space>",
|
|
||||||
node_incremental = "<C-space>",
|
|
||||||
scope_incremental = "<C-CR>",
|
|
||||||
node_decremental = "<bs>",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
textobjects = {
|
|
||||||
select = {
|
|
||||||
enable = true,
|
|
||||||
lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
|
|
||||||
keymaps = {
|
|
||||||
-- You can use the capture groups defined in textobjects.scm (:TSEditQuery textobjects)
|
|
||||||
["aa"] = { query = "@parameter.outer", desc = "Select around the parameter" },
|
|
||||||
["ia"] = { query = "@parameter.inner", desc = "Select inside the parameter" },
|
|
||||||
["af"] = { query = "@function.outer", desc = "Select around the function" },
|
|
||||||
["if"] = { query = "@function.inner", desc = "Select inside of the function" },
|
|
||||||
["ac"] = { query = "@class.outer", desc = "Select around the class" },
|
|
||||||
["ic"] = { query = "@class.inner", desc = "Select inside of the class" },
|
|
||||||
|
|
||||||
["al"] = { query = "@loop.outer", desc = "Select around the loop" },
|
|
||||||
["il"] = { query = "@loop.inner", desc = "Select inside of the loop" },
|
|
||||||
["as"] = { query = "@scope", query_group = "locals", desc = "Select around the scope" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
move = {
|
|
||||||
-- Jump to next and previous text objects
|
|
||||||
enable = true,
|
|
||||||
goto_next_start = {
|
|
||||||
["]f"] = { query = "@function.outer", desc = "Goto next inner function start" },
|
|
||||||
["]c"] = { query = "@class.outer", desc = "Goto next inner class start" },
|
|
||||||
},
|
|
||||||
goto_next_end = {
|
|
||||||
["]F"] = { query = "@function.outer", desc = "Goto next outer function end" },
|
|
||||||
["]C"] = { query = "@class.outer", desc = "Goto next outer class end" },
|
|
||||||
},
|
|
||||||
goto_previous_start = {
|
|
||||||
["[f"] = { query = "@function.outer", desc = "Goto goto previous inner function start" },
|
|
||||||
["[c"] = { query = "@class.outer", desc = "Previous inner class start" },
|
|
||||||
},
|
|
||||||
goto_previous_end = {
|
|
||||||
["[F"] = { query = "@function.outer", desc = "Goto goto previous outer function start" },
|
|
||||||
["[C"] = { query = "@class.outer", desc = "Goto previous outer class start" },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
lsp_interop = {
|
|
||||||
enable = true,
|
|
||||||
border = "none",
|
|
||||||
floating_preview_opts = {},
|
|
||||||
-- peek_definition_code = {
|
|
||||||
-- ["<leader>cd"] = { query = "@function.outer", desc = "Peek function definition on a popup" },
|
|
||||||
-- ["<leader>cD"] = { query = "@class.outer", desc = "Peek class definition on a popup" },
|
|
||||||
-- },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end, 0)
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ return {
|
|||||||
cond = require("config.util").is_not_vscode(),
|
cond = require("config.util").is_not_vscode(),
|
||||||
branch = "v3.x",
|
branch = "v3.x",
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader><tab>", "<CMD>Neotree toggle left<CR>", desc = "Open NeoTree Explorer at Git root", remap = true },
|
{ "<leader><tab>", "<CMD>Neotree toggle left<CR>", desc = "Open NeoTree Explorer at Git root", remap = true },
|
||||||
{ "<leader>e", "<CMD>Neotree toggle float<CR>", desc = "Open NeoTree on Floating Window", remap = true },
|
{ "<leader>e", "<CMD>Neotree toggle float<CR>", desc = "Open NeoTree on Floating Window", remap = true },
|
||||||
|
|
||||||
{
|
{
|
||||||
"<leader>be",
|
"<leader>be",
|
||||||
@@ -46,10 +46,10 @@ return {
|
|||||||
},
|
},
|
||||||
window = {
|
window = {
|
||||||
position = "left",
|
position = "left",
|
||||||
width = 30, -- Saner window size
|
width = 30, -- Saner window size
|
||||||
mappings = {
|
mappings = {
|
||||||
["s"] = "open_split", -- horizontal split
|
["s"] = "open_split", -- horizontal split
|
||||||
["v"] = "open_vsplit", -- vertical split
|
["v"] = "open_vsplit", -- vertical split
|
||||||
["Y"] = function(state) -- Copy file's path to + register
|
["Y"] = function(state) -- Copy file's path to + register
|
||||||
local node = state.tree:get_node()
|
local node = state.tree:get_node()
|
||||||
local path = node:get_id()
|
local path = node:get_id()
|
||||||
@@ -59,7 +59,7 @@ return {
|
|||||||
},
|
},
|
||||||
default_component_configs = {
|
default_component_configs = {
|
||||||
indent = {
|
indent = {
|
||||||
indent_size = 2, -- Compact tree display
|
indent_size = 2, -- Compact tree display
|
||||||
with_expanders = true, -- if nil and file nesting is enabled, will enable expanders
|
with_expanders = true, -- if nil and file nesting is enabled, will enable expanders
|
||||||
expander_collapsed = "",
|
expander_collapsed = "",
|
||||||
expander_expanded = "",
|
expander_expanded = "",
|
||||||
@@ -79,7 +79,7 @@ return {
|
|||||||
local events = require("neo-tree.events")
|
local events = require("neo-tree.events")
|
||||||
opts.event_handlers = opts.event_handlers or {}
|
opts.event_handlers = opts.event_handlers or {}
|
||||||
vim.list_extend(opts.event_handlers, {
|
vim.list_extend(opts.event_handlers, {
|
||||||
{ event = events.FILE_MOVED, handler = on_move },
|
{ event = events.FILE_MOVED, handler = on_move },
|
||||||
{ event = events.FILE_RENAMED, handler = on_move },
|
{ event = events.FILE_RENAMED, handler = on_move },
|
||||||
})
|
})
|
||||||
require("neo-tree").setup(opts)
|
require("neo-tree").setup(opts)
|
||||||
@@ -110,8 +110,9 @@ return {
|
|||||||
},
|
},
|
||||||
"nvim-telescope/telescope-ui-select.nvim",
|
"nvim-telescope/telescope-ui-select.nvim",
|
||||||
{
|
{
|
||||||
"nvim-tree/nvim-web-devicons", enabled = vim.g.have_nerd_font
|
"nvim-tree/nvim-web-devicons",
|
||||||
}
|
enabled = vim.g.have_nerd_font,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
config = function()
|
config = function()
|
||||||
-- NOTE: Search in hidden files trick taken from: https://stackoverflow.com/a/75500661/11057673
|
-- NOTE: Search in hidden files trick taken from: https://stackoverflow.com/a/75500661/11057673
|
||||||
@@ -158,9 +159,7 @@ return {
|
|||||||
pcall(require("telescope").load_extension, "fzf")
|
pcall(require("telescope").load_extension, "fzf")
|
||||||
pcall(require("telescope").load_extension, "ui-select")
|
pcall(require("telescope").load_extension, "ui-select")
|
||||||
|
|
||||||
-- Special Things: Telescope
|
-- Keymaps for LSP Things -> In code-lsp.lua
|
||||||
vim.keymap.set("n", "<leader>nc", require("telescope.builtin").colorscheme,
|
|
||||||
{ desc = "List Neovim Colorschemes (with preview)" })
|
|
||||||
|
|
||||||
-- Grep things -> Search
|
-- Grep things -> Search
|
||||||
vim.keymap.set("n", "<leader>sb", function()
|
vim.keymap.set("n", "<leader>sb", function()
|
||||||
@@ -169,55 +168,31 @@ return {
|
|||||||
prompt_title = "Live Grep in Open Files",
|
prompt_title = "Live Grep in Open Files",
|
||||||
})
|
})
|
||||||
end, { desc = "Search Open Buffers" })
|
end, { desc = "Search Open Buffers" })
|
||||||
vim.keymap.set("n", "<leader>sg", require("telescope.builtin").live_grep,
|
vim.keymap.set("n", "<leader>sg", require("telescope.builtin").live_grep, { desc = "Search/LiveGrep the Project" })
|
||||||
{ desc = "Search/LiveGrep the Project" })
|
vim.keymap.set("n", "<C-a-f>", require("telescope.builtin").live_grep, { desc = "Search/LiveGrep the Project" })
|
||||||
vim.keymap.set("n", "<C-a-f>", require("telescope.builtin").live_grep,
|
vim.keymap.set("n", "<leader>sw", require("telescope.builtin").grep_string, { desc = "Search current Word in Project" })
|
||||||
{ desc = "Search/LiveGrep the Project" })
|
|
||||||
vim.keymap.set("n", "<leader>sw", require("telescope.builtin").grep_string,
|
|
||||||
{ desc = "Search current Word in Project" })
|
|
||||||
|
|
||||||
-- List
|
-- List
|
||||||
vim.keymap.set("n", "<leader>fb", require("telescope.builtin").buffers, { desc = "List Buffers" })
|
vim.keymap.set("n", "<leader>fb", require("telescope.builtin").buffers, { desc = "List Buffers" })
|
||||||
vim.keymap.set("n", "<leader>fc", require("telescope.builtin").command_history,
|
|
||||||
{ desc = "List NeoVIM Command History" })
|
|
||||||
vim.keymap.set("n", "<C-a-p>", require("telescope.builtin").find_files, { desc = "List & Search Files" })
|
vim.keymap.set("n", "<C-a-p>", require("telescope.builtin").find_files, { desc = "List & Search Files" })
|
||||||
vim.keymap.set("n", "<leader>ff", require("telescope.builtin").find_files, { desc = "List & Search Files" })
|
vim.keymap.set("n", "<leader>ff", require("telescope.builtin").find_files, { desc = "List & Search Files" })
|
||||||
vim.keymap.set("n", "<leader>fn", require("telescope.builtin").help_tags,
|
vim.keymap.set("n", "<leader>fq", require("telescope.builtin").quickfixhistory, { desc = "List Quickfix History" })
|
||||||
{ desc = "List & Search NeoVIM Help" })
|
|
||||||
vim.keymap.set("n", "<leader>fq", require("telescope.builtin").quickfixhistory,
|
|
||||||
{ desc = "List Quickfix History" })
|
|
||||||
vim.keymap.set("n", "<leader>fs", require("telescope.builtin").search_history,
|
|
||||||
{ desc = "List Search History" })
|
|
||||||
|
|
||||||
-- Git
|
-- Git
|
||||||
vim.keymap.set("n", "<leader>gfb", require("telescope.builtin").git_branches, { desc = "List Git Branches" })
|
vim.keymap.set("n", "<leader>gfb", require("telescope.builtin").git_branches, { desc = "List Git Branches" })
|
||||||
vim.keymap.set("n", "<leader>gfc", require("telescope.builtin").git_commits, { desc = "List Git Commits" })
|
vim.keymap.set("n", "<leader>gfc", require("telescope.builtin").git_commits, { desc = "List Git Commits" })
|
||||||
|
|
||||||
-- LSP Things -> Coding
|
-- Neovim Things
|
||||||
vim.keymap.set("n", "<leader>cld", require("telescope.builtin").diagnostics,
|
vim.keymap.set("n", "<leader>ns", require("telescope.builtin").search_history, { desc = "List Search History" })
|
||||||
{ desc = "Code: List Diagnostics" })
|
vim.keymap.set("n", "<leader>nn", require("telescope.builtin").help_tags, { desc = "List & Search NeoVIM Help" })
|
||||||
|
vim.keymap.set("n", "<leader>nc", require("telescope.builtin").command_history, { desc = "List NeoVIM Command History" })
|
||||||
vim.keymap.set("n", "<leader>ci", require("telescope.builtin").lsp_implementations,
|
vim.keymap.set("n", "<leader>nC", require("telescope.builtin").colorscheme, { desc = "List Neovim Colorschemes (with preview)" })
|
||||||
{ desc = "Code: Goto Implementation" })
|
|
||||||
|
|
||||||
vim.keymap.set("n", "gd", require("telescope.builtin").lsp_definitions, { desc = "Code: Goto Definition" })
|
|
||||||
vim.keymap.set("n", "<leader>ct", require("telescope.builtin").lsp_type_definitions,
|
|
||||||
{ desc = "Code: Goto Type Definition" })
|
|
||||||
-- vim.keymap.set("n", "<leader>cgD", vim.lsp.buf.declaration, { desc = "Goto Declaration" })
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<leader>cR", require("telescope.builtin").lsp_references,
|
|
||||||
{ desc = "Code: Goto References" })
|
|
||||||
-- vim.keymap.set("n", "<leader>cR", require("telescope.builtin").lsp_references, { desc = "Code: List References for word under cursor" })
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<leader>O", require("telescope.builtin").lsp_workspace_symbols,
|
|
||||||
{ desc = "Code: Search Workspace Symbols" })
|
|
||||||
|
|
||||||
vim.keymap.set("n", "<leader>nk", require("telescope.builtin").keymaps,
|
|
||||||
{ desc = "List & Search NeoVIM Keymaps" })
|
|
||||||
vim.keymap.set("n", "<leader>nm", require("telescope.builtin").man_pages,
|
|
||||||
{ desc = "List & Search System Man Pages" })
|
|
||||||
vim.keymap.set("n", "<leader>nn", "<cmd>Telescope notify<cr>", { desc = "List past notifications" })
|
vim.keymap.set("n", "<leader>nn", "<cmd>Telescope notify<cr>", { desc = "List past notifications" })
|
||||||
vim.keymap.set("n", "<leader>nv", require("telescope.builtin").vim_options, { desc = "List Vim Options" })
|
|
||||||
|
-- Help
|
||||||
|
vim.keymap.set("n", "<leader>hk", require("telescope.builtin").keymaps, { desc = "Help: NeoVIM Keymaps" })
|
||||||
|
vim.keymap.set("n", "<leader>hm", require("telescope.builtin").man_pages, { desc = "Help: System Man Pages" })
|
||||||
|
vim.keymap.set("n", "<leader>hv", require("telescope.builtin").vim_options, { desc = "Help: Vim Options" })
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,11 +39,11 @@ return {
|
|||||||
},
|
},
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle buffer-pin" },
|
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle buffer-pin" },
|
||||||
{ "<leader>bj", "<Cmd>BufferLinePick<CR>", desc = "Choose and jump to a buffer" },
|
{ "<leader>bX", "<Cmd>BufferLineCloseOthers<CR>", desc = "Close other buffers" },
|
||||||
{ "<leader>xo", "<Cmd>BufferLineCloseOthers<CR>", desc = "Close other buffers" },
|
{ "<leader>xo", "<Cmd>BufferLineCloseOthers<CR>", desc = "Close other buffers" },
|
||||||
{ "[b", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev buffer" },
|
{ "[b", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev buffer" },
|
||||||
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next buffer" },
|
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next buffer" },
|
||||||
},
|
},
|
||||||
opts = {
|
opts = {
|
||||||
options = {
|
options = {
|
||||||
@@ -69,6 +69,11 @@ return {
|
|||||||
local buf_line = require("bufferline")
|
local buf_line = require("bufferline")
|
||||||
buf_line.setup(opts)
|
buf_line.setup(opts)
|
||||||
|
|
||||||
|
-- <alt+1> ... <alt+9> to switch to a buffer
|
||||||
|
for i = 1, 9 do
|
||||||
|
vim.keymap.set("n", string.format("<A-%s>", i), string.format("<cmd>BufferLineGoToBuffer %s<CR>", i), { noremap = true, silent = true })
|
||||||
|
end
|
||||||
|
|
||||||
-- Fix bufferline when restoring a session
|
-- Fix bufferline when restoring a session
|
||||||
vim.api.nvim_create_autocmd("BufAdd", {
|
vim.api.nvim_create_autocmd("BufAdd", {
|
||||||
callback = function()
|
callback = function()
|
||||||
@@ -288,7 +293,7 @@ return {
|
|||||||
},
|
},
|
||||||
|
|
||||||
lualine_y = {
|
lualine_y = {
|
||||||
{ "progress", separator = " ", padding = { left = 1, right = 0 } },
|
{ "progress", separator = " ", padding = { left = 1, right = 0 } },
|
||||||
{ "location", padding = { left = 0, right = 1 } },
|
{ "location", padding = { left = 0, right = 1 } },
|
||||||
},
|
},
|
||||||
lualine_z = {
|
lualine_z = {
|
||||||
|
|||||||
@@ -1,180 +1,4 @@
|
|||||||
local M = {}
|
|
||||||
---@type table<string, table<string, string[]>>
|
|
||||||
M.dials_by_ft = {}
|
|
||||||
|
|
||||||
---@param increment boolean
|
|
||||||
---@param g? boolean
|
|
||||||
function M.dial(increment, g)
|
|
||||||
local mode = vim.fn.mode(true)
|
|
||||||
-- Use visual commands for VISUAL 'v', VISUAL LINE 'V' and VISUAL BLOCK '\22'
|
|
||||||
local is_visual = mode == "v" or mode == "V" or mode == "\22"
|
|
||||||
local func = (increment and "inc" or "dec") .. (g and "_g" or "_") .. (is_visual and "visual" or "normal")
|
|
||||||
local group = M.dials_by_ft[vim.bo.filetype] or "default"
|
|
||||||
return require("dial.map")[func](group)
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
-- Better increment/decrement with <Ctrl+a>
|
|
||||||
{
|
|
||||||
"monaqa/dial.nvim",
|
|
||||||
-- stylua: ignore
|
|
||||||
keys = {
|
|
||||||
{ "<C-a>", function() return M.dial(true) end, expr = true, desc = "Increment", mode = { "n", "v" } },
|
|
||||||
{ "<C-x>", function() return M.dial(false) end, expr = true, desc = "Decrement", mode = { "n", "v" } },
|
|
||||||
{ "g<C-a>", function() return M.dial(true, true) end, expr = true, desc = "Increment", mode = { "n", "v" } },
|
|
||||||
{ "g<C-x>", function() return M.dial(false, true) end, expr = true, desc = "Decrement", mode = { "n", "v" } },
|
|
||||||
},
|
|
||||||
opts = function()
|
|
||||||
local augend = require("dial.augend")
|
|
||||||
|
|
||||||
local logical_alias = augend.constant.new({
|
|
||||||
elements = { "&&", "||" },
|
|
||||||
word = false,
|
|
||||||
cyclic = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
local ordinal_numbers = augend.constant.new({
|
|
||||||
-- elements through which we cycle. When we increment, we go down
|
|
||||||
-- On decrement we go up
|
|
||||||
elements = {
|
|
||||||
"first",
|
|
||||||
"second",
|
|
||||||
"third",
|
|
||||||
"fourth",
|
|
||||||
"fifth",
|
|
||||||
"sixth",
|
|
||||||
"seventh",
|
|
||||||
"eighth",
|
|
||||||
"ninth",
|
|
||||||
"tenth",
|
|
||||||
},
|
|
||||||
-- if true, it only matches strings with word boundary. firstDate wouldn't work for example
|
|
||||||
word = false,
|
|
||||||
-- do we cycle back and forth (tenth to first on increment, first to tenth on decrement).
|
|
||||||
-- Otherwise nothing will happen when there are no further values
|
|
||||||
cyclic = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
local weekdays = augend.constant.new({
|
|
||||||
elements = {
|
|
||||||
"Monday",
|
|
||||||
"Tuesday",
|
|
||||||
"Wednesday",
|
|
||||||
"Thursday",
|
|
||||||
"Friday",
|
|
||||||
"Saturday",
|
|
||||||
"Sunday",
|
|
||||||
},
|
|
||||||
word = true,
|
|
||||||
cyclic = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
local months = augend.constant.new({
|
|
||||||
elements = {
|
|
||||||
"January",
|
|
||||||
"February",
|
|
||||||
"March",
|
|
||||||
"April",
|
|
||||||
"May",
|
|
||||||
"June",
|
|
||||||
"July",
|
|
||||||
"August",
|
|
||||||
"September",
|
|
||||||
"October",
|
|
||||||
"November",
|
|
||||||
"December",
|
|
||||||
},
|
|
||||||
word = true,
|
|
||||||
cyclic = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
local capitalized_boolean = augend.constant.new({
|
|
||||||
elements = {
|
|
||||||
"True",
|
|
||||||
"False",
|
|
||||||
},
|
|
||||||
word = true,
|
|
||||||
cyclic = true,
|
|
||||||
})
|
|
||||||
|
|
||||||
return {
|
|
||||||
dials_by_ft = {
|
|
||||||
css = "css",
|
|
||||||
javascript = "typescript",
|
|
||||||
javascriptreact = "typescript",
|
|
||||||
json = "json",
|
|
||||||
lua = "lua",
|
|
||||||
markdown = "markdown",
|
|
||||||
python = "python",
|
|
||||||
sass = "css",
|
|
||||||
scss = "css",
|
|
||||||
typescript = "typescript",
|
|
||||||
typescriptreact = "typescript",
|
|
||||||
cs = "csharp",
|
|
||||||
},
|
|
||||||
groups = {
|
|
||||||
default = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative decimal number (0, 1, 2, 3, ...)
|
|
||||||
augend.integer.alias.hex, -- nonnegative hex number (0x01, 0x1a1f, etc.)
|
|
||||||
augend.date.alias["%Y/%m/%d"], -- date (2022/02/19, etc.)
|
|
||||||
},
|
|
||||||
typescript = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative and negative decimal number
|
|
||||||
augend.constant.alias.bool, -- boolean value (true <-> false)
|
|
||||||
logical_alias,
|
|
||||||
augend.constant.new({ elements = { "let", "const" } }),
|
|
||||||
ordinal_numbers,
|
|
||||||
weekdays,
|
|
||||||
months,
|
|
||||||
},
|
|
||||||
css = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative and negative decimal number
|
|
||||||
augend.hexcolor.new({
|
|
||||||
case = "lower",
|
|
||||||
}),
|
|
||||||
augend.hexcolor.new({
|
|
||||||
case = "upper",
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
markdown = {
|
|
||||||
augend.misc.alias.markdown_header,
|
|
||||||
ordinal_numbers,
|
|
||||||
weekdays,
|
|
||||||
months,
|
|
||||||
},
|
|
||||||
json = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative and negative decimal number
|
|
||||||
augend.semver.alias.semver, -- versioning (v1.1.2)
|
|
||||||
},
|
|
||||||
lua = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative and negative decimal number
|
|
||||||
augend.constant.alias.bool, -- boolean value (true <-> false)
|
|
||||||
augend.constant.new({
|
|
||||||
elements = { "and", "or" },
|
|
||||||
word = true, -- if false, "sand" is incremented into "sor", "doctor" into "doctand", etc.
|
|
||||||
cyclic = true, -- "or" is incremented into "and".
|
|
||||||
}),
|
|
||||||
ordinal_numbers,
|
|
||||||
weekdays,
|
|
||||||
months,
|
|
||||||
},
|
|
||||||
python = {
|
|
||||||
augend.integer.alias.decimal, -- nonnegative and negative decimal number
|
|
||||||
capitalized_boolean,
|
|
||||||
logical_alias,
|
|
||||||
ordinal_numbers,
|
|
||||||
weekdays,
|
|
||||||
months,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
config = function(_, opts)
|
|
||||||
require("dial.config").augends:register_group(opts.groups)
|
|
||||||
M.dials_by_ft = opts.dials_by_ft
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Navigate between NVIM & Tmux splits seamlessly
|
-- Navigate between NVIM & Tmux splits seamlessly
|
||||||
{
|
{
|
||||||
"christoomey/vim-tmux-navigator",
|
"christoomey/vim-tmux-navigator",
|
||||||
@@ -231,50 +55,11 @@ return {
|
|||||||
|
|
||||||
{
|
{
|
||||||
"folke/which-key.nvim",
|
"folke/which-key.nvim",
|
||||||
|
cond = require("config.util").is_not_vscode(),
|
||||||
dependencies = {
|
dependencies = {
|
||||||
"echasnovski/mini.icons",
|
"echasnovski/mini.icons",
|
||||||
},
|
},
|
||||||
opts = {
|
opts = {
|
||||||
defaults = {
|
|
||||||
["<leader>r"] = { name = "+refactor" },
|
|
||||||
},
|
|
||||||
icons = {
|
|
||||||
-- set icon mappings to true if you have a Nerd Font
|
|
||||||
mappings = vim.g.have_nerd_font,
|
|
||||||
-- If you are using a Nerd Font: set icons.keys to an empty table which will use the
|
|
||||||
-- default which-key.nvim defined Nerd Font icons, otherwise define a string table
|
|
||||||
keys = vim.g.have_nerd_font and {} or {
|
|
||||||
Up = '<Up> ',
|
|
||||||
Down = '<Down> ',
|
|
||||||
Lefj = '<Left> ',
|
|
||||||
Right = '<Right> ',
|
|
||||||
C = '<C-…> ',
|
|
||||||
M = '<M-…> ',
|
|
||||||
D = '<D-…> ',
|
|
||||||
S = '<S-…> ',
|
|
||||||
CR = '<CR> ',
|
|
||||||
Esc = '<Esc> ',
|
|
||||||
ScrollWheelDown = '<ScrollWheelDown> ',
|
|
||||||
ScrollWheelUp = '<ScrollWheelUp> ',
|
|
||||||
NL = '<NL> ',
|
|
||||||
BS = '<BS> ',
|
|
||||||
Space = '<Space> ',
|
|
||||||
Tab = '<Tab> ',
|
|
||||||
F1 = '<F1>',
|
|
||||||
F2 = '<F2>',
|
|
||||||
F3 = '<F3>',
|
|
||||||
F4 = '<F4>',
|
|
||||||
F5 = '<F5>',
|
|
||||||
F6 = '<F6>',
|
|
||||||
F7 = '<F7>',
|
|
||||||
F8 = '<F8>',
|
|
||||||
F9 = '<F9>',
|
|
||||||
F10 = '<F10>',
|
|
||||||
F11 = '<F11>',
|
|
||||||
F12 = '<F12>',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
-- Document existing key chains
|
-- Document existing key chains
|
||||||
spec = {
|
spec = {
|
||||||
{ "<leader>c", group = "Code" },
|
{ "<leader>c", group = "Code" },
|
||||||
@@ -283,8 +68,9 @@ return {
|
|||||||
{ "<leader>f", group = "File Operations" },
|
{ "<leader>f", group = "File Operations" },
|
||||||
{ "<leader>g", group = "Git" },
|
{ "<leader>g", group = "Git" },
|
||||||
{ "<leader>f", group = "Find and List Things" },
|
{ "<leader>f", group = "Find and List Things" },
|
||||||
|
{ "<leader>h", group = "Help" },
|
||||||
{ "<leader>n", group = "NVIM Things" },
|
{ "<leader>n", group = "NVIM Things" },
|
||||||
{ "<leader>q", group = "Database Query" },
|
{ "<leader>q", group = "Database" },
|
||||||
{ "<leader>s", group = "Search/Grep Things" },
|
{ "<leader>s", group = "Search/Grep Things" },
|
||||||
{ "<leader>t", group = "Unit Test Operations" },
|
{ "<leader>t", group = "Unit Test Operations" },
|
||||||
{ "<leader>x", group = "Delete/Remove Something" },
|
{ "<leader>x", group = "Delete/Remove Something" },
|
||||||
@@ -296,6 +82,7 @@ return {
|
|||||||
-- TIP: autocmd to autoload sessions at: ../config/autocmd.lua
|
-- TIP: autocmd to autoload sessions at: ../config/autocmd.lua
|
||||||
{
|
{
|
||||||
"folke/persistence.nvim",
|
"folke/persistence.nvim",
|
||||||
|
cond = require("config.util").is_not_vscode(),
|
||||||
event = "BufReadPre",
|
event = "BufReadPre",
|
||||||
opts = {
|
opts = {
|
||||||
-- Session files stored at: ~/.config/nvim/sessions/
|
-- Session files stored at: ~/.config/nvim/sessions/
|
||||||
|
|||||||
Reference in New Issue
Block a user