Merge branch 'LazyVim:main' into main

This commit is contained in:
Rubin Bhandari 2024-05-17 15:43:16 +05:45 committed by GitHub
commit a5dbf0ad99
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 799 additions and 451 deletions

View file

@ -1,5 +1,50 @@
# Changelog # Changelog
## [11.0.1](https://github.com/LazyVim/LazyVim/compare/v11.0.0...v11.0.1) (2024-05-16)
### Bug Fixes
* **news.md:** correct phrase to disable `inlay_hints` ([58cf6f9](https://github.com/LazyVim/LazyVim/commit/58cf6f971b78170aef5f26ccb79149213f4a692d))
* **treesitter-rewrite:** show error in Extras only when enabled ([#3178](https://github.com/LazyVim/LazyVim/issues/3178)) ([639dfce](https://github.com/LazyVim/LazyVim/commit/639dfce0101cc6c0174e116872df91ccb30cb597))
* **util:** get opts from parsing specs instead of plugins ([14872fa](https://github.com/LazyVim/LazyVim/commit/14872fa816fd770eba0f2b5efc69d5b29d4073fb))
## [11.0.0](https://github.com/LazyVim/LazyVim/compare/v10.25.0...v11.0.0) (2024-05-16)
### ⚠ BREAKING CHANGES
* **util:** move `vim-startuptime` to an extra
* **coding:** move `mini.ai` to an extra
* **mini.surround:** move `mini.surround` to an extra
* **ui:** move `mini.indentscope` to an extra
* **ui:** moved treesitter-context to an extra. No longer a core plugin
* **coding:** native snippets are now the default on Neovim 0.10. Install the luasnip extra to get luasnip back
* **coding:** use native comments on 0.10, with support for ts_context_commentstring
### Features
* **coding:** move `mini.ai` to an extra ([4f4911f](https://github.com/LazyVim/LazyVim/commit/4f4911ff95bc35438a2b8dd2d058b15f105f2ff1))
* **coding:** native snippets are now the default on Neovim 0.10. Install the luasnip extra to get luasnip back ([3c4ebd5](https://github.com/LazyVim/LazyVim/commit/3c4ebd522e7c475cfedcee5dfa7a008e798c404c))
* **coding:** use native comments on 0.10, with support for ts_context_commentstring ([d999be7](https://github.com/LazyVim/LazyVim/commit/d999be7401783e0f3a610319fa1b327d38fa3e52))
* **extras:** added extra for the `nvim-treesitter` rewrite. Some plugins are not compatible and will be disabled. ([2008146](https://github.com/LazyVim/LazyVim/commit/20081460b65bc7a117933b0dcebbcaa4dcb82b23))
* **keymaps:** added leader-uI to open InspectTree ([3b74ef7](https://github.com/LazyVim/LazyVim/commit/3b74ef793fb7cd8964231393a57b9e3c846b7d1e))
* **lsp:** enable inlay hints by default on Neovim 0.10 ([960e958](https://github.com/LazyVim/LazyVim/commit/960e958548adce7d96ff2e0c014ce2249897125e))
* **mini.surround:** move `mini.surround` to an extra ([e37a699](https://github.com/LazyVim/LazyVim/commit/e37a699096ccb209c1babc29c1d5eeeab74102a1))
* **ui:** move `mini.indentscope` to an extra ([69e6daa](https://github.com/LazyVim/LazyVim/commit/69e6daae2ccb4b7b7180e439c1b05d72d3c64e11))
* **ui:** moved treesitter-context to an extra. No longer a core plugin ([03704e2](https://github.com/LazyVim/LazyVim/commit/03704e22998be9db17f114acc4060d714fe652fb))
* **util:** move `vim-startuptime` to an extra ([66dc9c0](https://github.com/LazyVim/LazyVim/commit/66dc9c09d6356ddc7e5870a4aa74824d3623d315))
* **util:** set_upvalue ([f02507b](https://github.com/LazyVim/LazyVim/commit/f02507b1598379250baab293c423f79c393e28e5))
### Bug Fixes
* **cmp:** never auto bracket for snippets and correct prev char check. Fixes [#2949](https://github.com/LazyVim/LazyVim/issues/2949) ([6e7ba50](https://github.com/LazyVim/LazyVim/commit/6e7ba50141b1cda415c9391fd345a1e428bad9b6))
* **dap:** add debugger to filetypes mapping for launch.json ([#3165](https://github.com/LazyVim/LazyVim/issues/3165)) ([183d6ee](https://github.com/LazyVim/LazyVim/commit/183d6eea606556c8bd7f80a70660c54670e04649))
* **dap:** use jsonc support from plenary. Same as the code from neoconf. Fixes [#3174](https://github.com/LazyVim/LazyVim/issues/3174) ([8dae76c](https://github.com/LazyVim/LazyVim/commit/8dae76c1fd6fb90199b56cda8b6ec21576d02eb5))
* **health:** add warning when not using 0.10.0 ([9fe8b15](https://github.com/LazyVim/LazyVim/commit/9fe8b15928077cb0c20aeea111b42f9698c78330))
* **treesitter-rewrite:** disable vim-illuminate ([b739eb3](https://github.com/LazyVim/LazyVim/commit/b739eb35033acaf20423920d103d5ad3e8350f23))
## [10.25.0](https://github.com/LazyVim/LazyVim/compare/v10.24.0...v10.25.0) (2024-05-15) ## [10.25.0](https://github.com/LazyVim/LazyVim/compare/v10.24.0...v10.25.0) (2024-05-15)

44
NEWS.md
View file

@ -1,5 +1,49 @@
# What's new? # What's new?
## 11.x
- new option `vim.g.deprecation_warnings` to disable deprecation warnings
Defaults to `false`. To disable, set it to `true` in your `options.lua`
- `vim-illuminate` move to extras
Document highlights now use native lsp functionality by default
Since Neovim 0.10 has been released, I've been working on a new version of **LazyVim**
that is fully compatible with all the latest Neovim features.
Additionally, some core plugins have been moved to extras.
- `native snippets` are now the default on Neovim 0.10
Older versions of Neovim will use the new `luasnip` extra.
- `native comments` are now the default on Neovim 0.10
Older versions of Neovim will use the new `mini-comment` extra.
`nvim-ts-context-commentstring` has been integrated in the native comments.
- `inlay hints` have been in **LazyVim** for a while, but are now
enabled by default. To disable them:
```lua
{
"nvim-lspconfig",
opts = {
inlay_hints = { enabled = false },
}
}
```
- plugins moved to extras:
- `mini.ai` which I couldn't live without, but not everyone needs it
- `mini.surround`
- `mini.indentscope` scopes are now also highlighted with `indent-blankline`
- `nvim-treesitter-context`
- There's a new extra for the `nvim-treesitter` **rewrite**.
Since the rewrite is not backward compatible, some plugins will be disabled
when you enable this extra: `vim-illuminate`, `nvim-ts-autotag`, and `nvim-ts-autotag`.
I would **NOT** recommend enabling this extra for now.
## 10.x ## 10.x
- added new extra for [mini.diff](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-diff.md) - added new extra for [mini.diff](https://github.com/echasnovski/mini.nvim/blob/main/readmes/mini-diff.md)

View file

@ -1,4 +1,4 @@
*LazyVim.txt* For Neovim >= 0.9.0 Last change: 2024 May 16 *LazyVim.txt* For Neovim >= 0.9.0 Last change: 2024 May 17
============================================================================== ==============================================================================
Table of Contents *LazyVim-table-of-contents* Table of Contents *LazyVim-table-of-contents*

View file

@ -275,6 +275,10 @@ function M.init()
-- after installing missing plugins -- after installing missing plugins
M.load("options") M.load("options")
if vim.g.deprecation_warnings == false then
vim.deprecate = function() end
end
LazyVim.plugin.setup() LazyVim.plugin.setup()
M.json.load() M.json.load()
end end

View file

@ -37,6 +37,8 @@ map("n", "[b", "<cmd>bprevious<cr>", { desc = "Prev Buffer" })
map("n", "]b", "<cmd>bnext<cr>", { desc = "Next Buffer" }) map("n", "]b", "<cmd>bnext<cr>", { desc = "Next Buffer" })
map("n", "<leader>bb", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" }) map("n", "<leader>bb", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
map("n", "<leader>`", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" }) map("n", "<leader>`", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
map("n", "<leader>bd", LazyVim.ui.bufremove, { desc = "Delete Buffer" })
map("n", "<leader>bD", "<cmd>:bd<cr>", { desc = "Delete Buffer and Window" })
-- Clear search with <esc> -- Clear search with <esc>
map({ "i", "n" }, "<esc>", "<cmd>noh<cr><esc>", { desc = "Escape and Clear hlsearch" }) map({ "i", "n" }, "<esc>", "<cmd>noh<cr><esc>", { desc = "Escape and Clear hlsearch" })
@ -139,6 +141,7 @@ map("n", "<leader>qq", "<cmd>qa<cr>", { desc = "Quit All" })
-- highlights under cursor -- highlights under cursor
map("n", "<leader>ui", vim.show_pos, { desc = "Inspect Pos" }) map("n", "<leader>ui", vim.show_pos, { desc = "Inspect Pos" })
map("n", "<leader>uI", "<cmd>InspectTree<cr>", { desc = "Inspect Tree" })
-- LazyVim Changelog -- LazyVim Changelog
map("n", "<leader>L", function() LazyVim.news.changelog() end, { desc = "LazyVim Changelog" }) map("n", "<leader>L", function() LazyVim.news.changelog() end, { desc = "LazyVim Changelog" })

View file

@ -2,7 +2,7 @@
vim.g.mapleader = " " vim.g.mapleader = " "
vim.g.maplocalleader = "\\" vim.g.maplocalleader = "\\"
-- Enable LazyVim auto format -- LazyVim auto format
vim.g.autoformat = true vim.g.autoformat = true
-- LazyVim root dir detection -- LazyVim root dir detection
@ -25,21 +25,30 @@ vim.g.lazygit_config = true
-- * powershell -- * powershell
-- LazyVim.terminal.setup("pwsh") -- LazyVim.terminal.setup("pwsh")
-- Hide deprecation warnings
vim.g.deprecation_warnings = false
local opt = vim.opt local opt = vim.opt
opt.autowrite = true -- Enable auto write opt.autowrite = true -- Enable auto write
-- only set clipboard if not in ssh, to make sure the OSC 52
if not vim.env.SSH_TTY then -- integration works automatically. Requires Neovim >= 0.10.0
-- only set clipboard if not in ssh, to make sure the OSC 52 opt.clipboard = vim.env.SSH_TTY and "" or "unnamedplus" -- Sync with system clipboard
-- integration works automatically. Requires Neovim >= 0.10.0
opt.clipboard = "unnamedplus" -- Sync with system clipboard
end
opt.completeopt = "menu,menuone,noselect" opt.completeopt = "menu,menuone,noselect"
opt.conceallevel = 2 -- Hide * markup for bold and italic, but not markers with substitutions opt.conceallevel = 2 -- Hide * markup for bold and italic, but not markers with substitutions
opt.confirm = true -- Confirm to save changes before exiting modified buffer opt.confirm = true -- Confirm to save changes before exiting modified buffer
opt.cursorline = true -- Enable highlighting of the current line opt.cursorline = true -- Enable highlighting of the current line
opt.expandtab = true -- Use spaces instead of tabs opt.expandtab = true -- Use spaces instead of tabs
opt.fillchars = {
foldopen = "",
foldclose = "",
fold = " ",
foldsep = " ",
diff = "",
eob = " ",
}
opt.foldlevel = 99
opt.formatexpr = "v:lua.require'lazyvim.util'.format.formatexpr()"
opt.formatoptions = "jcroqlnt" -- tcqj opt.formatoptions = "jcroqlnt" -- tcqj
opt.grepformat = "%f:%l:%c:%m" opt.grepformat = "%f:%l:%c:%m"
opt.grepprg = "rg --vimgrep" opt.grepprg = "rg --vimgrep"
@ -66,11 +75,10 @@ opt.spelllang = { "en" }
opt.splitbelow = true -- Put new windows below current opt.splitbelow = true -- Put new windows below current
opt.splitkeep = "screen" opt.splitkeep = "screen"
opt.splitright = true -- Put new windows right of current opt.splitright = true -- Put new windows right of current
opt.statuscolumn = [[%!v:lua.require'lazyvim.util'.ui.statuscolumn()]]
opt.tabstop = 2 -- Number of spaces tabs count for opt.tabstop = 2 -- Number of spaces tabs count for
opt.termguicolors = true -- True color support opt.termguicolors = true -- True color support
if not vim.g.vscode then opt.timeoutlen = vim.g.vscode and 1000 or 300 -- Lower than default (1000) to quickly trigger which-key
opt.timeoutlen = 300 -- Lower than default (1000) to quickly trigger which-key
end
opt.undofile = true opt.undofile = true
opt.undolevels = 10000 opt.undolevels = 10000
opt.updatetime = 200 -- Save swap file and trigger CursorHold opt.updatetime = 200 -- Save swap file and trigger CursorHold
@ -78,38 +86,16 @@ opt.virtualedit = "block" -- Allow cursor to move where there is no text in visu
opt.wildmode = "longest:full,full" -- Command-line completion mode opt.wildmode = "longest:full,full" -- Command-line completion mode
opt.winminwidth = 5 -- Minimum window width opt.winminwidth = 5 -- Minimum window width
opt.wrap = false -- Disable line wrap opt.wrap = false -- Disable line wrap
opt.fillchars = {
foldopen = "",
foldclose = "",
fold = " ",
foldsep = " ",
diff = "",
eob = " ",
}
if vim.fn.has("nvim-0.10") == 1 then if vim.fn.has("nvim-0.10") == 1 then
opt.smoothscroll = true opt.smoothscroll = true
end opt.foldexpr = "v:lua.require'lazyvim.util'.ui.foldexpr()"
opt.foldmethod = "expr"
-- Folding opt.foldtext = ""
opt.foldlevel = 99 else
opt.foldmethod = "indent"
if vim.fn.has("nvim-0.9.0") == 1 then
opt.statuscolumn = [[%!v:lua.require'lazyvim.util'.ui.statuscolumn()]]
opt.foldtext = "v:lua.require'lazyvim.util'.ui.foldtext()" opt.foldtext = "v:lua.require'lazyvim.util'.ui.foldtext()"
end end
-- HACK: causes freezes on <= 0.9, so only enable on >= 0.10 for now
if vim.fn.has("nvim-0.10") == 1 then
opt.foldmethod = "expr"
opt.foldexpr = "v:lua.require'lazyvim.util'.ui.foldexpr()"
opt.foldtext = ""
opt.fillchars = "fold: "
else
opt.foldmethod = "indent"
end
vim.o.formatexpr = "v:lua.require'lazyvim.util'.format.formatexpr()"
-- Fix markdown indentation settings -- Fix markdown indentation settings
vim.g.markdown_recommended_style = 0 vim.g.markdown_recommended_style = 0

View file

@ -10,6 +10,9 @@ function M.check()
if vim.fn.has("nvim-0.9.0") == 1 then if vim.fn.has("nvim-0.9.0") == 1 then
ok("Using Neovim >= 0.9.0") ok("Using Neovim >= 0.9.0")
if vim.fn.has("nvim-0.10.0") == 0 then
warn("Use Neovim >= 0.10.0 for the best experience")
end
else else
error("Neovim >= 0.9.0 is required") error("Neovim >= 0.9.0 is required")
end end

View file

@ -96,50 +96,65 @@ return {
}, },
-- snippets -- snippets
{ vim.snippet
"L3MON4D3/LuaSnip", and {
build = (not LazyVim.is_win())
and "echo 'NOTE: jsregexp is optional, so not a big deal if it fails to build'; make install_jsregexp"
or nil,
dependencies = {
{
"rafamadriz/friendly-snippets",
config = function()
require("luasnip.loaders.from_vscode").lazy_load()
end,
},
{
"nvim-cmp", "nvim-cmp",
dependencies = { dependencies = {
"saadparwaiz1/cmp_luasnip", { "rafamadriz/friendly-snippets" },
{ "garymjr/nvim-snippets", opts = { friendly_snippets = true } },
}, },
opts = function(_, opts) opts = function(_, opts)
opts.snippet = { opts.snippet = {
expand = function(args) expand = function(args)
require("luasnip").lsp_expand(args.body) vim.snippet.expand(args.body)
end, end,
} }
table.insert(opts.sources, { name = "luasnip" }) table.insert(opts.sources, { name = "snippets" })
end, end,
}, keys = {
}, {
opts = { "<Tab>",
history = true, function()
delete_check_events = "TextChanged", if vim.snippet.active({ direction = 1 }) then
}, vim.schedule(function()
-- stylua: ignore vim.snippet.jump(1)
keys = { end)
{ return
"<tab>", end
function() return "<Tab>"
return require("luasnip").jumpable(1) and "<Plug>luasnip-jump-next" or "<tab>" end,
end, expr = true,
expr = true, silent = true, mode = "i", silent = true,
}, mode = "i",
{ "<tab>", function() require("luasnip").jump(1) end, mode = "s" }, },
{ "<s-tab>", function() require("luasnip").jump(-1) end, mode = { "i", "s" } }, {
}, "<Tab>",
}, function()
vim.schedule(function()
vim.snippet.jump(1)
end)
end,
silent = true,
mode = "s",
},
{
"<S-Tab>",
function()
if vim.snippet.active({ direction = -1 }) then
vim.schedule(function()
vim.snippet.jump(-1)
end)
return
end
return "<S-Tab>"
end,
expr = true,
silent = true,
mode = { "i", "s" },
},
},
}
or { import = "lazyvim.plugins.extras.coding.luasnip", enabled = vim.fn.has("nvim-0.10") == 0 },
-- auto pairs -- auto pairs
{ {
@ -166,43 +181,6 @@ return {
}, },
}, },
-- Fast and feature-rich surround actions. For text that includes
-- surrounding characters like brackets or quotes, this allows you
-- to select the text inside, change or modify the surrounding characters,
-- and more.
{
"echasnovski/mini.surround",
keys = function(_, keys)
-- Populate the keys based on the user's options
local plugin = require("lazy.core.config").spec.plugins["mini.surround"]
local opts = require("lazy.core.plugin").values(plugin, "opts", false)
local mappings = {
{ opts.mappings.add, desc = "Add Surrounding", mode = { "n", "v" } },
{ opts.mappings.delete, desc = "Delete Surrounding" },
{ opts.mappings.find, desc = "Find Right Surrounding" },
{ opts.mappings.find_left, desc = "Find Left Surrounding" },
{ opts.mappings.highlight, desc = "Highlight Surrounding" },
{ opts.mappings.replace, desc = "Replace Surrounding" },
{ opts.mappings.update_n_lines, desc = "Update `MiniSurround.config.n_lines`" },
}
mappings = vim.tbl_filter(function(m)
return m[1] and #m[1] > 0
end, mappings)
return vim.list_extend(mappings, keys)
end,
opts = {
mappings = {
add = "gsa", -- Add surrounding in Normal and Visual modes
delete = "gsd", -- Delete surrounding
find = "gsf", -- Find surrounding (to the right)
find_left = "gsF", -- Find surrounding (to the left)
highlight = "gsh", -- Highlight surrounding
replace = "gsr", -- Replace surrounding
update_n_lines = "gsn", -- Update `n_lines`
},
},
},
-- comments -- comments
{ {
"JoosepAlviste/nvim-ts-context-commentstring", "JoosepAlviste/nvim-ts-context-commentstring",
@ -212,110 +190,22 @@ return {
}, },
}, },
{ {
"echasnovski/mini.comment", import = "lazyvim.plugins.extras.coding.mini-comment",
event = "VeryLazy", enabled = function()
opts = { if vim.fn.has("nvim-0.10") == 1 then
options = { -- Majestically override the native `get_commentstring` function.
custom_commentstring = function() vim.schedule(function()
return require("ts_context_commentstring.internal").calculate_commentstring() or vim.bo.commentstring LazyVim.inject.set_upvalue(
end, LazyVim.inject.get_upvalue(require("vim._comment").textobject, "get_comment_parts"),
}, "get_commentstring",
}, function()
}, return require("ts_context_commentstring.internal").calculate_commentstring() or vim.bo.commentstring
end
-- Better text-objects )
{ end)
"echasnovski/mini.ai", else
-- keys = { return true
-- { "a", mode = { "x", "o" } }, end
-- { "i", mode = { "x", "o" } },
-- },
event = "VeryLazy",
opts = function()
local ai = require("mini.ai")
return {
n_lines = 500,
custom_textobjects = {
o = ai.gen_spec.treesitter({
a = { "@block.outer", "@conditional.outer", "@loop.outer" },
i = { "@block.inner", "@conditional.inner", "@loop.inner" },
}, {}),
f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }, {}),
c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }, {}),
t = { "<([%p%w]-)%f[^<%w][^<>]->.-</%1>", "^<.->().*()</[^/]->$" },
d = { "%f[%d]%d+" }, -- digits
e = { -- Word with case
{
"%u[%l%d]+%f[^%l%d]",
"%f[%S][%l%d]+%f[^%l%d]",
"%f[%P][%l%d]+%f[^%l%d]",
"^[%l%d]+%f[^%l%d]",
},
"^().*()$",
},
g = function() -- Whole buffer, similar to `gg` and 'G' motion
local from = { line = 1, col = 1 }
local to = {
line = vim.fn.line("$"),
col = math.max(vim.fn.getline("$"):len(), 1),
}
return { from = from, to = to }
end,
u = ai.gen_spec.function_call(), -- u for "Usage"
U = ai.gen_spec.function_call({ name_pattern = "[%w_]" }), -- without dot in function name
},
}
end,
config = function(_, opts)
require("mini.ai").setup(opts)
-- register all text objects with which-key
LazyVim.on_load("which-key.nvim", function()
---@type table<string, string|table>
local i = {
[" "] = "Whitespace",
['"'] = 'Balanced "',
["'"] = "Balanced '",
["`"] = "Balanced `",
["("] = "Balanced (",
[")"] = "Balanced ) including white-space",
[">"] = "Balanced > including white-space",
["<lt>"] = "Balanced <",
["]"] = "Balanced ] including white-space",
["["] = "Balanced [",
["}"] = "Balanced } including white-space",
["{"] = "Balanced {",
["?"] = "User Prompt",
_ = "Underscore",
a = "Argument",
b = "Balanced ), ], }",
c = "Class",
d = "Digit(s)",
e = "Word in CamelCase & snake_case",
f = "Function",
g = "Entire file",
o = "Block, conditional, loop",
q = "Quote `, \", '",
t = "Tag",
u = "Use/call function & method",
U = "Use/call without dot in name",
}
local a = vim.deepcopy(i)
for k, v in pairs(a) do
a[k] = v:gsub(" including.*", "")
end
local ic = vim.deepcopy(i)
local ac = vim.deepcopy(a)
for key, name in pairs({ n = "Next", l = "Last" }) do
i[key] = vim.tbl_extend("force", { name = "Inside " .. name .. " textobject" }, ic)
a[key] = vim.tbl_extend("force", { name = "Around " .. name .. " textobject" }, ac)
end
require("which-key").register({
mode = { "o", "x" },
i = i,
a = a,
})
end)
end, end,
}, },
} }

View file

@ -409,74 +409,6 @@ return {
}, },
}, },
-- Automatically highlights other instances of the word under your cursor.
-- This works with LSP, Treesitter, and regexp matching to find the other
-- instances.
{
"RRethy/vim-illuminate",
event = "LazyFile",
opts = {
delay = 200,
large_file_cutoff = 2000,
large_file_overrides = {
providers = { "lsp" },
},
},
config = function(_, opts)
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" },
},
},
-- buffer remove
{
"echasnovski/mini.bufremove",
keys = {
{
"<leader>bd",
function()
local bd = require("mini.bufremove").delete
if vim.bo.modified then
local choice = vim.fn.confirm(("Save changes to %q?"):format(vim.fn.bufname()), "&Yes\n&No\n&Cancel")
if choice == 1 then -- Yes
vim.cmd.write()
bd(0)
elseif choice == 2 then -- No
bd(0, true)
end
else
bd(0)
end
end,
desc = "Delete Buffer",
},
-- stylua: ignore
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "Delete Buffer (Force)" },
},
},
-- better diagnostics list and others -- better diagnostics list and others
{ {
"folke/trouble.nvim", "folke/trouble.nvim",

View file

@ -0,0 +1,44 @@
return {
"L3MON4D3/LuaSnip",
build = (not LazyVim.is_win())
and "echo 'NOTE: jsregexp is optional, so not a big deal if it fails to build'; make install_jsregexp"
or nil,
dependencies = {
{
"rafamadriz/friendly-snippets",
config = function()
require("luasnip.loaders.from_vscode").lazy_load()
end,
},
{
"nvim-cmp",
dependencies = {
"saadparwaiz1/cmp_luasnip",
},
opts = function(_, opts)
opts.snippet = {
expand = function(args)
require("luasnip").lsp_expand(args.body)
end,
}
table.insert(opts.sources, { name = "luasnip" })
end,
},
},
opts = {
history = true,
delete_check_events = "TextChanged",
},
-- stylua: ignore
keys = {
{
"<tab>",
function()
return require("luasnip").jumpable(1) and "<Plug>luasnip-jump-next" or "<tab>"
end,
expr = true, silent = true, mode = "i",
},
{ "<tab>", function() require("luasnip").jump(1) end, mode = "s" },
{ "<s-tab>", function() require("luasnip").jump(-1) end, mode = { "i", "s" } },
},
}

View file

@ -0,0 +1,95 @@
-- Better text-objects
return {
"echasnovski/mini.ai",
-- keys = {
-- { "a", mode = { "x", "o" } },
-- { "i", mode = { "x", "o" } },
-- },
event = "VeryLazy",
opts = function()
local ai = require("mini.ai")
return {
n_lines = 500,
custom_textobjects = {
o = ai.gen_spec.treesitter({
a = { "@block.outer", "@conditional.outer", "@loop.outer" },
i = { "@block.inner", "@conditional.inner", "@loop.inner" },
}, {}),
f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }, {}),
c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }, {}),
t = { "<([%p%w]-)%f[^<%w][^<>]->.-</%1>", "^<.->().*()</[^/]->$" },
d = { "%f[%d]%d+" }, -- digits
e = { -- Word with case
{
"%u[%l%d]+%f[^%l%d]",
"%f[%S][%l%d]+%f[^%l%d]",
"%f[%P][%l%d]+%f[^%l%d]",
"^[%l%d]+%f[^%l%d]",
},
"^().*()$",
},
g = function() -- Whole buffer, similar to `gg` and 'G' motion
local from = { line = 1, col = 1 }
local to = {
line = vim.fn.line("$"),
col = math.max(vim.fn.getline("$"):len(), 1),
}
return { from = from, to = to }
end,
u = ai.gen_spec.function_call(), -- u for "Usage"
U = ai.gen_spec.function_call({ name_pattern = "[%w_]" }), -- without dot in function name
},
}
end,
config = function(_, opts)
require("mini.ai").setup(opts)
-- register all text objects with which-key
LazyVim.on_load("which-key.nvim", function()
---@type table<string, string|table>
local i = {
[" "] = "Whitespace",
['"'] = 'Balanced "',
["'"] = "Balanced '",
["`"] = "Balanced `",
["("] = "Balanced (",
[")"] = "Balanced ) including white-space",
[">"] = "Balanced > including white-space",
["<lt>"] = "Balanced <",
["]"] = "Balanced ] including white-space",
["["] = "Balanced [",
["}"] = "Balanced } including white-space",
["{"] = "Balanced {",
["?"] = "User Prompt",
_ = "Underscore",
a = "Argument",
b = "Balanced ), ], }",
c = "Class",
d = "Digit(s)",
e = "Word in CamelCase & snake_case",
f = "Function",
g = "Entire file",
o = "Block, conditional, loop",
q = "Quote `, \", '",
t = "Tag",
u = "Use/call function & method",
U = "Use/call without dot in name",
}
local a = vim.deepcopy(i)
for k, v in pairs(a) do
a[k] = v:gsub(" including.*", "")
end
local ic = vim.deepcopy(i)
local ac = vim.deepcopy(a)
for key, name in pairs({ n = "Next", l = "Last" }) do
i[key] = vim.tbl_extend("force", { name = "Inside " .. name .. " textobject" }, ic)
a[key] = vim.tbl_extend("force", { name = "Around " .. name .. " textobject" }, ac)
end
require("which-key").register({
mode = { "o", "x" },
i = i,
a = a,
})
end)
end,
}

View file

@ -0,0 +1,13 @@
return {
{
"echasnovski/mini.comment",
event = "VeryLazy",
opts = {
options = {
custom_commentstring = function()
return require("ts_context_commentstring.internal").calculate_commentstring() or vim.bo.commentstring
end,
},
},
},
}

View file

@ -0,0 +1,35 @@
-- Fast and feature-rich surround actions. For text that includes
-- surrounding characters like brackets or quotes, this allows you
-- to select the text inside, change or modify the surrounding characters,
-- and more.
return {
"echasnovski/mini.surround",
keys = function(_, keys)
-- Populate the keys based on the user's options
local opts = LazyVim.opts("mini.surround")
local mappings = {
{ opts.mappings.add, desc = "Add Surrounding", mode = { "n", "v" } },
{ opts.mappings.delete, desc = "Delete Surrounding" },
{ opts.mappings.find, desc = "Find Right Surrounding" },
{ opts.mappings.find_left, desc = "Find Left Surrounding" },
{ opts.mappings.highlight, desc = "Highlight Surrounding" },
{ opts.mappings.replace, desc = "Replace Surrounding" },
{ opts.mappings.update_n_lines, desc = "Update `MiniSurround.config.n_lines`" },
}
mappings = vim.tbl_filter(function(m)
return m[1] and #m[1] > 0
end, mappings)
return vim.list_extend(mappings, keys)
end,
opts = {
mappings = {
add = "gsa", -- Add surrounding in Normal and Visual modes
delete = "gsd", -- Delete surrounding
find = "gsf", -- Find surrounding (to the right)
find_left = "gsF", -- Find surrounding (to the left)
highlight = "gsh", -- Highlight surrounding
replace = "gsr", -- Replace surrounding
update_n_lines = "gsn", -- Update `n_lines`
},
},
}

View file

@ -1,69 +0,0 @@
if not vim.snippet then
LazyVim.warn("Native snippets are only supported on Neovim >= 0.10.0")
return {}
end
return {
desc = "Use native snippets instead of LuaSnip. Only works on Neovim >= 0.10!",
{
"L3MON4D3/LuaSnip",
enabled = false,
},
{
"nvim-cmp",
dependencies = {
{ "rafamadriz/friendly-snippets" },
{ "garymjr/nvim-snippets", opts = { friendly_snippets = true } },
},
opts = function(_, opts)
opts.snippet = {
expand = function(args)
vim.snippet.expand(args.body)
end,
}
table.insert(opts.sources, { name = "snippets" })
end,
keys = {
{
"<Tab>",
function()
if vim.snippet.active({ direction = 1 }) then
vim.schedule(function()
vim.snippet.jump(1)
end)
return
end
return "<Tab>"
end,
expr = true,
silent = true,
mode = "i",
},
{
"<Tab>",
function()
vim.schedule(function()
vim.snippet.jump(1)
end)
end,
silent = true,
mode = "s",
},
{
"<S-Tab>",
function()
if vim.snippet.active({ direction = -1 }) then
vim.schedule(function()
vim.snippet.jump(-1)
end)
return
end
return "<S-Tab>"
end,
expr = true,
silent = true,
mode = { "i", "s" },
},
},
},
}

View file

@ -121,7 +121,15 @@ return {
-- setup dap config by VsCode launch.json file -- setup dap config by VsCode launch.json file
local vscode = require("dap.ext.vscode") local vscode = require("dap.ext.vscode")
vscode.json_decode = require("neoconf.json.jsonc").decode_jsonc local _filetypes = require("mason-nvim-dap.mappings.filetypes")
vscode.load_launchjs() local filetypes = vim.tbl_deep_extend("force", _filetypes, {
["node"] = { "javascriptreact", "typescriptreact", "typescript", "javascript" },
["pwa-node"] = { "javascriptreact", "typescriptreact", "typescript", "javascript" },
})
local json = require("plenary.json")
vscode.json_decode = function(str)
return vim.json.decode(json.json_strip_comments(str))
end
vscode.load_launchjs(nil, filetypes)
end, end,
} }

View file

@ -0,0 +1,45 @@
-- Automatically highlights other instances of the word under your cursor.
-- This works with LSP, Treesitter, and regexp matching to find the other
-- instances.
return {
{
"RRethy/vim-illuminate",
event = "LazyFile",
opts = {
delay = 200,
large_file_cutoff = 2000,
large_file_overrides = {
providers = { "lsp" },
},
},
config = function(_, opts)
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" },
},
},
{
"neovim/nvim-lspconfig",
opts = { document_highlight = { enabed = false } },
},
}

View file

@ -38,6 +38,7 @@ return {
-- rename surround mappings from gs to gz to prevent conflict with leap -- rename surround mappings from gs to gz to prevent conflict with leap
{ {
"echasnovski/mini.surround", "echasnovski/mini.surround",
optional = true,
opts = { opts = {
mappings = { mappings = {
add = "gza", -- Add surrounding in Normal and Visual modes add = "gza", -- Add surrounding in Normal and Visual modes

View file

@ -0,0 +1,42 @@
return {
-- Active indent guide and indent text objects. When you're browsing
-- code, this highlights the current level of indentation, and animates
-- the highlighting.
{
"echasnovski/mini.indentscope",
version = false, -- wait till new 0.7.0 release to put it back on semver
event = "LazyFile",
opts = {
-- symbol = "▏",
symbol = "",
options = { try_as_border = true },
},
init = function()
vim.api.nvim_create_autocmd("FileType", {
pattern = {
"help",
"alpha",
"dashboard",
"neo-tree",
"Trouble",
"trouble",
"lazy",
"mason",
"notify",
"toggleterm",
"lazyterm",
},
callback = function()
vim.b.miniindentscope_disable = true
end,
})
end,
},
{
"lukas-reineke/indent-blankline.nvim",
event = "LazyFile",
opts = {
scope = { enabled = false },
},
},
}

View file

@ -0,0 +1,21 @@
-- Show context of the current function
return {
"nvim-treesitter/nvim-treesitter-context",
event = "LazyFile",
opts = { mode = "cursor", max_lines = 3 },
keys = {
{
"<leader>ut",
function()
local tsc = require("treesitter-context")
tsc.toggle()
if LazyVim.inject.get_upvalue(tsc.toggle, "enabled") then
LazyVim.info("Enabled Treesitter Context", { title = "Option" })
else
LazyVim.warn("Disabled Treesitter Context", { title = "Option" })
end
end,
desc = "Toggle Treesitter Context",
},
},
}

View file

@ -0,0 +1,106 @@
local Config = require("lazyvim.config")
-- backwards compatibility with the old treesitter config for adding custom parsers
local function patch()
local parsers = require("nvim-treesitter.parsers")
parsers.get_parser_configs = setmetatable({}, {
__call = function()
return parsers
end,
})
end
if vim.tbl_contains(Config.json.data.extras, "lazyvim.plugins.extras.ui.treesitter-rewrite") then
if vim.fn.executable("tree-sitter") == 0 then
LazyVim.error("**treesitter-rewrite** requires the `tree-sitter` executable to be installed")
return {}
end
if vim.fn.has("nvim-0.10") == 0 then
LazyVim.error("**treesitter-rewrite** requires Neovim >= 0.10")
return {}
end
end
return {
{
"nvim-treesitter/nvim-treesitter",
version = false, -- last release is way too old and doesn't work on Windows
branch = "main",
build = ":TSUpdate",
lazy = false,
cmd = {},
opts = function()
patch()
return {
highlight = { enable = true },
indent = { enable = true },
ensure_install = {
"bash",
"c",
"diff",
"html",
"javascript",
"jsdoc",
"json",
"jsonc",
"lua",
"luadoc",
"luap",
"markdown",
"markdown_inline",
"python",
"query",
"regex",
"toml",
"tsx",
"typescript",
"vim",
"vimdoc",
"xml",
"yaml",
},
}
end,
init = function() end,
---@param opts TSConfig
config = function(_, opts)
---@return string[]
local function norm(ensure)
return ensure == nil and {} or type(ensure) == "string" and { ensure } or ensure
end
-- ensure_installed is deprecated, but still supported
opts.ensure_install = LazyVim.dedup(vim.list_extend(norm(opts.ensure_install), norm(opts.ensure_installed)))
require("nvim-treesitter").setup(opts)
patch()
-- backwards compatibility with the old treesitter config for indent
if vim.tbl_get(opts, "indent", "enable") then
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end
-- backwards compatibility with the old treesitter config for highlight
if vim.tbl_get(opts, "highlight", "enable") then
vim.api.nvim_create_autocmd("FileType", {
callback = function()
pcall(vim.treesitter.start)
end,
})
end
end,
},
{
"nvim-treesitter/nvim-treesitter-textobjects",
enabled = false,
},
{
"windwp/nvim-ts-autotag",
enabled = false,
},
{
"RRethy/vim-illuminate",
enabled = false,
},
}

View file

@ -0,0 +1,8 @@
-- measure startuptime
return {
"dstein64/vim-startuptime",
cmd = "StartupTime",
config = function()
vim.g.startuptime_tries = 10
end,
}

View file

@ -54,9 +54,7 @@ return {
priority = 100, priority = 100,
primary = true, primary = true,
format = function(buf) format = function(buf)
local plugin = require("lazy.core.config").plugins["conform.nvim"] local opts = LazyVim.opts("conform.nvim")
local Plugin = require("lazy.core.plugin")
local opts = Plugin.values(plugin, "opts", false)
require("conform").format(LazyVim.merge({}, opts.format, { bufnr = buf })) require("conform").format(LazyVim.merge({}, opts.format, { bufnr = buf }))
end, end,
sources = function(buf) sources = function(buf)

View file

@ -38,7 +38,7 @@ return {
-- Be aware that you also will need to properly configure your LSP server to -- Be aware that you also will need to properly configure your LSP server to
-- provide the inlay hints. -- provide the inlay hints.
inlay_hints = { inlay_hints = {
enabled = false, enabled = true,
}, },
-- Enable this to enable the builtin LSP code lenses on Neovim >= 0.10.0 -- Enable this to enable the builtin LSP code lenses on Neovim >= 0.10.0
-- Be aware that you also will need to properly configure your LSP server to -- Be aware that you also will need to properly configure your LSP server to
@ -46,6 +46,10 @@ return {
codelens = { codelens = {
enabled = false, enabled = false,
}, },
-- Enable lsp cursor word highlighting
document_highlight = {
enabled = true,
},
-- add any global capabilities here -- add any global capabilities here
capabilities = {}, capabilities = {},
-- options for vim.lsp.buf.format -- options for vim.lsp.buf.format
@ -106,8 +110,7 @@ return {
---@param opts PluginLspOpts ---@param opts PluginLspOpts
config = function(_, opts) config = function(_, opts)
if LazyVim.has("neoconf.nvim") then if LazyVim.has("neoconf.nvim") then
local plugin = require("lazy.core.config").spec.plugins["neoconf.nvim"] require("neoconf").setup(LazyVim.opts("neoconf.nvim"))
require("neoconf").setup(require("lazy.core.plugin").values(plugin, "opts", false))
end end
-- setup autoformat -- setup autoformat
@ -129,6 +132,8 @@ return {
return ret return ret
end end
LazyVim.lsp.words.setup(opts.document_highlight)
-- diagnostics signs -- diagnostics signs
if vim.fn.has("nvim-0.10.0") == 0 then if vim.fn.has("nvim-0.10.0") == 0 then
if type(opts.diagnostics.signs) ~= "boolean" then if type(opts.diagnostics.signs) ~= "boolean" then
@ -140,27 +145,29 @@ return {
end end
end end
-- inlay hints if vim.fn.has("nvim-0.10") == 1 then
if opts.inlay_hints.enabled then -- inlay hints
LazyVim.lsp.on_attach(function(client, buffer) if opts.inlay_hints.enabled then
if client.supports_method("textDocument/inlayHint") then LazyVim.lsp.on_attach(function(client, buffer)
LazyVim.toggle.inlay_hints(buffer, true) if client.supports_method("textDocument/inlayHint") then
end LazyVim.toggle.inlay_hints(buffer, true)
end) end
end end)
end
-- code lens -- code lens
if opts.codelens.enabled and vim.lsp.codelens then if opts.codelens.enabled and vim.lsp.codelens then
LazyVim.lsp.on_attach(function(client, buffer) LazyVim.lsp.on_attach(function(client, buffer)
if client.supports_method("textDocument/codeLens") then if client.supports_method("textDocument/codeLens") then
vim.lsp.codelens.refresh() vim.lsp.codelens.refresh()
--- autocmd BufEnter,CursorHold,InsertLeave <buffer> lua vim.lsp.codelens.refresh() --- autocmd BufEnter,CursorHold,InsertLeave <buffer> lua vim.lsp.codelens.refresh()
vim.api.nvim_create_autocmd({ "BufEnter", "CursorHold", "InsertLeave" }, { vim.api.nvim_create_autocmd({ "BufEnter", "CursorHold", "InsertLeave" }, {
buffer = buffer, buffer = buffer,
callback = vim.lsp.codelens.refresh, callback = vim.lsp.codelens.refresh,
}) })
end end
end) end)
end
end end
if type(opts.diagnostics.virtual_text) == "table" and opts.diagnostics.virtual_text.prefix == "icons" then if type(opts.diagnostics.virtual_text) == "table" and opts.diagnostics.virtual_text.prefix == "icons" then

View file

@ -118,29 +118,6 @@ return {
end, end,
}, },
-- Show context of the current function
{
"nvim-treesitter/nvim-treesitter-context",
event = "LazyFile",
enabled = true,
opts = { mode = "cursor", max_lines = 3 },
keys = {
{
"<leader>ut",
function()
local tsc = require("treesitter-context")
tsc.toggle()
if LazyVim.inject.get_upvalue(tsc.toggle, "enabled") then
LazyVim.info("Enabled Treesitter Context", { title = "Option" })
else
LazyVim.warn("Disabled Treesitter Context", { title = "Option" })
end
end,
desc = "Toggle Treesitter Context",
},
},
},
-- Automatically add closing tags for HTML and JSX -- Automatically add closing tags for HTML and JSX
{ {
"windwp/nvim-ts-autotag", "windwp/nvim-ts-autotag",

View file

@ -219,7 +219,7 @@ return {
char = "", char = "",
tab_char = "", tab_char = "",
}, },
scope = { enabled = false }, scope = { show_start = false, show_end = false },
exclude = { exclude = {
filetypes = { filetypes = {
"help", "help",
@ -239,40 +239,6 @@ return {
main = "ibl", main = "ibl",
}, },
-- Active indent guide and indent text objects. When you're browsing
-- code, this highlights the current level of indentation, and animates
-- the highlighting.
{
"echasnovski/mini.indentscope",
version = false, -- wait till new 0.7.0 release to put it back on semver
event = "LazyFile",
opts = {
-- symbol = "▏",
symbol = "",
options = { try_as_border = true },
},
init = function()
vim.api.nvim_create_autocmd("FileType", {
pattern = {
"help",
"alpha",
"dashboard",
"neo-tree",
"Trouble",
"trouble",
"lazy",
"mason",
"notify",
"toggleterm",
"lazyterm",
},
callback = function()
vim.b.miniindentscope_disable = true
end,
})
end,
},
-- Displays a popup with possible key bindings of the command you started typing -- Displays a popup with possible key bindings of the command you started typing
{ {
"folke/which-key.nvim", "folke/which-key.nvim",

View file

@ -1,14 +1,5 @@
return { return {
-- measure startuptime
{
"dstein64/vim-startuptime",
cmd = "StartupTime",
config = function()
vim.g.startuptime_tries = 10
end,
},
-- Session management. This saves your session in the background, -- Session management. This saves your session in the background,
-- keeping track of open buffers, window arrangement, and more. -- keeping track of open buffers, window arrangement, and more.
-- You can restore sessions when returning through the dashboard. -- You can restore sessions when returning through the dashboard.

View file

@ -72,7 +72,7 @@ end
---@param name string ---@param name string
function M.opts(name) function M.opts(name)
local plugin = require("lazy.core.config").plugins[name] local plugin = require("lazy.core.config").spec.plugins[name]
if not plugin then if not plugin then
return {} return {}
end end
@ -170,4 +170,19 @@ function M.safe_keymap_set(mode, lhs, rhs, opts)
end end
end end
---@generic T
---@param list T[]
---@return T[]
function M.dedup(list)
local ret = {}
local seen = {}
for _, v in ipairs(list) do
if not seen[v] then
table.insert(ret, v)
seen[v] = true
end
end
return ret
end
return M return M

View file

@ -31,4 +31,20 @@ function M.get_upvalue(func, name)
end end
end end
function M.set_upvalue(func, name, value)
local i = 1
while true do
local n = debug.getupvalue(func, i)
if not n then
break
end
if n == name then
debug.setupvalue(func, i, value)
return
end
i = i + 1
end
LazyVim.error("upvalue not found: " .. name)
end
return M return M

View file

@ -21,7 +21,7 @@ function M.get_clients(opts)
return opts and opts.filter and vim.tbl_filter(opts.filter, ret) or ret return opts and opts.filter and vim.tbl_filter(opts.filter, ret) or ret
end end
---@param on_attach fun(client, buffer) ---@param on_attach fun(client:lsp.Client, buffer)
function M.on_attach(on_attach) function M.on_attach(on_attach)
vim.api.nvim_create_autocmd("LspAttach", { vim.api.nvim_create_autocmd("LspAttach", {
callback = function(args) callback = function(args)
@ -125,4 +125,84 @@ function M.format(opts)
end end
end end
---@alias LspWord {from:{[1]:number, [2]:number}, to:{[1]:number, [2]:number}, current?:boolean} 1-0 indexed
M.words = {}
M.words.ns = vim.api.nvim_create_namespace("vim_lsp_references")
---@param opts? {enabled?: boolean}
function M.words.setup(opts)
opts = opts or {}
if not opts.enabled then
return
end
local handler = vim.lsp.handlers["textDocument/documentHighlight"]
vim.lsp.handlers["textDocument/documentHighlight"] = function(err, result, ctx, config)
if not vim.api.nvim_buf_is_loaded(ctx.bufnr) then
return
end
return handler(err, result, ctx, config)
end
M.on_attach(function(client, buf)
if client.supports_method("textDocument/documentHighlight") then
vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI", "CursorMoved", "CursorMovedI" }, {
group = vim.api.nvim_create_augroup("lsp_word_" .. buf, { clear = true }),
buffer = buf,
callback = function(ev)
if not M.words.at() then
if ev.event:find("CursorMoved") then
vim.lsp.buf.clear_references()
else
vim.lsp.buf.document_highlight()
end
end
end,
})
vim.keymap.set("n", "]]", function()
M.words.jump(vim.v.count1)
end, { buffer = buf, desc = "Next reference" })
vim.keymap.set("n", "[[", function()
M.words.jump(-vim.v.count1)
end, { buffer = buf, desc = "Previous reference" })
end
end)
end
---@return LspWord[]
function M.words.get()
local cursor = vim.api.nvim_win_get_cursor(0)
return vim.tbl_map(function(extmark)
local ret = {
from = { extmark[2] + 1, extmark[3] },
to = { extmark[4].end_row + 1, extmark[4].end_col },
}
if cursor[1] >= ret.from[1] and cursor[1] <= ret.to[1] and cursor[2] >= ret.from[2] and cursor[2] <= ret.to[2] then
ret.current = true
end
return ret
end, vim.api.nvim_buf_get_extmarks(0, M.words.ns, 0, -1, { details = true }))
end
---@param words? LspWord[]
---@return LspWord?, number?
function M.words.at(words)
for idx, word in ipairs(words or M.words.get()) do
if word.current then
return word, idx
end
end
end
function M.words.jump(count)
local words = M.words.get()
local _, idx = M.words.at(words)
if not idx then
return
end
local target = words[idx + count]
if target then
vim.api.nvim_win_set_cursor(0, target.from)
end
end
return M return M

View file

@ -10,6 +10,7 @@ M.deprecated_extras = {
["lazyvim.plugins.extras.formatting.conform"] = "`conform.nvim` is now the default **LazyVim** formatter.", ["lazyvim.plugins.extras.formatting.conform"] = "`conform.nvim` is now the default **LazyVim** formatter.",
["lazyvim.plugins.extras.linting.nvim-lint"] = "`nvim-lint` is now the default **LazyVim** linter.", ["lazyvim.plugins.extras.linting.nvim-lint"] = "`nvim-lint` is now the default **LazyVim** linter.",
["lazyvim.plugins.extras.ui.dashboard"] = "`dashboard.nvim` is now the default **LazyVim** starter.", ["lazyvim.plugins.extras.ui.dashboard"] = "`dashboard.nvim` is now the default **LazyVim** starter.",
["lazyvim.plugins.extras.coding.native_snippets"] = "Native snippets are now the default for **Neovim >= 0.10**",
} }
M.deprecated_modules = { M.deprecated_modules = {
@ -91,7 +92,7 @@ function M.fix_imports()
Plugin.Spec.import = LazyVim.inject.args(Plugin.Spec.import, function(_, spec) Plugin.Spec.import = LazyVim.inject.args(Plugin.Spec.import, function(_, spec)
local dep = M.deprecated_extras[spec and spec.import] local dep = M.deprecated_extras[spec and spec.import]
if dep then if dep then
dep = dep .. "\n" .. "Please remove the extra to hide this warning." dep = dep .. "\n" .. "Please remove the extra from `lazyvim.json` to hide this warning."
LazyVim.warn(dep, { title = "LazyVim", once = true, stacktrace = true, stacklevel = 6 }) LazyVim.warn(dep, { title = "LazyVim", once = true, stacktrace = true, stacklevel = 6 })
return false return false
end end

View file

@ -43,7 +43,9 @@ local enabled = true
function M.diagnostics() function M.diagnostics()
-- if this Neovim version supports checking if diagnostics are enabled -- if this Neovim version supports checking if diagnostics are enabled
-- then use that for the current state -- then use that for the current state
if vim.diagnostic.is_disabled then if vim.diagnostic.is_enabled then
enabled = vim.diagnostic.is_enabled()
elseif vim.diagnostic.is_disabled then
enabled = not vim.diagnostic.is_disabled() enabled = not vim.diagnostic.is_disabled()
end end
enabled = not enabled enabled = not enabled

View file

@ -208,4 +208,43 @@ function M.foldexpr()
return "0" return "0"
end end
function M.bufremove()
local buf = vim.api.nvim_get_current_buf()
if vim.bo.modified then
local choice = vim.fn.confirm(("Save changes to %q?"):format(vim.fn.bufname()), "&Yes\n&No\n&Cancel")
if choice == 0 then -- Cancel
return
end
if choice == 1 then -- Yes
vim.cmd.write()
end
end
for _, win in ipairs(vim.fn.win_findbuf(buf)) do
vim.api.nvim_win_call(win, function()
if not vim.api.nvim_win_is_valid(win) or vim.api.nvim_win_get_buf(win) ~= buf then
return
end
-- Try using alternate buffer
local alt = vim.fn.bufnr("#")
if alt ~= buf and vim.fn.buflisted(alt) == 1 then
vim.api.nvim_win_set_buf(win, alt)
return
end
-- Try using previous buffer
local has_previous = pcall(vim.cmd, "bprevious")
if has_previous and buf ~= vim.api.nvim_win_get_buf(win) then
return
end
-- Create new listed buffer
local new_buf = vim.api.nvim_create_buf(true, false)
vim.api.nvim_win_set_buf(win, new_buf)
end)
end
vim.api.nvim_buf_delete(buf, { force = true })
end
return M return M