Compare commits

..

No commits in common. "main" and "v15.10.1" have entirely different histories.

62 changed files with 951 additions and 1247 deletions

View file

@ -1,3 +1,3 @@
{ {
".": "16.0.0" ".": "15.10.1"
} }

View file

@ -1,3 +0,0 @@
config:
MD013: false
MD033: false

View file

@ -1,151 +1,5 @@
# Changelog # Changelog
## [16.0.0](https://github.com/LazyVim/LazyVim/compare/v15.15.0...v16.0.0) (2026-05-27)
### ⚠ BREAKING CHANGES
* **refactoring:** conform to upstream breaking changes on 2.0 branch ([#7124](https://github.com/LazyVim/LazyVim/issues/7124))
### Features
* **keymaps:** added leader+bi to delete invisible buffers ([58089db](https://github.com/LazyVim/LazyVim/commit/58089db8b198fc81f91789b6f12d0617cae21437))
### Bug Fixes
* **autocmds:** correct version check for nvim-0.13 ([#7184](https://github.com/LazyVim/LazyVim/issues/7184)) ([6eb16e7](https://github.com/LazyVim/LazyVim/commit/6eb16e730d1a686224dca41b05ba125cfd62c1bb))
* **autocmds:** replace `vim.hl.on_yank` with `vim.hl.hl_op` for `nvim-0.13` and above ([#7171](https://github.com/LazyVim/LazyVim/issues/7171)) ([b30c031](https://github.com/LazyVim/LazyVim/commit/b30c0312ea1c5bed6b28e72d930059622b0525f8))
* **go:** use semanticTokens if setup in gopls config init_options ([#7172](https://github.com/LazyVim/LazyVim/issues/7172)) ([b830a52](https://github.com/LazyVim/LazyVim/commit/b830a523b5973c300639d4d9c4fea7d92fa04dc3))
* **hipatterns:** don't color #add (use it too often as a private function in TS) ([dc6240f](https://github.com/LazyVim/LazyVim/commit/dc6240f4d56ae0d40cd0e673ca740dda50c4bf3b))
* **oxc:** prefer top-level oxlint root_dir in monorepos ([d840410](https://github.com/LazyVim/LazyVim/commit/d840410047d20a8f93fb8d473599209ebe95584e))
* **refactoring:** conform to upstream breaking changes on 2.0 branch ([#7124](https://github.com/LazyVim/LazyVim/issues/7124)) ([d926923](https://github.com/LazyVim/LazyVim/commit/d92692309c41581e1f839033fbccd745be732c7e))
## [15.15.0](https://github.com/LazyVim/LazyVim/compare/v15.14.0...v15.15.0) (2026-04-02)
### Features
* **biome:** enable biome lsp for linting ([b2830cf](https://github.com/LazyVim/LazyVim/commit/b2830cfcc5c9c09ebbf9545beb3947a55ce89dbd))
* **biome:** move biome extra from formatting.biome -> lang.typescript.biome ([242f098](https://github.com/LazyVim/LazyVim/commit/242f0983de9fdb70f0d82057a8039e32bc171764))
* **lazydev:** make lspconfig types available on word `lspconfig.settings` ([36f5947](https://github.com/LazyVim/LazyVim/commit/36f594716bcb0bec84a05a6c55f702134d2e89c3))
* **lsp:** auto add organizeImport keymaps for LSPs that support it ([e54689e](https://github.com/LazyVim/LazyVim/commit/e54689ebdc5458cb30f4a48b954c710bb381cd01))
* **oxc:** added oxc extra for oxfmt and oxlint ([4e9eac5](https://github.com/LazyVim/LazyVim/commit/4e9eac57aba1ea575ef008a503cba8327257e4a4))
* **sidekick:** ctrl+. focuses sidekick, but when already inside sidekick, hides it ([50159fe](https://github.com/LazyVim/LazyVim/commit/50159fe344d93329a569cee136c0323e48b0d3da))
* **typescript:** set `vim.g.lazyvim_ts_lsp = "tsgo"` to use the much faster experimental lsp server ([e6f26f0](https://github.com/LazyVim/LazyVim/commit/e6f26f0f23e9cb4c6bcc351b06474f4863319aff))
* **typescript:** split typescript extra in main, vtsls and tsgo ([9029d92](https://github.com/LazyVim/LazyVim/commit/9029d928d2f7b7f76f132b618d2931499c9b6eb9))
### Bug Fixes
* **biome:** added recommendation when root has biome config file ([ad25b31](https://github.com/LazyVim/LazyVim/commit/ad25b31e512892ca51a1fa3ffa96d1375c391039))
* **biome:** biome mason install is no longer needed ([5450006](https://github.com/LazyVim/LazyVim/commit/5450006ccdd7df341f7f60dded58ea4a87aa9c15))
* **biome:** use biome-check in conform that also fixes linting issues and sorts imports ([954d874](https://github.com/LazyVim/LazyVim/commit/954d8746e5cf1266d93cf4210c00c1506f20423b))
* **lsp:** sort server names before setting keymaps ([6d0da34](https://github.com/LazyVim/LazyVim/commit/6d0da34de9c4a82170e3359d4e7853bf89a557b3))
* **oxc:** added `fixKind = "all"` ([85afbbc](https://github.com/LazyVim/LazyVim/commit/85afbbc94bb45891799a4851b2edf753b51f18b0))
* **r:** recommend for *.qmd instead of *qmd files ([3b3d649](https://github.com/LazyVim/LazyVim/commit/3b3d6493332798674fb7b82aea600bab18eaf311))
* **terminal:** use Snacks.terminal.focus() for <C-/> mapping ([96f4f18](https://github.com/LazyVim/LazyVim/commit/96f4f18d7d81c786ac0df5723bc7aca058bf2165)), closes [#7048](https://github.com/LazyVim/LazyVim/issues/7048)
* **treesitter:** `nvim-treesitter` on longer support nvim-0.11, so pin when needed. Fixes [#7092](https://github.com/LazyVim/LazyVim/issues/7092) ([ef272ff](https://github.com/LazyVim/LazyVim/commit/ef272ff7cc9b53d48baf6544618b5923d65c0282))
* **tsgo:** disable inlayHints.functionLikeReturnTypes by default. Too noisy ([8bcb620](https://github.com/LazyVim/LazyVim/commit/8bcb6208021bd4e4257de64c9598c6b78688be28))
* **tsgo:** remove some noisy inlay hints ([d07070b](https://github.com/LazyVim/LazyVim/commit/d07070bf2ff83ae513097d02d71460920af85a91))
* **typescript:** remove keymaps for non-existing code actions ([53f4eab](https://github.com/LazyVim/LazyVim/commit/53f4eabd7723faba2d7c14afe53226d8c18bf16c))
* **util.plugin:** single imports for extras ([1b4be53](https://github.com/LazyVim/LazyVim/commit/1b4be534f1d8959480ba1f622a457654bd737ce5))
### Performance Improvements
* **extras:** never load nested extras ([8764dfb](https://github.com/LazyVim/LazyVim/commit/8764dfbc8fcb8923397153eb3a2cfcac7ea988f1))
### Reverts
* **lsp:** revert changes for [#6456](https://github.com/LazyVim/LazyVim/issues/6456). Closes [#6779](https://github.com/LazyVim/LazyVim/issues/6779) ([d0fe8c8](https://github.com/LazyVim/LazyVim/commit/d0fe8c896f4dca003e8d56e2091ee5ec7da7af75))
## [15.14.0](https://github.com/LazyVim/LazyVim/compare/v15.13.0...v15.14.0) (2026-03-01)
### Features
* **bufferline:** add <leader>bj keymap for BufferLinePick ([#6968](https://github.com/LazyVim/LazyVim/issues/6968)) ([a50072f](https://github.com/LazyVim/LazyVim/commit/a50072fa16cfc1f00b1ae282150bc667f1d1e096))
* **dap:** close dap-float window with `q`. ([#6884](https://github.com/LazyVim/LazyVim/issues/6884)) ([87c0027](https://github.com/LazyVim/LazyVim/commit/87c002789220d922bb94637c690b444bd1ba5611))
* **treesitter:** support query table in treesitter-textobjects mappings ([#6736](https://github.com/LazyVim/LazyVim/issues/6736)) ([42c9f71](https://github.com/LazyVim/LazyVim/commit/42c9f7152b9bd1a4f739b115390370c208dc2a55))
### Bug Fixes
* **editor.overseer:** migrate to v2 ([#6907](https://github.com/LazyVim/LazyVim/issues/6907)) ([27824d7](https://github.com/LazyVim/LazyVim/commit/27824d79a952c54cd9d93c85a699543e4a031dd4))
* **fzf:** correct git_diff description from 'hunks' to 'files' ([#6983](https://github.com/LazyVim/LazyVim/issues/6983)) ([e77d4ab](https://github.com/LazyVim/LazyVim/commit/e77d4ab0d6574efb7142ec40f4f5dcff750a3ee9))
* **lang.clang:** fix `clangd_extensions.nvim` ([#6804](https://github.com/LazyVim/LazyVim/issues/6804)) ([730b691](https://github.com/LazyVim/LazyVim/commit/730b69114d56834f4499fd3e5aecf18920234c39))
* **leap:** update urls to new leap.nvim repo. Fixes [#6958](https://github.com/LazyVim/LazyVim/issues/6958) ([244af66](https://github.com/LazyVim/LazyVim/commit/244af66f8b4e376d60c6604f9b3fd758165f5799))
* **news:** resolve news.txt from $VIMRUNTIME first ([60fea62](https://github.com/LazyVim/LazyVim/commit/60fea6236e342e1f4aa34d078461746d5f587c74)), closes [#7019](https://github.com/LazyVim/LazyVim/issues/7019)
* **python:** set venv-selector.nvim override_notify = false ([#6936](https://github.com/LazyVim/LazyVim/issues/6936)) ([b2917bd](https://github.com/LazyVim/LazyVim/commit/b2917bd3bfe61c40e686f5a2c20f540430945b73))
* **terminal:** add -NoProfile to powershell shellcmdflag ([#6757](https://github.com/LazyVim/LazyVim/issues/6757)) ([a507822](https://github.com/LazyVim/LazyVim/commit/a507822c0f67df661d1411f9274a65ca9cc832f5))
* **terminal:** partially revert previous mappings ([#6770](https://github.com/LazyVim/LazyVim/issues/6770)) ([c64a617](https://github.com/LazyVim/LazyVim/commit/c64a61734fc9d45470a72603395c02137802bc6f))
* **treesitter:** fix `]c` textobject mappings when in diff mode ([#6911](https://github.com/LazyVim/LazyVim/issues/6911)) ([16713e6](https://github.com/LazyVim/LazyVim/commit/16713e6e1200eb90ad4b4a394bb7254fb5612484))
* **treesitter:** remove deleted jsonc parser ([#6848](https://github.com/LazyVim/LazyVim/issues/6848)) ([92607e7](https://github.com/LazyVim/LazyVim/commit/92607e79e09a2761d930877a09edc00438b97fc3))
* **util.lsp:** `LazyVim.lsp.execute` only request single client ([#6904](https://github.com/LazyVim/LazyVim/issues/6904)) ([a4e19e9](https://github.com/LazyVim/LazyVim/commit/a4e19e9c9c939c1a3fc2f30ffefe37311d3ecadf))
* **util.lsp:** pass `formatters_by_ft` to `opts` ([#6894](https://github.com/LazyVim/LazyVim/issues/6894)) ([03f1293](https://github.com/LazyVim/LazyVim/commit/03f1293e33541073288f23abdaf581a8e0dec4c4))
* **vtsls:** remove redundant deno logic, upstreamed in `nvim-lspconfig` ([#7011](https://github.com/LazyVim/LazyVim/issues/7011)) ([8652c95](https://github.com/LazyVim/LazyVim/commit/8652c9570377678a78ecb19dbd33695e0e4ec4fc))
## [15.13.0](https://github.com/LazyVim/LazyVim/compare/v15.12.2...v15.13.0) (2025-11-01)
### Features
* **snacks:** `snacks.gh` integration. Enabled by default, unless the `util.octo` extra is enabled. ([5e981f9](https://github.com/LazyVim/LazyVim/commit/5e981f9a8cd75eb6f49756e188411037b82b8045))
### Bug Fixes
* **treesitter:** remove node requirement ([6b52a30](https://github.com/LazyVim/LazyVim/commit/6b52a3059e52eed062b6ff3f56e70cffcbf879fe))
## [15.12.2](https://github.com/LazyVim/LazyVim/compare/v15.12.1...v15.12.2) (2025-10-26)
### Bug Fixes
* **lsp.keymaps:** make cond -> enabled work again. Closes [#6697](https://github.com/LazyVim/LazyVim/issues/6697) ([1a40162](https://github.com/LazyVim/LazyVim/commit/1a401627146c66beaeb213f66dd02662f1006e82))
## [15.12.1](https://github.com/LazyVim/LazyVim/compare/v15.12.0...v15.12.1) (2025-10-26)
### Bug Fixes
* **fzf-lua:** LSP keymaps. Closes [#6698](https://github.com/LazyVim/LazyVim/issues/6698) ([b5ea1e9](https://github.com/LazyVim/LazyVim/commit/b5ea1e9d25202e38a47f0b03ac35cc587c80e6d7))
* **navic:** navic attach. Closes [#6702](https://github.com/LazyVim/LazyVim/issues/6702) ([d2d0c64](https://github.com/LazyVim/LazyVim/commit/d2d0c641ed443f8d2ea9e131ec90df59ea149d0a))
## [15.12.0](https://github.com/LazyVim/LazyVim/compare/v15.11.0...v15.12.0) (2025-10-25)
### Features
* **keymaps:** added `<localleader>r` to run the selection/file with lua ([acc3538](https://github.com/LazyVim/LazyVim/commit/acc35382294d91b279b319510b906249a03b2764))
* **lsp:** lsp keymaps can now be configured with `lsp-config.opts.servers['*'].keys` like for lsp servers ([cd8c497](https://github.com/LazyVim/LazyVim/commit/cd8c4977a0a8e80750ed6a10992f988f811c6417))
* **lsp:** refactor lsp code to use `Snacks.util.lsp.on` ([3964433](https://github.com/LazyVim/LazyVim/commit/39644330624139dddb857ed833987c1cfd8432cf))
* **sidekick:** added NES toggle `<leader>uN`. Closes [#6692](https://github.com/LazyVim/LazyVim/issues/6692) ([84ca4df](https://github.com/LazyVim/LazyVim/commit/84ca4dffdbf175a5e7bc39904157700854d8b2ad))
### Bug Fixes
* **chezmoi:** use vim.env.HOME instead of os.getenv("HOME") for Windows compatibility ([231e476](https://github.com/LazyVim/LazyVim/commit/231e476ec9292b56258f86e28773843cddaf34b8))
* **clipboard:** connecting via vscpde's remote-ssh extension causes severe lag during yank and copy operations. ([#6664](https://github.com/LazyVim/LazyVim/issues/6664)) ([5098a69](https://github.com/LazyVim/LazyVim/commit/5098a6987009199d5a5c4bfb8086d0fe4a94e0bb))
* **lang.ember:** remove '.git' lang.ember ([#6685](https://github.com/LazyVim/LazyVim/issues/6685)) ([4796fb4](https://github.com/LazyVim/LazyVim/commit/4796fb4ac54744b69a45a6044655543b1c4231f0))
* **root:** don't use fs_realpath on windows ([46e419d](https://github.com/LazyVim/LazyVim/commit/46e419d27efb5b7282a5ab17a49f4745ce23b55a))
## [15.11.0](https://github.com/LazyVim/LazyVim/compare/v15.10.1...v15.11.0) (2025-10-23)
### Features
* **snacks_picker:** added gai/gao keymaps for calls incoming/outgoing ([b6e48a5](https://github.com/LazyVim/LazyVim/commit/b6e48a57fb4ad7a79f24646016926eef68ce3002))
* **snacks.picker:** added `<leader>gD` to diff against merge base of branch/PR ([f0a91d9](https://github.com/LazyVim/LazyVim/commit/f0a91d9fa5f0cf27d6ba5fac759fa1d4e0df97a3))
### Bug Fixes
* **avante:** unset default keymaps ([#6657](https://github.com/LazyVim/LazyVim/issues/6657)) ([e8a1d8b](https://github.com/LazyVim/LazyVim/commit/e8a1d8b6286f82d75e5830de5ea93bd7622cec8c))
* **extras:** remove custom formatter opts for dart/solidity. Closes [#6665](https://github.com/LazyVim/LazyVim/issues/6665) ([b38de4e](https://github.com/LazyVim/LazyVim/commit/b38de4e2fe4ad887cae1604fd9f1fbd230e0118f))
## [15.10.1](https://github.com/LazyVim/LazyVim/compare/v15.10.0...v15.10.1) (2025-10-20) ## [15.10.1](https://github.com/LazyVim/LazyVim/compare/v15.10.0...v15.10.1) (2025-10-20)

View file

@ -29,21 +29,3 @@
- Every language extra requires a `recommended` section as part of the extra. - Every language extra requires a `recommended` section as part of the extra.
Check lspconfig server configurations for the proper filetypes and root directories. Check lspconfig server configurations for the proper filetypes and root directories.
Refer to other extras for creating the `recommended` section. Refer to other extras for creating the `recommended` section.
### Language-Specific Keymaps
- Use `<localleader>` for language-specific keymaps (follows Vim/Neovim convention for filetype-specific mappings).
- For LSP servers, define keymaps in the server's `keys` field, not in `on_attach`:
```lua
servers = {
rust_analyzer = {
keys = {
{ "<localleader>e", function() vim.cmd.RustLsp("expandMacro") end, desc = "Expand Macro" },
}
}
}
```
- LazyVim's LSP system will automatically resolve and apply these keymaps (see `lua/lazyvim/plugins/lsp/keymaps.lua`).
- Don't override standard LSP keymaps (like `K` for hover, `gd` for definition) unless absolutely necessary.
- Use standard `<leader>c*` keymaps where they make sense (e.g., `<leader>co` for organize imports).
- Refer to the R and Haskell extras for examples of proper `<localleader>` usage.

View file

@ -1,5 +1,4 @@
*LazyVim.txt* LazyVim docs *LazyVim.txt* For Neovim Last change: 2025 October 20
For Neovim Last change: 2026 June 02
============================================================================== ==============================================================================
Table of Contents *LazyVim-table-of-contents* Table of Contents *LazyVim-table-of-contents*
@ -79,26 +78,22 @@ Try it with Docker ~
Install the LazyVim Starter ~ Install the LazyVim Starter ~
- Make a backup of your current Neovim files: - Make a backup of your current Neovim files:
>sh
>sh
mv ~/.config/nvim ~/.config/nvim.bak mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak mv ~/.local/share/nvim ~/.local/share/nvim.bak
< <
- Clone the starter - Clone the starter
>sh
>sh
git clone https://github.com/LazyVim/starter ~/.config/nvim git clone https://github.com/LazyVim/starter ~/.config/nvim
< <
- Remove the `.git` folder, so you can add it to your own repo later - Remove the `.git` folder, so you can add it to your own repo later
>sh
>sh
rm -rf ~/.config/nvim/.git rm -rf ~/.config/nvim/.git
< <
- Start Neovim! - Start Neovim!
>sh
>sh
nvim nvim
< <
Refer to the comments in the files on how to customize **LazyVim**. Refer to the comments in the files on how to customize **LazyVim**.
------------------------------------------------------------------------------ ------------------------------------------------------------------------------

View file

@ -18,11 +18,7 @@ vim.api.nvim_create_autocmd({ "FocusGained", "TermClose", "TermLeave" }, {
vim.api.nvim_create_autocmd("TextYankPost", { vim.api.nvim_create_autocmd("TextYankPost", {
group = augroup("highlight_yank"), group = augroup("highlight_yank"),
callback = function() callback = function()
if vim.fn.has("nvim-0.13") == 1 then (vim.hl or vim.highlight).on_yank()
vim.hl.hl_op()
else
(vim.hl or vim.highlight).on_yank()
end
end, end,
}) })
@ -60,7 +56,6 @@ vim.api.nvim_create_autocmd("FileType", {
pattern = { pattern = {
"PlenaryTestPopup", "PlenaryTestPopup",
"checkhealth", "checkhealth",
"dap-float",
"dbout", "dbout",
"gitsigns-blame", "gitsigns-blame",
"grug-far", "grug-far",

View file

@ -3,7 +3,7 @@ _G.LazyVim = require("lazyvim.util")
---@class LazyVimConfig: LazyVimOptions ---@class LazyVimConfig: LazyVimOptions
local M = {} local M = {}
M.version = "16.0.0" -- x-release-please-version M.version = "15.10.1" -- x-release-please-version
LazyVim.config = M LazyVim.config = M
---@class LazyVimOptions ---@class LazyVimOptions
@ -34,9 +34,7 @@ local defaults = {
dots = "󰇘", dots = "󰇘",
}, },
ft = { ft = {
octo = "", octo = "",
gh = "",
["markdown.gh"] = "",
}, },
dap = { dap = {
Stopped = { "󰁕 ", "DiagnosticWarn", "DapStoppedLine" }, Stopped = { "󰁕 ", "DiagnosticWarn", "DapStoppedLine" },
@ -348,81 +346,13 @@ function M.init()
M.json.load() M.json.load()
end end
---@alias LazyVimDefault {name: string, group: string, extra: string, import: string, enabled?: boolean, origin?: "global" | "default" | "extra" } ---@alias LazyVimDefault {name: string, extra: string, enabled?: boolean, origin?: "global" | "default" | "extra" }
---
local default_extras ---@type table<string, LazyVimDefault> local default_extras ---@type table<string, LazyVimDefault>
---@param name string
---@param extras LazyVimDefault[]
function M.register_defaults(name, extras)
assert(default_extras, "defaults should be loaded by now, this should never happen")
local valid = vim.tbl_map(function(extra)
return extra.name
end, extras) --[[@as string[] ]]
local origin = "default"
local ret ---@type LazyVimDefault?
local use ---@type string?
local global = vim.g["lazyvim_" .. name]
if vim.tbl_contains(valid, global) then
origin = "global" -- was set by the user in their config
use = global
else
if global and global ~= "auto" then
vim.notify(
("Invalid value for `vim.g.lazyvim_%s`: `%s`\nValid options are: %s"):format(
name,
global,
table.concat(valid, ", ")
),
vim.log.levels.ERROR,
{ title = "LazyVim" }
)
end
for _, extra in ipairs(extras) do
if LazyVim.has_extra(extra.extra) then
use = extra.name -- was imported by the user in their lazy spec or added by LazyExtras
origin = "extra"
break
end
end
end
use = use or valid[1] -- fallback to the first one if nothing was set
for _, extra in ipairs(extras) do
local import = "lazyvim.plugins.extras." .. extra.extra
extra = vim.deepcopy(extra)
extra.enabled = extra.name == use
extra.import = import
extra.group = name
if extra.enabled then
extra.origin = origin
ret = extra
end
default_extras[import] = extra
end
return assert(ret, "One of the extras should be enabled, this should never happen")
end
---@param group string
---@return LazyVimDefault?
function M.get_default(group)
for _, extra in pairs(M.get_defaults()) do
if extra.group == group and extra.enabled then
return extra
end
end
end
function M.get_defaults() function M.get_defaults()
if default_extras then if default_extras then
return default_extras return default_extras
end end
default_extras = {}
---@type table<string, LazyVimDefault[]> ---@type table<string, LazyVimDefault[]>
local checks = { local checks = {
picker = { picker = {
@ -446,10 +376,36 @@ function M.get_defaults()
table.insert(checks.explorer, 1, table.remove(checks.explorer, 2)) table.insert(checks.explorer, 1, table.remove(checks.explorer, 2))
end end
for name, extras in pairs(checks) do default_extras = {}
M.register_defaults(name, extras) for name, check in pairs(checks) do
local valid = {} ---@type string[]
for _, extra in ipairs(check) do
if extra.enabled ~= false then
valid[#valid + 1] = extra.name
end
end
local origin = "default"
local use = vim.g["lazyvim_" .. name]
use = vim.tbl_contains(valid, use or "auto") and use or nil
origin = use and "global" or origin
for _, extra in ipairs(use and {} or check) do
if extra.enabled ~= false and LazyVim.has_extra(extra.extra) then
use = extra.name
break
end
end
origin = use and "extra" or origin
use = use or valid[1]
for _, extra in ipairs(check) do
local import = "lazyvim.plugins.extras." .. extra.extra
extra = vim.deepcopy(extra)
extra.enabled = extra.name == use
if extra.enabled then
extra.origin = origin
end
default_extras[import] = extra
end
end end
return default_extras return default_extras
end end

View file

@ -43,9 +43,6 @@ end, { desc = "Delete Buffer" })
map("n", "<leader>bo", function() map("n", "<leader>bo", function()
Snacks.bufdelete.other() Snacks.bufdelete.other()
end, { desc = "Delete Other Buffers" }) end, { desc = "Delete Other Buffers" })
map("n", "<leader>bi", function()
Snacks.bufdelete.invisible()
end, { desc = "Delete Invisible Buffers" })
map("n", "<leader>bD", "<cmd>:bd<cr>", { desc = "Delete Buffer and Window" }) map("n", "<leader>bD", "<cmd>:bd<cr>", { desc = "Delete Buffer and Window" })
-- Clear search and stop snippet on escape -- Clear search and stop snippet on escape
@ -192,8 +189,8 @@ map("n", "<leader>L", function() LazyVim.news.changelog() end, { desc = "LazyVim
-- floating terminal -- floating terminal
map("n", "<leader>fT", function() Snacks.terminal() end, { desc = "Terminal (cwd)" }) map("n", "<leader>fT", function() Snacks.terminal() end, { desc = "Terminal (cwd)" })
map("n", "<leader>ft", function() Snacks.terminal(nil, { cwd = LazyVim.root() }) end, { desc = "Terminal (Root Dir)" }) map("n", "<leader>ft", function() Snacks.terminal(nil, { cwd = LazyVim.root() }) end, { desc = "Terminal (Root Dir)" })
map({"n","t"}, "<c-/>",function() Snacks.terminal.focus(nil, { cwd = LazyVim.root() }) end, { desc = "Terminal (Root Dir)" }) map({"n","t"}, "<c-/>",function() Snacks.terminal(nil, { cwd = LazyVim.root() }) end, { desc = "Terminal (Root Dir)" })
map({"n","t"}, "<c-_>",function() Snacks.terminal.focus(nil, { cwd = LazyVim.root() }) end, { desc = "which_key_ignore" }) map({"n","t"}, "<c-_>",function() Snacks.terminal(nil, { cwd = LazyVim.root() }) end, { desc = "which_key_ignore" })
-- windows -- windows
map("n", "<leader>-", "<C-W>s", { desc = "Split Window Below", remap = true }) map("n", "<leader>-", "<C-W>s", { desc = "Split Window Below", remap = true })
@ -210,6 +207,3 @@ map("n", "<leader><tab><tab>", "<cmd>tabnew<cr>", { desc = "New Tab" })
map("n", "<leader><tab>]", "<cmd>tabnext<cr>", { desc = "Next Tab" }) map("n", "<leader><tab>]", "<cmd>tabnext<cr>", { desc = "Next Tab" })
map("n", "<leader><tab>d", "<cmd>tabclose<cr>", { desc = "Close Tab" }) map("n", "<leader><tab>d", "<cmd>tabclose<cr>", { desc = "Close Tab" })
map("n", "<leader><tab>[", "<cmd>tabprevious<cr>", { desc = "Previous Tab" }) map("n", "<leader><tab>[", "<cmd>tabprevious<cr>", { desc = "Previous Tab" })
-- lua
map({"n", "x"}, "<localleader>r", function() Snacks.debug.run() end, { desc = "Run Lua", ft = "lua" })

View file

@ -54,7 +54,7 @@ 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 -- only set clipboard if not in ssh, to make sure the OSC 52
-- integration works automatically. -- integration works automatically.
opt.clipboard = vim.env.SSH_CONNECTION and "" or "unnamedplus" -- Sync with system clipboard opt.clipboard = vim.env.SSH_TTY and "" or "unnamedplus" -- Sync with system clipboard
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

View file

@ -82,7 +82,6 @@ return {
{ path = "LazyVim", words = { "LazyVim" } }, { path = "LazyVim", words = { "LazyVim" } },
{ path = "snacks.nvim", words = { "Snacks" } }, { path = "snacks.nvim", words = { "Snacks" } },
{ path = "lazy.nvim", words = { "LazyVim" } }, { path = "lazy.nvim", words = { "LazyVim" } },
{ path = "nvim-lspconfig", words = { "lspconfig.settings" } },
}, },
}, },
}, },

View file

@ -11,9 +11,6 @@ return {
selection = { selection = {
hint_display = "none", hint_display = "none",
}, },
behaviour = {
auto_set_keymaps = false,
},
}, },
cmd = { cmd = {
"AvanteAsk", "AvanteAsk",

View file

@ -5,7 +5,7 @@ if lazyvim_docs then
end end
if LazyVim.has_extra("ai.copilot-native") then if LazyVim.has_extra("ai.copilot-native") then
if vim.fn.has("nvim-0.12") == 0 then if not vim.lsp.inline_completion then
LazyVim.error("You need Neovim >= 0.12 to use the `ai.copilot-native` extra.") LazyVim.error("You need Neovim >= 0.12 to use the `ai.copilot-native` extra.")
return {} return {}
end end

View file

@ -70,58 +70,60 @@ return {
end, end,
}, },
vim.g.ai_cmp and { vim.g.ai_cmp
-- copilot cmp source and {
{ -- copilot cmp source
"hrsh7th/nvim-cmp",
optional = true,
dependencies = { -- this will only be evaluated if nvim-cmp is enabled
{ {
"zbirenbaum/copilot-cmp", "hrsh7th/nvim-cmp",
opts = {}, optional = true,
config = function(_, opts) dependencies = { -- this will only be evaluated if nvim-cmp is enabled
local copilot_cmp = require("copilot_cmp")
copilot_cmp.setup(opts)
-- attach cmp source whenever copilot attaches
-- fixes lazy-loading issues with the copilot cmp source
Snacks.util.lsp.on({ name = "copilot" }, function()
copilot_cmp._on_insert_enter({})
end)
end,
specs = {
{ {
"hrsh7th/nvim-cmp", "zbirenbaum/copilot-cmp",
optional = true, opts = {},
---@param opts cmp.ConfigSchema config = function(_, opts)
opts = function(_, opts) local copilot_cmp = require("copilot_cmp")
table.insert(opts.sources, 1, { copilot_cmp.setup(opts)
name = "copilot", -- attach cmp source whenever copilot attaches
group_index = 1, -- fixes lazy-loading issues with the copilot cmp source
priority = 100, LazyVim.lsp.on_attach(function()
}) copilot_cmp._on_insert_enter({})
end, "copilot")
end, end,
specs = {
{
"hrsh7th/nvim-cmp",
optional = true,
---@param opts cmp.ConfigSchema
opts = function(_, opts)
table.insert(opts.sources, 1, {
name = "copilot",
group_index = 1,
priority = 100,
})
end,
},
},
}, },
}, },
}, },
}, {
}, "saghen/blink.cmp",
{ optional = true,
"saghen/blink.cmp", dependencies = { "fang2hou/blink-copilot" },
optional = true, opts = {
dependencies = { "fang2hou/blink-copilot" }, sources = {
opts = { default = { "copilot" },
sources = { providers = {
default = { "copilot" }, copilot = {
providers = { name = "copilot",
copilot = { module = "blink-copilot",
name = "copilot", score_offset = 100,
module = "blink-copilot", async = true,
score_offset = 100, },
async = true, },
}, },
}, },
}, },
}, }
}, or nil,
} or nil,
} }

View file

@ -65,15 +65,6 @@ return {
return true return true
end end
end end
Snacks.toggle({
name = "Sidekick NES",
get = function()
return require("sidekick.nes").enabled
end,
set = function(state)
require("sidekick.nes").enable(state)
end,
}):map("<leader>uN")
end, end,
-- stylua: ignore -- stylua: ignore
keys = { keys = {
@ -82,8 +73,8 @@ return {
{ "<leader>a", "", desc = "+ai", mode = { "n", "v" } }, { "<leader>a", "", desc = "+ai", mode = { "n", "v" } },
{ {
"<c-.>", "<c-.>",
function() require("sidekick.cli").focus() end, function() require("sidekick.cli").toggle() end,
desc = "Sidekick Focus", desc = "Sidekick Toggle",
mode = { "n", "t", "i", "x" }, mode = { "n", "t", "i", "x" },
}, },
{ {

View file

@ -5,9 +5,6 @@ return {
desc = "Better Yank/Paste", desc = "Better Yank/Paste",
event = "LazyFile", event = "LazyFile",
opts = { opts = {
system_clipboard = {
sync_with_ring = not vim.env.SSH_CONNECTION,
},
highlight = { timer = 150 }, highlight = { timer = 150 },
}, },
keys = { keys = {

View file

@ -53,6 +53,20 @@ return {
cyclic = true, cyclic = true,
}) })
local weekdays = augend.constant.new({
elements = {
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday",
},
word = true,
cyclic = true,
})
local months = augend.constant.new({ local months = augend.constant.new({
elements = { elements = {
"January", "January",
@ -72,6 +86,15 @@ return {
cyclic = true, cyclic = true,
}) })
local capitalized_boolean = augend.constant.new({
elements = {
"True",
"False",
},
word = true,
cyclic = true,
})
return { return {
dials_by_ft = { dials_by_ft = {
css = "css", css = "css",
@ -93,12 +116,11 @@ return {
augend.integer.alias.decimal_int, -- nonnegative and negative decimal number augend.integer.alias.decimal_int, -- nonnegative and negative decimal number
augend.integer.alias.hex, -- nonnegative hex number (0x01, 0x1a1f, etc.) augend.integer.alias.hex, -- nonnegative hex number (0x01, 0x1a1f, etc.)
augend.date.alias["%Y/%m/%d"], -- date (2022/02/19, etc.) augend.date.alias["%Y/%m/%d"], -- date (2022/02/19, etc.)
augend.constant.alias.en_weekday, -- Mon, Tue, ..., Sat, Sun
augend.constant.alias.en_weekday_full, -- Monday, Tuesday, ..., Saturday, Sunday
ordinal_numbers, ordinal_numbers,
weekdays,
months, months,
capitalized_boolean,
augend.constant.alias.bool, -- boolean value (true <-> false) augend.constant.alias.bool, -- boolean value (true <-> false)
augend.constant.alias.Bool, -- boolean value (True <-> False)
logical_alias, logical_alias,
}, },
vue = { vue = {

View file

@ -227,7 +227,7 @@ return {
{ "<leader>fR", LazyVim.pick("oldfiles", { cwd = vim.uv.cwd() }), desc = "Recent (cwd)" }, { "<leader>fR", LazyVim.pick("oldfiles", { cwd = vim.uv.cwd() }), desc = "Recent (cwd)" },
-- git -- git
{ "<leader>gc", "<cmd>FzfLua git_commits<CR>", desc = "Commits" }, { "<leader>gc", "<cmd>FzfLua git_commits<CR>", desc = "Commits" },
{ "<leader>gd", "<cmd>FzfLua git_diff<cr>", desc = "Git Diff (files)" }, { "<leader>gd", "<cmd>FzfLua git_diff<cr>", desc = "Git Diff (hunks)" },
{ "<leader>gl", "<cmd>FzfLua git_commits<CR>", desc = "Commits" }, { "<leader>gl", "<cmd>FzfLua git_commits<CR>", desc = "Commits" },
{ "<leader>gs", "<cmd>FzfLua git_status<CR>", desc = "Status" }, { "<leader>gs", "<cmd>FzfLua git_status<CR>", desc = "Status" },
{ "<leader>gS", "<cmd>FzfLua git_stash<cr>", desc = "Git Stash" }, { "<leader>gS", "<cmd>FzfLua git_stash<cr>", desc = "Git Stash" },
@ -289,18 +289,15 @@ return {
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
opts = { opts = function()
servers = { local Keys = require("lazyvim.plugins.lsp.keymaps").get()
-- stylua: ignore -- stylua: ignore
["*"] = { vim.list_extend(Keys, {
keys = { { "gd", "<cmd>FzfLua lsp_definitions jump1=true ignore_current_line=true<cr>", desc = "Goto Definition", has = "definition" },
{ "gd", "<cmd>FzfLua lsp_definitions jump1=true ignore_current_line=true<cr>", desc = "Goto Definition", has = "definition" }, { "gr", "<cmd>FzfLua lsp_references jump1=true ignore_current_line=true<cr>", desc = "References", nowait = true },
{ "gr", "<cmd>FzfLua lsp_references jump1=true ignore_current_line=true<cr>", desc = "References", nowait = true }, { "gI", "<cmd>FzfLua lsp_implementations jump1=true ignore_current_line=true<cr>", desc = "Goto Implementation" },
{ "gI", "<cmd>FzfLua lsp_implementations jump1=true ignore_current_line=true<cr>", desc = "Goto Implementation" }, { "gy", "<cmd>FzfLua lsp_typedefs jump1=true ignore_current_line=true<cr>", desc = "Goto T[y]pe Definition" },
{ "gy", "<cmd>FzfLua lsp_typedefs jump1=true ignore_current_line=true<cr>", desc = "Goto T[y]pe Definition" }, })
} end,
},
},
},
}, },
} }

View file

@ -12,24 +12,19 @@ return {
-- LSP Keymaps -- LSP Keymaps
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
opts = { opts = function()
servers = { local keys = require("lazyvim.plugins.lsp.keymaps").get()
["*"] = { keys[#keys + 1] = {
keys = { "<leader>cr",
{ function()
"<leader>cr", local inc_rename = require("inc_rename")
function() return ":" .. inc_rename.config.cmd_name .. " " .. vim.fn.expand("<cword>")
local inc_rename = require("inc_rename") end,
return ":" .. inc_rename.config.cmd_name .. " " .. vim.fn.expand("<cword>") expr = true,
end, desc = "Rename (inc-rename.nvim)",
expr = true, has = "rename",
desc = "Rename (inc-rename.nvim)", }
has = "rename", end,
},
},
},
},
},
}, },
--- Noice integration --- Noice integration

View file

@ -4,7 +4,7 @@ return {
-- easily jump to any location and enhanced f/t motions for Leap -- easily jump to any location and enhanced f/t motions for Leap
{ {
url = "https://codeberg.org/andyg/leap.nvim.git", "ggandor/flit.nvim",
enabled = true, enabled = true,
keys = function() keys = function()
---@type LazyKeysSpec[] ---@type LazyKeysSpec[]
@ -17,7 +17,7 @@ return {
opts = { labeled_modes = "nx" }, opts = { labeled_modes = "nx" },
}, },
{ {
url = "https://codeberg.org/andyg/leap.nvim.git", "ggandor/leap.nvim",
enabled = true, enabled = true,
keys = { keys = {
{ "s", mode = { "n", "x", "o" }, desc = "Leap Forward to" }, { "s", mode = { "n", "x", "o" }, desc = "Leap Forward to" },

View file

@ -7,11 +7,13 @@ return {
lazy = true, lazy = true,
init = function() init = function()
vim.g.navic_silence = true vim.g.navic_silence = true
LazyVim.lsp.on_attach(function(client, buffer)
if client:supports_method("textDocument/documentSymbol") then
require("nvim-navic").attach(client, buffer)
end
end)
end, end,
opts = function() opts = function()
Snacks.util.lsp.on({ method = "textDocument/documentSymbol" }, function(buffer, client)
require("nvim-navic").attach(client, buffer)
end)
return { return {
separator = " ", separator = " ",
highlight = true, highlight = true,

View file

@ -8,20 +8,29 @@ return {
}, },
{ {
"stevearc/overseer.nvim", "stevearc/overseer.nvim",
lazy = false, -- plugin is self-lazy-loading
cmd = { cmd = {
"OverseerOpen", "OverseerOpen",
"OverseerClose", "OverseerClose",
"OverseerToggle", "OverseerToggle",
"OverseerSaveBundle",
"OverseerLoadBundle",
"OverseerDeleteBundle",
"OverseerRunCmd",
"OverseerRun", "OverseerRun",
"OverseerInfo",
"OverseerBuild",
"OverseerQuickAction",
"OverseerTaskAction", "OverseerTaskAction",
"OverseerClearCache",
}, },
opts = { opts = {
dap = false, dap = false,
task_list = { task_list = {
keymaps = { bindings = {
["<C-h>"] = false,
["<C-j>"] = false, ["<C-j>"] = false,
["<C-k>"] = false, ["<C-k>"] = false,
["<C-l>"] = false,
}, },
}, },
form = { form = {
@ -29,6 +38,11 @@ return {
winblend = 0, winblend = 0,
}, },
}, },
confirm = {
win_opts = {
winblend = 0,
},
},
task_win = { task_win = {
win_opts = { win_opts = {
winblend = 0, winblend = 0,
@ -37,9 +51,13 @@ return {
}, },
-- stylua: ignore -- stylua: ignore
keys = { keys = {
{ "<leader>ow", "<cmd>OverseerToggle!<cr>", desc = "Task list" }, { "<leader>ow", "<cmd>OverseerToggle<cr>", desc = "Task list" },
{ "<leader>oo", "<cmd>OverseerRun<cr>", desc = "Run task" }, { "<leader>oo", "<cmd>OverseerRun<cr>", desc = "Run task" },
{ "<leader>ot", "<cmd>OverseerTaskAction<cr>", desc = "Task action" }, { "<leader>oq", "<cmd>OverseerQuickAction<cr>", desc = "Action recent task" },
{ "<leader>oi", "<cmd>OverseerInfo<cr>", desc = "Overseer Info" },
{ "<leader>ob", "<cmd>OverseerBuild<cr>", desc = "Task builder" },
{ "<leader>ot", "<cmd>OverseerTaskAction<cr>", desc = "Task action" },
{ "<leader>oc", "<cmd>OverseerClearCache<cr>", desc = "Clear cache" },
}, },
}, },
{ {

View file

@ -1,64 +1,95 @@
if LazyVim.has_extra("editor.refactoring") then local pick = function()
if vim.fn.has("nvim-0.12") == 0 then local refactoring = require("refactoring")
LazyVim.error("refactoring.nvim requires Neovim 0.12 or higher", { title = "refactoring.nvim" }) if LazyVim.pick.picker.name == "telescope" then
return {} return require("telescope").extensions.refactoring.refactors()
elseif LazyVim.pick.picker.name == "fzf" then
local fzf_lua = require("fzf-lua")
local results = refactoring.get_refactors()
local opts = {
fzf_opts = {},
fzf_colors = true,
actions = {
["default"] = function(selected)
refactoring.refactor(selected[1])
end,
},
}
fzf_lua.fzf_exec(results, opts)
else
refactoring.select_refactor()
end end
end end
return { return {
{ "lewis6991/async.nvim", lazy = true },
{ {
"ThePrimeagen/refactoring.nvim", "ThePrimeagen/refactoring.nvim",
event = { "BufReadPre", "BufNewFile" }, event = { "BufReadPre", "BufNewFile" },
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-treesitter/nvim-treesitter",
},
keys = { keys = {
{ "<leader>r", "", desc = "+refactor", mode = { "n", "x" } }, { "<leader>r", "", desc = "+refactor", mode = { "n", "x" } },
{ {
"<leader>rs", "<leader>rs",
function() pick,
return require("refactoring").select_refactor()
end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Select Refactor", desc = "Refactor",
}, },
{ {
"<leader>ri", "<leader>ri",
function() function()
return require("refactoring").inline_var() return require("refactoring").refactor("Inline Variable")
end, end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Inline Variable", desc = "Inline Variable",
expr = true, expr = true,
}, },
{ {
"<leader>rP", "<leader>rb",
function() function()
return require("refactoring.debug").print_loc({ output_location = "below" }) return require("refactoring").refactor("Extract Block")
end,
desc = "Debug Print Location",
expr = true,
},
{
"<leader>rp",
function()
return require("refactoring.debug").print_var({ output_location = "below" }) .. "iw"
end, end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Debug Print Variable", desc = "Extract Block",
expr = true,
},
{
"<leader>rc",
function()
return require("refactoring.debug").cleanup({ restore_view = true }) .. "ag"
end,
desc = "Debug Cleanup",
expr = true, expr = true,
}, },
{ {
"<leader>rf", "<leader>rf",
function() function()
return require("refactoring").extract_func() return require("refactoring").refactor("Extract Block To File")
end,
mode = { "n", "x" },
desc = "Extract Block To File",
expr = true,
},
{
"<leader>rP",
function()
require("refactoring").debug.printf({ below = false })
end,
desc = "Debug Print",
},
{
"<leader>rp",
function()
require("refactoring").debug.print_var({ normal = true })
end,
mode = { "n", "x" },
desc = "Debug Print Variable",
},
{
"<leader>rc",
function()
require("refactoring").debug.cleanup({})
end,
desc = "Debug Cleanup",
},
{
"<leader>rf",
function()
return require("refactoring").refactor("Extract Function")
end, end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Extract Function", desc = "Extract Function",
@ -67,7 +98,7 @@ return {
{ {
"<leader>rF", "<leader>rF",
function() function()
return require("refactoring").extract_func_to_file() return require("refactoring").refactor("Extract Function To File")
end, end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Extract Function To File", desc = "Extract Function To File",
@ -76,13 +107,52 @@ return {
{ {
"<leader>rx", "<leader>rx",
function() function()
return require("refactoring").extract_var() return require("refactoring").refactor("Extract Variable")
end, end,
mode = { "n", "x" }, mode = { "n", "x" },
desc = "Extract Variable", desc = "Extract Variable",
expr = true, expr = true,
}, },
{
"<leader>rp",
function()
require("refactoring").debug.print_var()
end,
mode = { "n", "x" },
desc = "Debug Print Variable",
},
}, },
opts = {}, opts = {
prompt_func_return_type = {
go = false,
java = false,
cpp = false,
c = false,
h = false,
hpp = false,
cxx = false,
},
prompt_func_param_type = {
go = false,
java = false,
cpp = false,
c = false,
h = false,
hpp = false,
cxx = false,
},
printf_statements = {},
print_var_statements = {},
show_success_message = true, -- shows a message with information about the refactor on success
-- i.e. [Refactor] Inlined 3 variable occurrences
},
config = function(_, opts)
require("refactoring").setup(opts)
if LazyVim.has("telescope.nvim") then
LazyVim.on_load("telescope.nvim", function()
require("telescope").load_extension("refactoring")
end)
end
end,
}, },
} }

View file

@ -73,13 +73,8 @@ return {
{ "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" }, { "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" },
-- git -- git
{ "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (hunks)" }, { "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (hunks)" },
{ "<leader>gD", function() Snacks.picker.git_diff({ base = "origin", group = true }) end, desc = "Git Diff (origin)" },
{ "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git Status" }, { "<leader>gs", function() Snacks.picker.git_status() end, desc = "Git Status" },
{ "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" }, { "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" },
{ "<leader>gi", function() Snacks.picker.gh_issue() end, desc = "GitHub Issues (open)" },
{ "<leader>gI", function() Snacks.picker.gh_issue({ state = "all" }) end, desc = "GitHub Issues (all)" },
{ "<leader>gp", function() Snacks.picker.gh_pr() end, desc = "GitHub Pull Requests (open)" },
{ "<leader>gP", function() Snacks.picker.gh_pr({ state = "all" }) end, desc = "GitHub Pull Requests (all)" },
-- Grep -- Grep
{ "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, { "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" },
{ "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" }, { "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" },
@ -139,23 +134,18 @@ return {
}, },
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
opts = { opts = function()
servers = { local Keys = require("lazyvim.plugins.lsp.keymaps").get()
["*"] = { -- stylua: ignore
-- stylua: ignore vim.list_extend(Keys, {
keys = { { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition", has = "definition" },
{ "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition", has = "definition" }, { "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" },
{ "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" }, { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" },
{ "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" }, { "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" },
{ "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" }, { "<leader>ss", function() Snacks.picker.lsp_symbols({ filter = LazyVim.config.kind_filter }) end, desc = "LSP Symbols", has = "documentSymbol" },
{ "<leader>ss", function() Snacks.picker.lsp_symbols({ filter = LazyVim.config.kind_filter }) end, desc = "LSP Symbols", has = "documentSymbol" }, { "<leader>sS", function() Snacks.picker.lsp_workspace_symbols({ filter = LazyVim.config.kind_filter }) end, desc = "LSP Workspace Symbols", has = "workspace/symbols" },
{ "<leader>sS", function() Snacks.picker.lsp_workspace_symbols({ filter = LazyVim.config.kind_filter }) end, desc = "LSP Workspace Symbols", has = "workspace/symbols" }, })
{ "gai", function() Snacks.picker.lsp_incoming_calls() end, desc = "C[a]lls Incoming", has = "callHierarchy/incomingCalls" }, end,
{ "gao", function() Snacks.picker.lsp_outgoing_calls() end, desc = "C[a]lls Outgoing", has = "callHierarchy/outgoingCalls" },
},
},
},
},
}, },
{ {
"folke/todo-comments.nvim", "folke/todo-comments.nvim",

View file

@ -284,18 +284,15 @@ return {
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
opts = { opts = function()
servers = { local Keys = require("lazyvim.plugins.lsp.keymaps").get()
["*"] = { -- stylua: ignore
-- stylua: ignore vim.list_extend(Keys, {
keys = { { "gd", function() require("telescope.builtin").lsp_definitions({ reuse_win = true }) end, desc = "Goto Definition", has = "definition" },
{ "gd", function() require("telescope.builtin").lsp_definitions({ reuse_win = true }) end, desc = "Goto Definition", has = "definition" }, { "gr", "<cmd>Telescope lsp_references<cr>", desc = "References", nowait = true },
{ "gr", "<cmd>Telescope lsp_references<cr>", desc = "References", nowait = true }, { "gI", function() require("telescope.builtin").lsp_implementations({ reuse_win = true }) end, desc = "Goto Implementation" },
{ "gI", function() require("telescope.builtin").lsp_implementations({ reuse_win = true }) end, desc = "Goto Implementation" }, { "gy", function() require("telescope.builtin").lsp_type_definitions({ reuse_win = true }) end, desc = "Goto T[y]pe Definition" },
{ "gy", function() require("telescope.builtin").lsp_type_definitions({ reuse_win = true }) end, desc = "Goto T[y]pe Definition" }, })
}, end,
},
},
},
}, },
} }

View file

@ -1,5 +1,3 @@
---@module "conform"
---@diagnostic disable: inject-field ---@diagnostic disable: inject-field
if lazyvim_docs then if lazyvim_docs then
-- Enable this option to avoid conflicts with Prettier. -- Enable this option to avoid conflicts with Prettier.
@ -10,7 +8,6 @@ end
local supported = { local supported = {
"astro", "astro",
"css", "css",
"scss",
"graphql", "graphql",
-- "html", -- "html",
"javascript", "javascript",
@ -26,35 +23,24 @@ local supported = {
} }
return { return {
recommended = function()
return LazyVim.extras.wants({
root = { "biome.json", "biome.jsonc" },
})
end,
{ {
"neovim/nvim-lspconfig", "mason-org/mason.nvim",
opts = { opts = { ensure_installed = { "biome" } },
servers = {
---@type lspconfig.settings.biome
biome = {},
},
},
}, },
{ {
"stevearc/conform.nvim", "stevearc/conform.nvim",
optional = true, optional = true,
---@param opts conform.setupOpts ---@param opts ConformOpts
opts = function(_, opts) opts = function(_, opts)
opts.formatters_by_ft = opts.formatters_by_ft or {} opts.formatters_by_ft = opts.formatters_by_ft or {}
for _, ft in ipairs(supported) do for _, ft in ipairs(supported) do
opts.formatters_by_ft[ft] = opts.formatters_by_ft[ft] or {} opts.formatters_by_ft[ft] = opts.formatters_by_ft[ft] or {}
table.insert(opts.formatters_by_ft[ft], "biome-check") table.insert(opts.formatters_by_ft[ft], "biome")
end end
opts.formatters = opts.formatters or {} opts.formatters = opts.formatters or {}
opts.formatters["biome-check"] = { opts.formatters.biome = {
require_cwd = true, require_cwd = true,
} }
end, end,

View file

@ -35,10 +35,10 @@ return {
}, },
setup = { setup = {
angularls = function() angularls = function()
Snacks.util.lsp.on({ name = "angularls" }, function(_, client) LazyVim.lsp.on_attach(function(client)
--HACK: disable angular renaming capability due to duplicate rename popping up --HACK: disable angular renaming capability due to duplicate rename popping up
client.server_capabilities.renameProvider = false client.server_capabilities.renameProvider = false
end) end, "angularls")
end, end,
}, },
}, },

View file

@ -23,7 +23,8 @@ return {
{ {
"p00f/clangd_extensions.nvim", "p00f/clangd_extensions.nvim",
ft = { "c", "cpp", "objc", "objcpp" }, lazy = true,
config = function() end,
opts = { opts = {
inlay_hints = { inlay_hints = {
inline = false, inline = false,
@ -93,6 +94,13 @@ return {
}, },
}, },
}, },
setup = {
clangd = function(_, opts)
local clangd_ext_opts = LazyVim.opts("clangd_extensions.nvim")
require("clangd_extensions").setup(vim.tbl_deep_extend("force", clangd_ext_opts or {}, { server = opts }))
return false
end,
},
}, },
}, },

View file

@ -52,6 +52,7 @@ return {
event = "LazyFile", event = "LazyFile",
config = function(_, _) config = function(_, _)
require("conjure.main").main() require("conjure.main").main()
require("conjure.mapping")["on-filetype"]()
end, end,
init = function() init = function()
-- print color codes if baleia.nvim is available -- print color codes if baleia.nvim is available

View file

@ -20,6 +20,11 @@ return {
{ {
"stevearc/conform.nvim", "stevearc/conform.nvim",
opts = { opts = {
formatters = {
dart_format = {
args = { "format", "--line-length", "120" },
},
},
formatters_by_ft = { formatters_by_ft = {
dart = { "dart_format" }, dart = { "dart_format" },
}, },

View file

@ -16,8 +16,6 @@ return {
function() function()
local params = vim.lsp.util.make_position_params() local params = vim.lsp.util.make_position_params()
LazyVim.lsp.execute({ LazyVim.lsp.execute({
title = "toPipe",
filter = "elixirls",
command = "manipulatePipes:serverid", command = "manipulatePipes:serverid",
arguments = { "toPipe", params.textDocument.uri, params.position.line, params.position.character }, arguments = { "toPipe", params.textDocument.uri, params.position.line, params.position.character },
}) })
@ -29,8 +27,6 @@ return {
function() function()
local params = vim.lsp.util.make_position_params() local params = vim.lsp.util.make_position_params()
LazyVim.lsp.execute({ LazyVim.lsp.execute({
title = "fromPipe",
filter = "elixirls",
command = "manipulatePipes:serverid", command = "manipulatePipes:serverid",
arguments = { "fromPipe", params.textDocument.uri, params.position.line, params.position.character }, arguments = { "fromPipe", params.textDocument.uri, params.position.line, params.position.character },
}) })

View file

@ -2,7 +2,7 @@ return {
recommended = function() recommended = function()
return LazyVim.extras.wants({ return LazyVim.extras.wants({
ft = { "handlebars", "typescript", "javascript", "typescript.glimmer", "javascript.glimmer" }, ft = { "handlebars", "typescript", "javascript", "typescript.glimmer", "javascript.glimmer" },
root = { "ember-cli-build.js" }, root = { "ember-cli-build.js", ".git" },
}) })
end, end,
{ {

View file

@ -14,9 +14,6 @@ return {
opts = { opts = {
servers = { servers = {
gopls = { gopls = {
init_options = {
semanticTokens = true,
},
settings = { settings = {
gopls = { gopls = {
gofumpt = true, gofumpt = true,
@ -49,6 +46,7 @@ return {
completeUnimported = true, completeUnimported = true,
staticcheck = true, staticcheck = true,
directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" }, directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" },
semanticTokens = true,
}, },
}, },
}, },
@ -57,13 +55,8 @@ return {
gopls = function(_, opts) gopls = function(_, opts)
-- workaround for gopls not supporting semanticTokensProvider -- workaround for gopls not supporting semanticTokensProvider
-- https://github.com/golang/go/issues/54531#issuecomment-1464982242 -- https://github.com/golang/go/issues/54531#issuecomment-1464982242
Snacks.util.lsp.on({ name = "gopls" }, function(_, client) LazyVim.lsp.on_attach(function(client, _)
if if not client.server_capabilities.semanticTokensProvider then
client.config
and client.config.init_options
and client.config.init_options.semanticTokens
and not client.server_capabilities.semanticTokensProvider
then
local semantic = client.config.capabilities.textDocument.semanticTokens local semantic = client.config.capabilities.textDocument.semanticTokens
client.server_capabilities.semanticTokensProvider = { client.server_capabilities.semanticTokensProvider = {
full = true, full = true,
@ -74,7 +67,7 @@ return {
range = true, range = true,
} }
end end
end) end, "gopls")
-- end workaround -- end workaround
end, end,
}, },

View file

@ -38,15 +38,30 @@ return {
logLevel = "error", logLevel = "error",
}, },
}, },
keys = {
{
"<leader>co",
LazyVim.lsp.action["source.organizeImports"],
desc = "Organize Imports",
},
},
},
ruff_lsp = {
keys = {
{
"<leader>co",
LazyVim.lsp.action["source.organizeImports"],
desc = "Organize Imports",
},
},
}, },
ruff_lsp = {},
}, },
setup = { setup = {
[ruff] = function() [ruff] = function()
Snacks.util.lsp.on({ name = ruff }, function(_, client) LazyVim.lsp.on_attach(function(client, _)
-- Disable hover in favor of Pyright -- Disable hover in favor of Pyright
client.server_capabilities.hoverProvider = false client.server_capabilities.hoverProvider = false
end) end, ruff)
end, end,
}, },
}, },
@ -99,7 +114,6 @@ return {
opts = { opts = {
options = { options = {
notify_user_on_venv_activation = true, notify_user_on_venv_activation = true,
override_notify = false,
}, },
}, },
-- Call config for Python files and load the cached venv automatically -- Call config for Python files and load the cached venv automatically

View file

@ -2,7 +2,7 @@ return {
recommended = function() recommended = function()
return LazyVim.extras.wants({ return LazyVim.extras.wants({
ft = "r", ft = "r",
root = { "*.R", "*.Rmd", "*.qmd" }, root = { "*.R", "*.Rmd", "*qmd" },
}) })
end, end,
{ {

View file

@ -32,6 +32,12 @@ return {
formatters_by_ft = { formatters_by_ft = {
solidity = { "forge_fmt" }, solidity = { "forge_fmt" },
}, },
formatters = {
forge_fmt = {
command = "forge",
args = { "fmt" },
},
},
}, },
}, },
} }

View file

@ -23,7 +23,15 @@ return {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
opts = { opts = {
servers = { servers = {
svelte = {}, svelte = {
keys = {
{
"<leader>co",
LazyVim.lsp.action["source.organizeImports"],
desc = "Organize Imports",
},
},
},
}, },
}, },
}, },

View file

@ -0,0 +1,340 @@
return {
recommended = function()
return LazyVim.extras.wants({
ft = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
root = { "tsconfig.json", "package.json", "jsconfig.json" },
})
end,
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = {
-- make sure mason installs the server
servers = {
--- @deprecated -- tsserver renamed to ts_ls but not yet released, so keep this for now
--- the proper approach is to check the nvim-lspconfig release version when it's released to determine the server name dynamically
tsserver = {
enabled = false,
},
ts_ls = {
enabled = false,
},
vtsls = {
-- explicitly add default filetypes, so that we can extend
-- them in related extras
filetypes = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
settings = {
complete_function_calls = true,
vtsls = {
enableMoveToFileCodeAction = true,
autoUseWorkspaceTsdk = true,
experimental = {
maxInlayHintLength = 30,
completion = {
enableServerSideFuzzyMatch = true,
},
},
},
typescript = {
updateImportsOnFileMove = { enabled = "always" },
suggest = {
completeFunctionCalls = true,
},
inlayHints = {
enumMemberValues = { enabled = true },
functionLikeReturnTypes = { enabled = true },
parameterNames = { enabled = "literals" },
parameterTypes = { enabled = true },
propertyDeclarationTypes = { enabled = true },
variableTypes = { enabled = false },
},
},
},
keys = {
{
"gD",
function()
local win = vim.api.nvim_get_current_win()
local params = vim.lsp.util.make_position_params(win, "utf-16")
LazyVim.lsp.execute({
command = "typescript.goToSourceDefinition",
arguments = { params.textDocument.uri, params.position },
open = true,
})
end,
desc = "Goto Source Definition",
},
{
"gR",
function()
LazyVim.lsp.execute({
command = "typescript.findAllFileReferences",
arguments = { vim.uri_from_bufnr(0) },
open = true,
})
end,
desc = "File References",
},
{
"<leader>co",
LazyVim.lsp.action["source.organizeImports"],
desc = "Organize Imports",
},
{
"<leader>cM",
LazyVim.lsp.action["source.addMissingImports.ts"],
desc = "Add missing imports",
},
{
"<leader>cu",
LazyVim.lsp.action["source.removeUnused.ts"],
desc = "Remove unused imports",
},
{
"<leader>cD",
LazyVim.lsp.action["source.fixAll.ts"],
desc = "Fix all diagnostics",
},
{
"<leader>cV",
function()
LazyVim.lsp.execute({ command = "typescript.selectTypeScriptVersion" })
end,
desc = "Select TS workspace version",
},
},
},
},
setup = {
--- @deprecated -- tsserver renamed to ts_ls but not yet released, so keep this for now
--- the proper approach is to check the nvim-lspconfig release version when it's released to determine the server name dynamically
tsserver = function()
-- disable tsserver
return true
end,
ts_ls = function()
-- disable tsserver
return true
end,
vtsls = function(_, opts)
if vim.lsp.config.denols and vim.lsp.config.vtsls then
---@param server string
local resolve = function(server)
local markers, root_dir = vim.lsp.config[server].root_markers, vim.lsp.config[server].root_dir
vim.lsp.config(server, {
root_dir = function(bufnr, on_dir)
local is_deno = vim.fs.root(bufnr, { "deno.json", "deno.jsonc" }) ~= nil
if is_deno == (server == "denols") then
if root_dir then
return root_dir(bufnr, on_dir)
elseif type(markers) == "table" then
local root = vim.fs.root(bufnr, markers)
return root and on_dir(root)
end
end
end,
})
end
resolve("denols")
resolve("vtsls")
end
LazyVim.lsp.on_attach(function(client, buffer)
client.commands["_typescript.moveToFileRefactoring"] = function(command, ctx)
---@type string, string, lsp.Range
local action, uri, range = unpack(command.arguments)
local function move(newf)
client:request("workspace/executeCommand", {
command = command.command,
arguments = { action, uri, range, newf },
})
end
local fname = vim.uri_to_fname(uri)
client:request("workspace/executeCommand", {
command = "typescript.tsserverRequest",
arguments = {
"getMoveToRefactoringFileSuggestions",
{
file = fname,
startLine = range.start.line + 1,
startOffset = range.start.character + 1,
endLine = range["end"].line + 1,
endOffset = range["end"].character + 1,
},
},
}, function(_, result)
---@type string[]
local files = result.body.files
table.insert(files, 1, "Enter new path...")
vim.ui.select(files, {
prompt = "Select move destination:",
format_item = function(f)
return vim.fn.fnamemodify(f, ":~:.")
end,
}, function(f)
if f and f:find("^Enter new path") then
vim.ui.input({
prompt = "Enter move destination:",
default = vim.fn.fnamemodify(fname, ":h") .. "/",
completion = "file",
}, function(newf)
return newf and move(newf)
end)
elseif f then
move(f)
end
end)
end)
end
end, "vtsls")
-- copy typescript settings to javascript
opts.settings.javascript =
vim.tbl_deep_extend("force", {}, opts.settings.typescript, opts.settings.javascript or {})
end,
},
},
},
{
"mfussenegger/nvim-dap",
optional = true,
dependencies = {
{
"mason-org/mason.nvim",
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
table.insert(opts.ensure_installed, "js-debug-adapter")
end,
},
},
opts = function()
local dap = require("dap")
for _, adapterType in ipairs({ "node", "chrome", "msedge" }) do
local pwaType = "pwa-" .. adapterType
if not dap.adapters[pwaType] then
dap.adapters[pwaType] = {
type = "server",
host = "localhost",
port = "${port}",
executable = {
command = "js-debug-adapter",
args = { "${port}" },
},
}
end
-- Define adapters without the "pwa-" prefix for VSCode compatibility
if not dap.adapters[adapterType] then
dap.adapters[adapterType] = function(cb, config)
local nativeAdapter = dap.adapters[pwaType]
config.type = pwaType
if type(nativeAdapter) == "function" then
nativeAdapter(cb, config)
else
cb(nativeAdapter)
end
end
end
end
local js_filetypes = { "typescript", "javascript", "typescriptreact", "javascriptreact" }
local vscode = require("dap.ext.vscode")
vscode.type_to_filetypes["node"] = js_filetypes
vscode.type_to_filetypes["pwa-node"] = js_filetypes
for _, language in ipairs(js_filetypes) do
if not dap.configurations[language] then
local runtimeExecutable = nil
if language:find("typescript") then
runtimeExecutable = vim.fn.executable("tsx") == 1 and "tsx" or "ts-node"
end
dap.configurations[language] = {
{
type = "pwa-node",
request = "launch",
name = "Launch file",
program = "${file}",
cwd = "${workspaceFolder}",
sourceMaps = true,
runtimeExecutable = runtimeExecutable,
skipFiles = {
"<node_internals>/**",
"node_modules/**",
},
resolveSourceMapLocations = {
"${workspaceFolder}/**",
"!**/node_modules/**",
},
},
{
type = "pwa-node",
request = "attach",
name = "Attach",
processId = require("dap.utils").pick_process,
cwd = "${workspaceFolder}",
sourceMaps = true,
runtimeExecutable = runtimeExecutable,
skipFiles = {
"<node_internals>/**",
"node_modules/**",
},
resolveSourceMapLocations = {
"${workspaceFolder}/**",
"!**/node_modules/**",
},
},
}
end
end
end,
},
{
"jay-babu/mason-nvim-dap.nvim",
optional = true,
opts = {
-- chrome adapter is deprecated, use js-debug-adapter instead
automatic_installation = { exclude = { "chrome" } },
},
},
-- Filetype icons
{
"nvim-mini/mini.icons",
opts = {
file = {
[".eslintrc.js"] = { glyph = "󰱺", hl = "MiniIconsYellow" },
[".node-version"] = { glyph = "", hl = "MiniIconsGreen" },
[".prettierrc"] = { glyph = "", hl = "MiniIconsPurple" },
[".yarnrc.yml"] = { glyph = "", hl = "MiniIconsBlue" },
["eslint.config.js"] = { glyph = "󰱺", hl = "MiniIconsYellow" },
["package.json"] = { glyph = "", hl = "MiniIconsGreen" },
["tsconfig.json"] = { glyph = "", hl = "MiniIconsAzure" },
["tsconfig.build.json"] = { glyph = "", hl = "MiniIconsAzure" },
["yarn.lock"] = { glyph = "", hl = "MiniIconsBlue" },
},
},
},
}

View file

@ -1,171 +0,0 @@
if lazyvim_docs then
-- LSP Server to use for TypeScript.
---@type "vtsls" | "tsgo"
vim.g.lazyvim_ts_lsp = "vtsls" -- currently the default
-- To use the newer, much faster `tsgo` LSP server, either:
-- * enable the `tsgo` extra, or
-- * set `vim.g.lazyvim_ts_lsp = "tsgo"` in your `options.lua`
end
local extra = LazyVim.config.register_defaults("ts_lsp", {
{ name = "vtsls", extra = "lang.typescript.vtsls" },
{ name = "tsgo", extra = "lang.typescript.tsgo" },
})
return {
recommended = function()
return LazyVim.extras.wants({
ft = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
root = { "tsconfig.json", "package.json", "jsconfig.json" },
})
end,
{ import = extra.import },
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = function(_, opts)
local lsp = extra.name or "vtsls"
local servers = { "tsserver", "ts_ls", "vtsls", "tsgo", lsp }
for _, server in ipairs(servers) do
opts.servers[server] = opts.servers[server] or {}
opts.servers[server].enabled = server == lsp
end
end,
},
{
"mfussenegger/nvim-dap",
optional = true,
dependencies = {
{
"mason-org/mason.nvim",
opts = function(_, opts)
opts.ensure_installed = opts.ensure_installed or {}
table.insert(opts.ensure_installed, "js-debug-adapter")
end,
},
},
opts = function()
local dap = require("dap")
for _, adapterType in ipairs({ "node", "chrome", "msedge" }) do
local pwaType = "pwa-" .. adapterType
if not dap.adapters[pwaType] then
dap.adapters[pwaType] = {
type = "server",
host = "localhost",
port = "${port}",
executable = {
command = "js-debug-adapter",
args = { "${port}" },
},
}
end
-- Define adapters without the "pwa-" prefix for VSCode compatibility
if not dap.adapters[adapterType] then
dap.adapters[adapterType] = function(cb, config)
local nativeAdapter = dap.adapters[pwaType]
config.type = pwaType
if type(nativeAdapter) == "function" then
nativeAdapter(cb, config)
else
cb(nativeAdapter)
end
end
end
end
local js_filetypes = { "typescript", "javascript", "typescriptreact", "javascriptreact" }
local vscode = require("dap.ext.vscode")
vscode.type_to_filetypes["node"] = js_filetypes
vscode.type_to_filetypes["pwa-node"] = js_filetypes
for _, language in ipairs(js_filetypes) do
if not dap.configurations[language] then
local runtimeExecutable = nil
if language:find("typescript") then
runtimeExecutable = vim.fn.executable("tsx") == 1 and "tsx" or "ts-node"
end
dap.configurations[language] = {
{
type = "pwa-node",
request = "launch",
name = "Launch file",
program = "${file}",
cwd = "${workspaceFolder}",
sourceMaps = true,
runtimeExecutable = runtimeExecutable,
skipFiles = {
"<node_internals>/**",
"node_modules/**",
},
resolveSourceMapLocations = {
"${workspaceFolder}/**",
"!**/node_modules/**",
},
},
{
type = "pwa-node",
request = "attach",
name = "Attach",
processId = require("dap.utils").pick_process,
cwd = "${workspaceFolder}",
sourceMaps = true,
runtimeExecutable = runtimeExecutable,
skipFiles = {
"<node_internals>/**",
"node_modules/**",
},
resolveSourceMapLocations = {
"${workspaceFolder}/**",
"!**/node_modules/**",
},
},
}
end
end
end,
},
{
"jay-babu/mason-nvim-dap.nvim",
optional = true,
opts = {
-- chrome adapter is deprecated, use js-debug-adapter instead
automatic_installation = { exclude = { "chrome" } },
},
},
-- Filetype icons
{
"nvim-mini/mini.icons",
opts = {
file = {
[".eslintrc.js"] = { glyph = "󰱺", hl = "MiniIconsYellow" },
[".node-version"] = { glyph = "", hl = "MiniIconsGreen" },
[".prettierrc"] = { glyph = "", hl = "MiniIconsPurple" },
[".yarnrc.yml"] = { glyph = "", hl = "MiniIconsBlue" },
["eslint.config.js"] = { glyph = "󰱺", hl = "MiniIconsYellow" },
["package.json"] = { glyph = "", hl = "MiniIconsGreen" },
["tsconfig.json"] = { glyph = "", hl = "MiniIconsAzure" },
["tsconfig.build.json"] = { glyph = "", hl = "MiniIconsAzure" },
["yarn.lock"] = { glyph = "", hl = "MiniIconsBlue" },
},
},
},
}

View file

@ -1,68 +0,0 @@
local supported = {
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"json",
"jsonc",
"vue",
"svelte",
"astro",
}
return {
recommended = function()
return LazyVim.extras.wants({
root = {
".oxlintrc.json",
".oxlintrc.jsonc",
"oxlint.config.ts",
".oxfmtrc.json",
".oxfmtrc.jsonc",
"oxfmt.config.ts",
},
})
end,
{
"neovim/nvim-lspconfig",
opts = {
servers = {
---@type lspconfig.settings.oxlint
oxlint = {
root_dir = function(bufnr, on_dir)
-- prefer the top-level oxlint config if it exists (monorepo support)
local git = vim.fs.root(bufnr, ".git")
local markers = { ".oxlintrc.json", ".oxlintrc.jsonc", "oxlint.config.ts" }
local root = git and vim.fs.root(git, markers) or vim.fs.root(bufnr, markers)
if root then
on_dir(root)
end
end,
settings = {
fixKind = "all",
},
},
--- disable the oxfmt lsp server since we use conform for formatting
oxfmt = { enabled = false },
},
},
},
{
"mason-org/mason.nvim",
opts = { ensure_installed = { "oxfmt" } },
},
{
"stevearc/conform.nvim",
optional = true,
opts = function(_, opts)
opts.formatters_by_ft = opts.formatters_by_ft or {}
for _, ft in ipairs(supported) do
opts.formatters_by_ft[ft] = opts.formatters_by_ft[ft] or {}
table.insert(opts.formatters_by_ft[ft], "oxfmt")
end
end,
},
}

View file

@ -1,58 +0,0 @@
return {
recommended = function()
return LazyVim.extras.wants({
ft = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
root = { "tsconfig.json", "package.json", "jsconfig.json" },
})
end,
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = {
-- make sure mason installs the server
servers = {
---@type lspconfig.settings.tsgo
tsgo = {
-- explicitly add default filetypes, so that we can extend
-- them in related extras
filetypes = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
settings = {
typescript = {
inlayHints = {
enumMemberValues = { enabled = true },
functionLikeReturnTypes = { enabled = false },
parameterNames = {
enabled = "literals",
suppressWhenArgumentMatchesName = true,
},
parameterTypes = { enabled = true },
propertyDeclarationTypes = { enabled = true },
variableTypes = { enabled = false },
},
},
},
},
},
},
},
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = {},
},
}

View file

@ -1,174 +0,0 @@
return {
recommended = function()
return LazyVim.extras.wants({
ft = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
root = { "tsconfig.json", "package.json", "jsconfig.json" },
})
end,
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = {
-- make sure mason installs the server
servers = {
vtsls = {
-- explicitly add default filetypes, so that we can extend
-- them in related extras
filetypes = {
"javascript",
"javascriptreact",
"javascript.jsx",
"typescript",
"typescriptreact",
"typescript.tsx",
},
settings = {
complete_function_calls = true,
vtsls = {
enableMoveToFileCodeAction = true,
autoUseWorkspaceTsdk = true,
experimental = {
maxInlayHintLength = 30,
completion = {
enableServerSideFuzzyMatch = true,
},
},
},
typescript = {
updateImportsOnFileMove = { enabled = "always" },
suggest = {
completeFunctionCalls = true,
},
inlayHints = {
enumMemberValues = { enabled = true },
functionLikeReturnTypes = { enabled = true },
parameterNames = { enabled = "literals" },
parameterTypes = { enabled = true },
propertyDeclarationTypes = { enabled = true },
variableTypes = { enabled = false },
},
},
},
keys = {
{
"gD",
function()
local win = vim.api.nvim_get_current_win()
local params = vim.lsp.util.make_position_params(win, "utf-16")
LazyVim.lsp.execute({
command = "typescript.goToSourceDefinition",
arguments = { params.textDocument.uri, params.position },
open = true,
})
end,
desc = "Goto Source Definition",
},
{
"gR",
function()
LazyVim.lsp.execute({
command = "typescript.findAllFileReferences",
arguments = { vim.uri_from_bufnr(0) },
open = true,
})
end,
desc = "File References",
},
{
"<leader>cM",
LazyVim.lsp.action["source.addMissingImports.ts"],
desc = "Add missing imports",
},
{
"<leader>cD",
LazyVim.lsp.action["source.fixAll.ts"],
desc = "Fix all diagnostics",
},
{
"<leader>cV",
function()
LazyVim.lsp.execute({
title = "Select TypeScript Version",
filter = "vtsls",
command = "typescript.selectTypeScriptVersion",
})
end,
desc = "Select TS workspace version",
},
},
},
},
setup = {
vtsls = function(_, opts)
Snacks.util.lsp.on({ name = "vtsls" }, function(buffer, client)
client.commands["_typescript.moveToFileRefactoring"] = function(command, ctx)
---@type string, string, lsp.Range
local action, uri, range = unpack(command.arguments)
local function move(newf)
client:request("workspace/executeCommand", {
command = command.command,
arguments = { action, uri, range, newf },
})
end
local fname = vim.uri_to_fname(uri)
client:request("workspace/executeCommand", {
command = "typescript.tsserverRequest",
arguments = {
"getMoveToRefactoringFileSuggestions",
{
file = fname,
startLine = range.start.line + 1,
startOffset = range.start.character + 1,
endLine = range["end"].line + 1,
endOffset = range["end"].character + 1,
},
},
}, function(_, result)
---@type string[]
local files = result.body.files
table.insert(files, 1, "Enter new path...")
vim.ui.select(files, {
prompt = "Select move destination:",
format_item = function(f)
return vim.fn.fnamemodify(f, ":~:.")
end,
}, function(f)
if f and f:find("^Enter new path") then
vim.ui.input({
prompt = "Enter move destination:",
default = vim.fn.fnamemodify(fname, ":h") .. "/",
completion = "file",
}, function(newf)
return newf and move(newf)
end)
elseif f then
move(f)
end
end)
end)
end
end)
-- copy typescript settings to javascript
opts.settings.javascript =
vim.tbl_deep_extend("force", {}, opts.settings.typescript, opts.settings.javascript or {})
end,
},
},
},
-- correctly setup lspconfig
{
"neovim/nvim-lspconfig",
opts = {},
},
}

View file

@ -24,8 +24,6 @@ return {
local buf_name = vim.api.nvim_buf_get_name(0) local buf_name = vim.api.nvim_buf_get_name(0)
local file_name = vim.fn.fnamemodify(buf_name, ":t") local file_name = vim.fn.fnamemodify(buf_name, ":t")
LazyVim.lsp.execute({ LazyVim.lsp.execute({
title = "Pin Main",
filter = "tinymist",
command = "tinymist.pinMain", command = "tinymist.pinMain",
arguments = { buf_name }, arguments = { buf_name },
}) })

View file

@ -55,7 +55,7 @@ return {
}, },
}, },
-- disable snacks scope when mini-indentscope is enabled -- disable snacks scroll when mini-indentscope is enabled
{ {
"snacks.nvim", "snacks.nvim",
opts = { opts = {

View file

@ -5,15 +5,10 @@ local pick_chezmoi = function()
local fzf_lua = require("fzf-lua") local fzf_lua = require("fzf-lua")
local actions = { local actions = {
["enter"] = function(selected) ["enter"] = function(selected)
fzf_lua.actions.vimcmd_entry("ChezmoiEdit", selected, { cwd = vim.env.HOME }) fzf_lua.actions.vimcmd_entry("ChezmoiEdit", selected, { cwd = os.getenv("HOME") })
end, end,
} }
fzf_lua.files({ fzf_lua.files({ cmd = "chezmoi managed --include=files,symlinks", actions = actions, hidden = false })
cmd = "chezmoi managed --include=files,symlinks",
actions = actions,
cwd = vim.env.HOME,
hidden = false,
})
elseif LazyVim.pick.picker.name == "snacks" then elseif LazyVim.pick.picker.name == "snacks" then
local results = require("chezmoi.commands").list({ local results = require("chezmoi.commands").list({
args = { args = {
@ -55,7 +50,7 @@ return {
"alker0/chezmoi.vim", "alker0/chezmoi.vim",
init = function() init = function()
vim.g["chezmoi#use_tmp_buffer"] = 1 vim.g["chezmoi#use_tmp_buffer"] = 1
vim.g["chezmoi#source_dir_path"] = vim.env.HOME .. "/.local/share/chezmoi" vim.g["chezmoi#source_dir_path"] = os.getenv("HOME") .. "/.local/share/chezmoi"
end, end,
}, },
{ {
@ -85,7 +80,7 @@ return {
init = function() init = function()
-- run chezmoi edit on file enter -- run chezmoi edit on file enter
vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, { vim.api.nvim_create_autocmd({ "BufRead", "BufNewFile" }, {
pattern = { vim.env.HOME .. "/.local/share/chezmoi/*" }, pattern = { os.getenv("HOME") .. "/.local/share/chezmoi/*" },
callback = function() callback = function()
vim.schedule(require("chezmoi.commands.__edit").watch) vim.schedule(require("chezmoi.commands.__edit").watch)
end, end,

View file

@ -39,9 +39,6 @@ M.plugin = {
group = function(_, _, data) group = function(_, _, data)
---@type string ---@type string
local match = data.full_match local match = data.full_match
if match == "#add" then
return
end
local r, g, b = match:sub(2, 2), match:sub(3, 3), match:sub(4, 4) local r, g, b = match:sub(2, 2), match:sub(3, 3), match:sub(4, 4)
local hex_color = "#" .. r .. r .. g .. g .. b .. b local hex_color = "#" .. r .. r .. g .. g .. b .. b

View file

@ -3,16 +3,6 @@ return {
-- depends on the git extra for highlighting and auto-completion of github issues/prs -- depends on the git extra for highlighting and auto-completion of github issues/prs
{ import = "lazyvim.plugins.extras.lang.git" }, { import = "lazyvim.plugins.extras.lang.git" },
{
"folke/snacks.nvim",
keys = { -- disable conflicting keymaps
{ "<leader>gi", false },
{ "<leader>gI", false },
{ "<leader>gp", false },
{ "<leader>gP", false },
},
},
-- Octo -- Octo
{ {
"pwntester/octo.nvim", "pwntester/octo.nvim",

View file

@ -7,6 +7,14 @@ if vim.fn.has("nvim-0.11.2") == 0 then
vim.fn.getchar() vim.fn.getchar()
vim.cmd([[quit]]) vim.cmd([[quit]])
return {} return {}
elseif not vim.lsp.is_enabled then
vim.schedule(function()
LazyVim.warn({
"You're using an **old** `nightly` version of **Neovim**",
"Please update to a recent `nightly`,",
"or a stable version (`>= 0.11.2`).",
})
end)
end end
require("lazyvim.config").init() require("lazyvim.config").init()

View file

@ -2,12 +2,11 @@ return {
-- lspconfig -- lspconfig
{ {
"neovim/nvim-lspconfig", "neovim/nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" }, event = "LazyFile",
dependencies = { dependencies = {
"mason.nvim", "mason.nvim",
{ "mason-org/mason-lspconfig.nvim", config = function() end }, { "mason-org/mason-lspconfig.nvim", config = function() end },
}, },
opts_extend = { "servers.*.keys" },
opts = function() opts = function()
---@class PluginLspOpts ---@class PluginLspOpts
local ret = { local ret = {
@ -52,6 +51,15 @@ return {
folds = { folds = {
enabled = true, enabled = true,
}, },
-- add any global capabilities here
capabilities = {
workspace = {
fileOperations = {
didRename = true,
willRename = true,
},
},
},
-- options for vim.lsp.buf.format -- options for vim.lsp.buf.format
-- `bufnr` and `filter` is handled by the LazyVim formatter, -- `bufnr` and `filter` is handled by the LazyVim formatter,
-- but can be also overridden when specified -- but can be also overridden when specified
@ -60,59 +68,9 @@ return {
timeout_ms = nil, timeout_ms = nil,
}, },
-- LSP Server Settings -- LSP Server Settings
-- Sets the default configuration for an LSP client (or all clients if the special name "*" is used). ---@alias lazyvim.lsp.Config vim.lsp.Config|{mason?:boolean, enabled?:boolean}
---@alias lazyvim.lsp.Config vim.lsp.Config|{mason?:boolean, enabled?:boolean, keys?:LazyKeysLspSpec[]}
---@type table<string, lazyvim.lsp.Config|boolean> ---@type table<string, lazyvim.lsp.Config|boolean>
servers = { servers = {
-- configuration for all lsp servers
["*"] = {
capabilities = {
workspace = {
fileOperations = {
didRename = true,
willRename = true,
},
},
},
-- stylua: ignore
keys = {
{ "<leader>cl", function() Snacks.picker.lsp_config() end, desc = "Lsp Info" },
{ "gd", vim.lsp.buf.definition, desc = "Goto Definition", has = "definition" },
{ "gr", vim.lsp.buf.references, desc = "References", nowait = true },
{ "gI", vim.lsp.buf.implementation, desc = "Goto Implementation" },
{ "gy", vim.lsp.buf.type_definition, desc = "Goto T[y]pe Definition" },
{ "gD", vim.lsp.buf.declaration, desc = "Goto Declaration" },
{ "K", function() return vim.lsp.buf.hover() end, desc = "Hover" },
{ "gK", function() return vim.lsp.buf.signature_help() end, desc = "Signature Help", has = "signatureHelp" },
{ "<c-k>", function() return vim.lsp.buf.signature_help() end, mode = "i", desc = "Signature Help", has = "signatureHelp" },
{ "<leader>ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "x" }, has = "codeAction" },
{ "<leader>cc", vim.lsp.codelens.run, desc = "Run Codelens", mode = { "n", "x" }, has = "codeLens" },
{ "<leader>cC", vim.lsp.codelens.refresh, desc = "Refresh & Display Codelens", mode = { "n" }, has = "codeLens" },
{ "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename File", mode ={"n"}, has = { "workspace/didRenameFiles", "workspace/willRenameFiles" } },
{ "<leader>cr", vim.lsp.buf.rename, desc = "Rename", has = "rename" },
{ "<leader>cA", LazyVim.lsp.action.source, desc = "Source Action", has = "codeAction" },
{ "]]", function() Snacks.words.jump(vim.v.count1) end, has = "documentHighlight",
desc = "Next Reference", enabled = function() return Snacks.words.is_enabled() end },
{ "[[", function() Snacks.words.jump(-vim.v.count1) end, has = "documentHighlight",
desc = "Prev Reference", enabled = function() return Snacks.words.is_enabled() end },
{ "<a-n>", function() Snacks.words.jump(vim.v.count1, true) end, has = "documentHighlight",
desc = "Next Reference", enabled = function() return Snacks.words.is_enabled() end },
{ "<a-p>", function() Snacks.words.jump(-vim.v.count1, true) end, has = "documentHighlight",
desc = "Prev Reference", enabled = function() return Snacks.words.is_enabled() end },
{
"<leader>co",
LazyVim.lsp.action["source.organizeImports"],
desc = "Organize Imports",
has = "codeAction",
enabled = function(buf)
local code_actions = vim.tbl_filter(function(action)
return action:find("^source%.organizeImports%.?$")
end, LazyVim.lsp.code_actions({ bufnr = buf }))
return #code_actions > 0
end
},
},
},
stylua = { enabled = false }, stylua = { enabled = false },
lua_ls = { lua_ls = {
-- mason = false, -- set to false if you don't want this server to be installed with mason -- mason = false, -- set to false if you don't want this server to be installed with mason
@ -162,23 +120,21 @@ return {
return ret return ret
end, end,
---@param opts PluginLspOpts ---@param opts PluginLspOpts
config = function(_, opts) config = vim.schedule_wrap(function(_, opts)
-- setup autoformat -- setup autoformat
LazyVim.format.register(LazyVim.lsp.formatter()) LazyVim.format.register(LazyVim.lsp.formatter())
-- setup keymaps -- setup keymaps
local names = vim.tbl_keys(opts.servers) ---@type string[] LazyVim.lsp.on_attach(function(client, buffer)
table.sort(names) require("lazyvim.plugins.lsp.keymaps").on_attach(client, buffer)
for _, server in ipairs(names) do end)
local server_opts = opts.servers[server]
if type(server_opts) == "table" and server_opts.keys then LazyVim.lsp.setup()
require("lazyvim.plugins.lsp.keymaps").set({ name = server ~= "*" and server or nil }, server_opts.keys) LazyVim.lsp.on_dynamic_capability(require("lazyvim.plugins.lsp.keymaps").on_attach)
end
end
-- inlay hints -- inlay hints
if opts.inlay_hints.enabled then if opts.inlay_hints.enabled then
Snacks.util.lsp.on({ method = "textDocument/inlayHint" }, function(buffer) LazyVim.lsp.on_supports_method("textDocument/inlayHint", function(client, buffer)
if if
vim.api.nvim_buf_is_valid(buffer) vim.api.nvim_buf_is_valid(buffer)
and vim.bo[buffer].buftype == "" and vim.bo[buffer].buftype == ""
@ -191,7 +147,7 @@ return {
-- folds -- folds
if opts.folds.enabled then if opts.folds.enabled then
Snacks.util.lsp.on({ method = "textDocument/foldingRange" }, function() LazyVim.lsp.on_supports_method("textDocument/foldingRange", function(client, buffer)
if LazyVim.set_default("foldmethod", "expr") then if LazyVim.set_default("foldmethod", "expr") then
LazyVim.set_default("foldexpr", "v:lua.vim.lsp.foldexpr()") LazyVim.set_default("foldexpr", "v:lua.vim.lsp.foldexpr()")
end end
@ -200,7 +156,7 @@ return {
-- code lens -- code lens
if opts.codelens.enabled and vim.lsp.codelens then if opts.codelens.enabled and vim.lsp.codelens then
Snacks.util.lsp.on({ method = "textDocument/codeLens" }, function(buffer) LazyVim.lsp.on_supports_method("textDocument/codeLens", function(client, buffer)
vim.lsp.codelens.refresh() vim.lsp.codelens.refresh()
vim.api.nvim_create_autocmd({ "BufEnter", "CursorHold", "InsertLeave" }, { vim.api.nvim_create_autocmd({ "BufEnter", "CursorHold", "InsertLeave" }, {
buffer = buffer, buffer = buffer,
@ -224,14 +180,7 @@ return {
vim.diagnostic.config(vim.deepcopy(opts.diagnostics)) vim.diagnostic.config(vim.deepcopy(opts.diagnostics))
if opts.capabilities then if opts.capabilities then
LazyVim.deprecate("lsp-config.opts.capabilities", "Use lsp-config.opts.servers['*'].capabilities instead") vim.lsp.config("*", { capabilities = opts.capabilities })
opts.servers["*"] = vim.tbl_deep_extend("force", opts.servers["*"] or {}, {
capabilities = opts.capabilities,
})
end
if opts.servers["*"] then
vim.lsp.config("*", opts.servers["*"])
end end
-- get all the servers that are available through mason-lspconfig -- get all the servers that are available through mason-lspconfig
@ -243,9 +192,6 @@ return {
---@return boolean? exclude automatic setup ---@return boolean? exclude automatic setup
local function configure(server) local function configure(server)
if server == "*" then
return false
end
local sopts = opts.servers[server] local sopts = opts.servers[server]
sopts = sopts == true and {} or (not sopts) and { enabled = false } or sopts --[[@as lazyvim.lsp.Config]] sopts = sopts == true and {} or (not sopts) and { enabled = false } or sopts --[[@as lazyvim.lsp.Config]]
@ -274,7 +220,7 @@ return {
automatic_enable = { exclude = mason_exclude }, automatic_enable = { exclude = mason_exclude },
}) })
end end
end, end),
}, },
-- cmdline tools and lsp servers -- cmdline tools and lsp servers

View file

@ -1,65 +1,97 @@
local M = {} local M = {}
---@type LazyKeysLspSpec[]|nil ---@type LazyKeysLspSpec[]|nil
M._keys = {} M._keys = nil
---@alias LazyKeysLspSpec LazyKeysSpec|{has?:string|string[], enabled?:(fun(buf:number):boolean)} ---@alias LazyKeysLspSpec LazyKeysSpec|{has?:string|string[], cond?:fun():boolean}
---@alias LazyKeysLsp LazyKeys|{has?:string|string[], enabled?:fun(buf:number):boolean} ---@alias LazyKeysLsp LazyKeys|{has?:string|string[], cond?:fun():boolean}
---@deprecated
---@return LazyKeysLspSpec[] ---@return LazyKeysLspSpec[]
function M.get() function M.get()
LazyVim.warn({ if M._keys then
'Adding LSP keymaps via `require("lazyvim.plugins.lsp.keymaps").get()` is deprecated.', return M._keys
"Please set keymaps via the `keys` field in the LSP server config.", end
[[ -- stylua: ignore
```lua M._keys = {
{ { "<leader>cl", function() Snacks.picker.lsp_config() end, desc = "Lsp Info" },
"neovim/nvim-lspconfig", { "gd", vim.lsp.buf.definition, desc = "Goto Definition", has = "definition" },
opts = { { "gr", vim.lsp.buf.references, desc = "References", nowait = true },
servers = { { "gI", vim.lsp.buf.implementation, desc = "Goto Implementation" },
['*'] = { { "gy", vim.lsp.buf.type_definition, desc = "Goto T[y]pe Definition" },
keys = { { "gD", vim.lsp.buf.declaration, desc = "Goto Declaration" },
{ "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", has = "definition"}, { "K", function() return vim.lsp.buf.hover() end, desc = "Hover" },
}, { "gK", function() return vim.lsp.buf.signature_help() end, desc = "Signature Help", has = "signatureHelp" },
}, { "<c-k>", function() return vim.lsp.buf.signature_help() end, mode = "i", desc = "Signature Help", has = "signatureHelp" },
}, { "<leader>ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "x" }, has = "codeAction" },
}, { "<leader>cc", vim.lsp.codelens.run, desc = "Run Codelens", mode = { "n", "x" }, has = "codeLens" },
} { "<leader>cC", vim.lsp.codelens.refresh, desc = "Refresh & Display Codelens", mode = { "n" }, has = "codeLens" },
```]], { "<leader>cR", function() Snacks.rename.rename_file() end, desc = "Rename File", mode ={"n"}, has = { "workspace/didRenameFiles", "workspace/willRenameFiles" } },
}, { stacktrace = true }) { "<leader>cr", vim.lsp.buf.rename, desc = "Rename", has = "rename" },
vim.schedule(function() { "<leader>cA", LazyVim.lsp.action.source, desc = "Source Action", has = "codeAction" },
if #M._keys > 0 then { "]]", function() Snacks.words.jump(vim.v.count1) end, has = "documentHighlight",
M.set({}, M._keys) desc = "Next Reference", cond = function() return Snacks.words.is_enabled() end },
M._keys = {} { "[[", function() Snacks.words.jump(-vim.v.count1) end, has = "documentHighlight",
end desc = "Prev Reference", cond = function() return Snacks.words.is_enabled() end },
end) { "<a-n>", function() Snacks.words.jump(vim.v.count1, true) end, has = "documentHighlight",
desc = "Next Reference", cond = function() return Snacks.words.is_enabled() end },
{ "<a-p>", function() Snacks.words.jump(-vim.v.count1, true) end, has = "documentHighlight",
desc = "Prev Reference", cond = function() return Snacks.words.is_enabled() end },
}
return M._keys return M._keys
end end
---@param filter vim.lsp.get_clients.Filter ---@param method string|string[]
---@param spec LazyKeysLspSpec[] function M.has(buffer, method)
function M.set(filter, spec) if type(method) == "table" then
local Keys = require("lazy.core.handler.keys") for _, m in ipairs(method) do
for _, keys in pairs(Keys.resolve(spec)) do if M.has(buffer, m) then
---@cast keys LazyKeysLsp return true
local filters = {} ---@type vim.lsp.get_clients.Filter[]
if keys.has then
local methods = type(keys.has) == "string" and { keys.has } or keys.has --[[@as string[] ]]
for _, method in ipairs(methods) do
method = method:find("/") and method or ("textDocument/" .. method)
filters[#filters + 1] = vim.tbl_extend("force", vim.deepcopy(filter), { method = method })
end end
else
filters[#filters + 1] = filter
end end
return false
end
method = method:find("/") and method or "textDocument/" .. method
local clients = vim.lsp.get_clients({ bufnr = buffer })
for _, client in ipairs(clients) do
if client:supports_method(method) then
return true
end
end
return false
end
for _, f in ipairs(filters) do ---@return LazyKeysLsp[]
function M.resolve(buffer)
local Keys = require("lazy.core.handler.keys")
if not Keys.resolve then
return {}
end
local spec = vim.tbl_extend("force", {}, M.get())
local opts = LazyVim.opts("nvim-lspconfig")
local clients = vim.lsp.get_clients({ bufnr = buffer })
for _, client in ipairs(clients) do
local maps = opts.servers[client.name] and opts.servers[client.name].keys or {}
vim.list_extend(spec, maps)
end
return Keys.resolve(spec)
end
function M.on_attach(_, buffer)
local Keys = require("lazy.core.handler.keys")
local keymaps = M.resolve(buffer)
for _, keys in pairs(keymaps) do
local has = not keys.has or M.has(buffer, keys.has)
local cond = not (keys.cond == false or ((type(keys.cond) == "function") and not keys.cond()))
if has and cond then
local opts = Keys.opts(keys) local opts = Keys.opts(keys)
---@cast opts snacks.keymap.set.Opts opts.cond = nil
opts.lsp = f opts.has = nil
opts.enabled = keys.enabled opts.silent = opts.silent ~= false
Snacks.keymap.set(keys.mode or "n", keys.lhs, keys.rhs, opts) opts.buffer = buffer
vim.keymap.set(keys.mode or "n", keys.lhs, keys.rhs, opts)
end end
end end
end end

View file

@ -6,7 +6,6 @@ return {
{ {
"nvim-treesitter/nvim-treesitter", "nvim-treesitter/nvim-treesitter",
branch = "main", branch = "main",
commit = vim.fn.has("nvim-0.12") == 0 and "7caec274fd19c12b55902a5b795100d21531391f" or nil,
version = false, -- last release is way too old and doesn't work on Windows version = false, -- last release is way too old and doesn't work on Windows
build = function() build = function()
local TS = require("nvim-treesitter") local TS = require("nvim-treesitter")
@ -38,6 +37,7 @@ return {
"javascript", "javascript",
"jsdoc", "jsdoc",
"json", "json",
"jsonc",
"lua", "lua",
"luadoc", "luadoc",
"luap", "luap",
@ -171,26 +171,19 @@ return {
for method, keymaps in pairs(moves) do for method, keymaps in pairs(moves) do
for key, query in pairs(keymaps) do for key, query in pairs(keymaps) do
local queries = type(query) == "table" and query or { query } local desc = query:gsub("@", ""):gsub("%..*", "")
local parts = {} desc = desc:sub(1, 1):upper() .. desc:sub(2)
for _, q in ipairs(queries) do
local part = q:gsub("@", ""):gsub("%..*", "")
part = part:sub(1, 1):upper() .. part:sub(2)
table.insert(parts, part)
end
local desc = table.concat(parts, " or ")
desc = (key:sub(1, 1) == "[" and "Prev " or "Next ") .. desc desc = (key:sub(1, 1) == "[" and "Prev " or "Next ") .. desc
desc = desc .. (key:sub(2, 2) == key:sub(2, 2):upper() and " End" or " Start") desc = desc .. (key:sub(2, 2) == key:sub(2, 2):upper() and " End" or " Start")
vim.keymap.set({ "n", "x", "o" }, key, function() if not (vim.wo.diff and key:find("[cC]")) then
if vim.wo.diff and key:find("[cC]") then vim.keymap.set({ "n", "x", "o" }, key, function()
return vim.cmd("normal! " .. key) require("nvim-treesitter-textobjects.move")[method](query, "textobjects")
end end, {
require("nvim-treesitter-textobjects.move")[method](query, "textobjects") buffer = buf,
end, { desc = desc,
buffer = buf, silent = true,
desc = desc, })
silent = true, end
})
end end
end end
end end

View file

@ -15,7 +15,6 @@ return {
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next Buffer" }, { "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next Buffer" },
{ "[B", "<cmd>BufferLineMovePrev<cr>", desc = "Move buffer prev" }, { "[B", "<cmd>BufferLineMovePrev<cr>", desc = "Move buffer prev" },
{ "]B", "<cmd>BufferLineMoveNext<cr>", desc = "Move buffer next" }, { "]B", "<cmd>BufferLineMoveNext<cr>", desc = "Move buffer next" },
{ "<leader>bj", "<cmd>BufferLinePick<cr>", desc = "Pick Buffer" },
}, },
opts = { opts = {
options = { options = {

View file

@ -23,8 +23,8 @@ return {
nav_j = { "<C-j>", term_nav("j"), desc = "Go to Lower Window", expr = true, mode = "t" }, nav_j = { "<C-j>", term_nav("j"), desc = "Go to Lower Window", expr = true, mode = "t" },
nav_k = { "<C-k>", term_nav("k"), desc = "Go to Upper Window", expr = true, mode = "t" }, nav_k = { "<C-k>", term_nav("k"), desc = "Go to Upper Window", expr = true, mode = "t" },
nav_l = { "<C-l>", term_nav("l"), desc = "Go to Right Window", expr = true, mode = "t" }, nav_l = { "<C-l>", term_nav("l"), desc = "Go to Right Window", expr = true, mode = "t" },
hide_slash = { "<C-/>", "hide", desc = "Hide Terminal", mode = "t" }, hide_slash = { "<C-/>", "hide", desc = "Hide Terminal", mode = { "t", "n" } },
hide_underscore = { "<c-_>", "hide", desc = "which_key_ignore", mode = "t" }, hide_underscore = { "<c-_>", "hide", desc = "which_key_ignore", mode = { "t", "n" } },
}, },
}, },
}, },

View file

@ -6,22 +6,6 @@ M.moved = {
rename_file = { "Snacks.rename.rename_file" }, rename_file = { "Snacks.rename.rename_file" },
on_rename = { "Snacks.rename.on_rename_file" }, on_rename = { "Snacks.rename.on_rename_file" },
words = { "Snacks.words" }, words = { "Snacks.words" },
on_supports_method = {
"Snacks.util.lsp.on",
fn = function(method, cb)
return Snacks.util.lsp.on({ method = method }, function(buffer, client)
cb(client, buffer)
end)
end,
},
on_attach = {
"Snacks.util.lsp.on",
fn = function(cb, name)
return Snacks.util.lsp.on({ name = name }, function(buffer, client)
cb(client, buffer)
end)
end,
},
}, },
terminal = { terminal = {
open = { "Snacks.terminal" }, open = { "Snacks.terminal" },

View file

@ -65,7 +65,7 @@ function M.get()
if root then if root then
LazyVim.walk(root, function(path, name, type) LazyVim.walk(root, function(path, name, type)
if (type == "file" or type == "link") and name:match("%.lua$") then if (type == "file" or type == "link") and name:match("%.lua$") then
name = path:sub(#root + 2, -5):gsub("/", "."):gsub("%.init$", "") name = path:sub(#root + 2, -5):gsub("/", ".")
local ok, extra = pcall(M.get_extra, source, source.module .. "." .. name) local ok, extra = pcall(M.get_extra, source, source.module .. "." .. name)
if ok then if ok then
extras[#extras + 1] = extra extras[#extras + 1] = extra
@ -115,13 +115,6 @@ function M.get_extra(source, modname)
recommended = M.wants(recommended) recommended = M.wants(recommended)
end end
-- language extras that are disabled because a conflict with another extra is enabled are not recommended
local defaults = LazyVim.config.get_defaults()
local def = defaults[modname]
if def and def.enabled == false and vim.startswith(modname, "lazyvim.plugins.extras.lang.") then
recommended = false
end
---@type LazyExtra ---@type LazyExtra
return { return {
source = source, source = source,

View file

@ -221,7 +221,7 @@ function M.safe_keymap_set(mode, lhs, rhs, opts)
---@diagnostic disable-next-line: no-unknown ---@diagnostic disable-next-line: no-unknown
opts.remap = nil opts.remap = nil
end end
Snacks.keymap.set(modes, lhs, rhs, opts) vim.keymap.set(modes, lhs, rhs, opts)
end end
end end

View file

@ -1,6 +1,103 @@
---@class lazyvim.util.lsp ---@class lazyvim.util.lsp
local M = {} local M = {}
---@param on_attach fun(client:vim.lsp.Client, buffer)
---@param name? string
function M.on_attach(on_attach, name)
return vim.api.nvim_create_autocmd("LspAttach", {
callback = function(args)
local buffer = args.buf ---@type number
local client = vim.lsp.get_client_by_id(args.data.client_id)
if client and (not name or client.name == name) then
return on_attach(client, buffer)
end
end,
})
end
---@type table<string, table<vim.lsp.Client, table<number, boolean>>>
M._supports_method = {}
function M.setup()
local register_capability = vim.lsp.handlers["client/registerCapability"]
vim.lsp.handlers["client/registerCapability"] = function(err, res, ctx)
---@diagnostic disable-next-line: no-unknown
local ret = register_capability(err, res, ctx)
local client = vim.lsp.get_client_by_id(ctx.client_id)
if client then
for buffer in pairs(client.attached_buffers) do
vim.api.nvim_exec_autocmds("User", {
pattern = "LspDynamicCapability",
data = { client_id = client.id, buffer = buffer },
})
end
end
return ret
end
M.on_attach(M._check_methods)
M.on_dynamic_capability(M._check_methods)
end
---@param client vim.lsp.Client
function M._check_methods(client, buffer)
-- don't trigger on invalid buffers
if not vim.api.nvim_buf_is_valid(buffer) then
return
end
-- don't trigger on non-listed buffers
if not vim.bo[buffer].buflisted then
return
end
-- don't trigger on nofile buffers
if vim.bo[buffer].buftype == "nofile" then
return
end
for method, clients in pairs(M._supports_method) do
clients[client] = clients[client] or {}
if not clients[client][buffer] then
if client.supports_method and client:supports_method(method, buffer) then
clients[client][buffer] = true
vim.api.nvim_exec_autocmds("User", {
pattern = "LspSupportsMethod",
data = { client_id = client.id, buffer = buffer, method = method },
})
end
end
end
end
---@param fn fun(client:vim.lsp.Client, buffer):boolean?
---@param opts? {group?: integer}
function M.on_dynamic_capability(fn, opts)
return vim.api.nvim_create_autocmd("User", {
pattern = "LspDynamicCapability",
group = opts and opts.group or nil,
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
local buffer = args.data.buffer ---@type number
if client then
return fn(client, buffer)
end
end,
})
end
---@param method string
---@param fn fun(client:vim.lsp.Client, buffer)
function M.on_supports_method(method, fn)
M._supports_method[method] = M._supports_method[method] or setmetatable({}, { __mode = "k" })
return vim.api.nvim_create_autocmd("User", {
pattern = "LspSupportsMethod",
callback = function(args)
local client = vim.lsp.get_client_by_id(args.data.client_id)
local buffer = args.data.buffer ---@type number
if client and method == args.data.method then
return fn(client, buffer)
end
end,
})
end
---@param opts? LazyFormatter| {filter?: (string|vim.lsp.get_clients.Filter)} ---@param opts? LazyFormatter| {filter?: (string|vim.lsp.get_clients.Filter)}
function M.formatter(opts) function M.formatter(opts)
opts = opts or {} opts = opts or {}
@ -35,14 +132,18 @@ end
---@param opts? lsp.Client.format ---@param opts? lsp.Client.format
function M.format(opts) function M.format(opts)
opts = vim.tbl_deep_extend("force", {}, opts or {}, LazyVim.opts("nvim-lspconfig").format or {}) opts = vim.tbl_deep_extend(
"force",
{},
opts or {},
LazyVim.opts("nvim-lspconfig").format or {},
LazyVim.opts("conform.nvim").format or {}
)
local ok, conform = pcall(require, "conform") local ok, conform = pcall(require, "conform")
-- use conform for formatting with LSP when available, -- use conform for formatting with LSP when available,
-- since it has better format diffing -- since it has better format diffing
if ok then if ok then
-- It should be `nil`, otherwise it doesn't fetch options from `formatters_by_ft`, opts.formatters = {}
-- see https://github.com/stevearc/conform.nvim/blob/5420c4b5ea0aeb99c09cfbd4fd0b70d257b44f25/lua/conform/init.lua#L417-L418
opts.formatters = nil
conform.format(opts) conform.format(opts)
else else
vim.lsp.buf.format(opts) vim.lsp.buf.format(opts)
@ -66,18 +167,9 @@ M.action = setmetatable({}, {
---@class LspCommand: lsp.ExecuteCommandParams ---@class LspCommand: lsp.ExecuteCommandParams
---@field open? boolean ---@field open? boolean
---@field handler? lsp.Handler ---@field handler? lsp.Handler
---@field filter? string|vim.lsp.get_clients.Filter
---@field title? string
---@param opts LspCommand ---@param opts LspCommand
function M.execute(opts) function M.execute(opts)
local filter = opts.filter or {}
filter = type(filter) == "string" and { name = filter } or filter
local buf = vim.api.nvim_get_current_buf()
---@cast filter vim.lsp.get_clients.Filter
local client = vim.lsp.get_clients(LazyVim.merge({}, filter, { bufnr = buf }))[1]
local params = { local params = {
command = opts.command, command = opts.command,
arguments = opts.arguments, arguments = opts.arguments,
@ -88,26 +180,8 @@ function M.execute(opts)
params = params, params = params,
}) })
else else
vim.list_extend(params, { title = opts.title }) return vim.lsp.buf_request(0, "workspace/executeCommand", params, opts.handler)
return client:exec_cmd(params, { bufnr = buf }, opts.handler)
end end
end end
---@param filter? vim.lsp.get_clients.Filter
function M.code_actions(filter)
filter = filter or {}
local ret = {} ---@type string[]
local clients = vim.lsp.get_clients(filter)
for _, client in ipairs(clients) do
-- check server cababilities first
vim.list_extend(ret, vim.tbl_get(client, "server_capabilities", "codeActionProvider", "codeActionKinds") or {})
-- check dynamic capabilities
local regs = client.dynamic_capabilities:get("codeActionProvider", filter)
for _, reg in ipairs(regs or {}) do
vim.list_extend(ret, vim.tbl_get(reg, "registerOptions", "codeActionKinds") or {})
end
end
return LazyVim.dedup(ret)
end
return M return M

View file

@ -51,9 +51,7 @@ function M.open(file, opts)
end end
file = plugin.dir .. "/" .. file file = plugin.dir .. "/" .. file
elseif opts.rtp then elseif opts.rtp then
-- first check if file exists in VIMRUNTIME, then check the full runtimepath file = vim.api.nvim_get_runtime_file(file, false)[1]
local path = vim.env.VIMRUNTIME .. "/" .. file --[[@as string]]
file = vim.uv.fs_stat(path) and path or vim.api.nvim_get_runtime_file(file, false)[1]
end end
if not file then if not file then

View file

@ -28,7 +28,6 @@ M.deprecated_extras = {
} }
M.renamed_extras = { M.renamed_extras = {
["lazyvim.plugins.extras.lang.omnisharp"] = "lazyvim.plugins.extras.lang.dotnet", ["lazyvim.plugins.extras.lang.omnisharp"] = "lazyvim.plugins.extras.lang.dotnet",
["lazyvim.plugins.extras.formatting.biome"] = "lazyvim.plugins.extras.lang.typescript.biome",
} }
M.deprecated_modules = {} M.deprecated_modules = {}
@ -43,7 +42,6 @@ M.renames = {
["markdown.nvim"] = "render-markdown.nvim", ["markdown.nvim"] = "render-markdown.nvim",
["williamboman/mason.nvim"] = "mason-org/mason.nvim", ["williamboman/mason.nvim"] = "mason-org/mason.nvim",
["williamboman/mason-lspconfig.nvim"] = "mason-org/mason-lspconfig.nvim", ["williamboman/mason-lspconfig.nvim"] = "mason-org/mason-lspconfig.nvim",
["ggandor/leap.nvim"] = "https://codeberg.org/andyg/leap.nvim.git",
} }
function M.save_core() function M.save_core()
@ -111,43 +109,15 @@ function M.fix_imports()
) )
spec.import = rename spec.import = rename
end end
local dep = M.deprecated_extras[spec.import] local dep = M.deprecated_extras[spec and spec.import]
if dep then if dep then
dep = dep .. "\n" .. "Please remove the extra from `lazyvim.json` 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
local modname = spec.import
if type(modname) == "string" and vim.startswith(modname, "lazyvim.plugins.extras.") then
M.single_import(spec)
end
end) end)
end end
---@param spec LazySpecImport
function M.single_import(spec)
local modname = spec.import
if type(modname) ~= "string" then
return
end
spec.name = modname
spec.import = function()
local modinfo = vim.loader.find(modname)[1]
local modpath = modinfo and modinfo.modpath
local mod, err = loadfile(modpath)
if mod then
local ret, foo = mod()
if foo then
return nil, "Spec module returned more than one value. Expected a single value."
end
return ret
else
return nil, err
end
end
end
function M.fix_renames() function M.fix_renames()
---@param plugin LazyPluginSpec ---@param plugin LazyPluginSpec
Meta.add = LazyVim.inject.args(Meta.add, function(self, plugin) Meta.add = LazyVim.inject.args(Meta.add, function(self, plugin)

View file

@ -78,7 +78,7 @@ function M.realpath(path)
if path == "" or path == nil then if path == "" or path == nil then
return nil return nil
end end
path = vim.fn.has("win32") == 0 and vim.uv.fs_realpath(path) or path path = vim.uv.fs_realpath(path) or path
return LazyVim.norm(path) return LazyVim.norm(path)
end end

View file

@ -18,7 +18,7 @@ function M.setup(shell)
-- Setting shell command flags -- Setting shell command flags
vim.o.shellcmdflag = vim.o.shellcmdflag =
"-NoProfile -NoLogo -NonInteractive -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();$PSDefaultParameterValues['Out-File:Encoding']='utf8';$PSStyle.OutputRendering='plaintext';Remove-Alias -Force -ErrorAction SilentlyContinue tee;" "-NoLogo -NonInteractive -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();$PSDefaultParameterValues['Out-File:Encoding']='utf8';$PSStyle.OutputRendering='plaintext';Remove-Alias -Force -ErrorAction SilentlyContinue tee;"
-- Setting shell redirection -- Setting shell redirection
vim.o.shellredir = '2>&1 | %%{ "$_" } | Out-File %s; exit $LastExitCode' vim.o.shellredir = '2>&1 | %%{ "$_" } | Out-File %s; exit $LastExitCode'

View file

@ -80,6 +80,7 @@ function M.check()
["C compiler"] = have_cc, ["C compiler"] = have_cc,
tar = have("tar"), tar = have("tar"),
curl = have("curl"), curl = have("curl"),
node = have("node"),
} }
local ok = true local ok = true
for _, v in pairs(ret) do for _, v in pairs(ret) do

View file

@ -5,9 +5,6 @@ local Icons = require("mini.icons")
local Plugin = require("lazy.core.plugin") local Plugin = require("lazy.core.plugin")
_G.LazyVim = require("lazyvim.util") _G.LazyVim = require("lazyvim.util")
require("lazyvim.config")
LazyVim.config.get_defaults()
LazyVim.plugin.setup()
describe("Extra", function() describe("Extra", function()
local Config = require("lazy.core.config") local Config = require("lazy.core.config")
@ -80,12 +77,10 @@ describe("Extra", function()
it("it has no renamed plugins", function() it("it has no renamed plugins", function()
for _, p in pairs(spec.plugins) do for _, p in pairs(spec.plugins) do
local short_url = p[1] local short_url = p[1]
if short_url then assert(
assert( not LazyVim.plugin.renames[short_url],
not LazyVim.plugin.renames[short_url], "Plugin " .. short_url .. " has been renamed to " .. (LazyVim.plugin.renames[short_url] or "")
"Plugin " .. short_url .. " has been renamed to " .. (LazyVim.plugin.renames[short_url] or "") )
)
end
end end
end) end)
@ -96,13 +91,8 @@ describe("Extra", function()
local mason = spec.plugins["mason.nvim"] local mason = spec.plugins["mason.nvim"]
local mason_opts = Plugin.values(mason, "opts", false) local mason_opts = Plugin.values(mason, "opts", false)
for lsp, lsp_opts in pairs(lspconfig_opts.servers or {}) do for lsp in pairs(lspconfig_opts.servers or {}) do
local lsp_pkg = lsp_to_pkg[lsp] local lsp_pkg = lsp_to_pkg[lsp]
-- Skip if the LSP server is disabled in the config since mason.nvim won't install it
-- and it might still be used for conform.nvim or nvim-lint, etc.
if type(lsp_opts) == "table" and lsp_opts.enabled == false then
lsp_pkg = false
end
assert( assert(
not (lsp_pkg and vim.tbl_contains(mason_opts.ensure_installed, lsp_pkg)), not (lsp_pkg and vim.tbl_contains(mason_opts.ensure_installed, lsp_pkg)),
"LSP server " "LSP server "