mirror of
https://github.com/LazyVim/LazyVim.git
synced 2026-07-25 14:01:06 +00:00
Merge branch 'LazyVim:main' into main
This commit is contained in:
commit
96735a3988
83 changed files with 6098 additions and 1081 deletions
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
blank_issues_enabled: false
|
||||||
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
|
|
@ -36,7 +36,7 @@ jobs:
|
||||||
uses: kdheepak/panvimdoc@main
|
uses: kdheepak/panvimdoc@main
|
||||||
with:
|
with:
|
||||||
vimdoc: LazyVim
|
vimdoc: LazyVim
|
||||||
version: "Neovim >= 0.8.0"
|
version: "Neovim >= 0.9.0"
|
||||||
demojify: true
|
demojify: true
|
||||||
treesitter: true
|
treesitter: true
|
||||||
- name: Push changes
|
- name: Push changes
|
||||||
|
|
@ -59,6 +59,8 @@ jobs:
|
||||||
with:
|
with:
|
||||||
release-type: simple
|
release-type: simple
|
||||||
package-name: LazyVim
|
package-name: LazyVim
|
||||||
|
extra-files: |
|
||||||
|
lua/lazyvim/config/init.lua
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: tag stable versions
|
- name: tag stable versions
|
||||||
if: ${{ steps.release.outputs.release_created }}
|
if: ${{ steps.release.outputs.release_created }}
|
||||||
|
|
|
||||||
1024
CHANGELOG.md
1024
CHANGELOG.md
File diff suppressed because it is too large
Load diff
68
NEWS.md
Normal file
68
NEWS.md
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
# What's new?
|
||||||
|
|
||||||
|
## 10.x
|
||||||
|
|
||||||
|
- User extras under `lua/plugins/extras` can now also be managed
|
||||||
|
with **LazyExtras**
|
||||||
|
|
||||||
|
- `nvim-ts-autotag` is now included by default
|
||||||
|
|
||||||
|
- `nvim-treesitter-context` is now included by default
|
||||||
|
|
||||||
|
- Added extra for `symbols-outline.nvim`
|
||||||
|
|
||||||
|
- Added extra for `aerial.nvim`
|
||||||
|
|
||||||
|
- `nvim-navic` has been removed. If you want to keep using `nvim-navic`,
|
||||||
|
you can enable the **editor.navic** extra
|
||||||
|
|
||||||
|
- New `:LazyExtras` command for managing **LazyVim** extras
|
||||||
|
|
||||||
|
- Improved **formatting**:
|
||||||
|
|
||||||
|
- **LazyVim** can now work with multiple formatters. Types:
|
||||||
|
|
||||||
|
- **primary**: only one primary formatter can be active at a time.
|
||||||
|
_(conform, none-ls, LSP)_
|
||||||
|
- **secondary**: multiple secondary formatters can be active _(eslint, ...)_
|
||||||
|
|
||||||
|
- **LazyVim** automatically selects the primary formatter based on the
|
||||||
|
current available sources and priorities.
|
||||||
|
|
||||||
|
- New `:LazyFormat` command for formatting the current selection or buffer
|
||||||
|
- New `:LazyFormatInfo` command for displaying the active formatters
|
||||||
|
for the current buffer
|
||||||
|
- Auto-formatting can be disabled with:
|
||||||
|
|
||||||
|
```lua
|
||||||
|
vim.g.autoformat = false -- globally
|
||||||
|
vim.b.autoformat = false -- buffer-local
|
||||||
|
```
|
||||||
|
|
||||||
|
- `none-ls.nvim` is no longer installed by default
|
||||||
|
|
||||||
|
- `conform.nvim` is now the default formatter
|
||||||
|
- `nvim-lint` is now the default linter
|
||||||
|
- If you want to keep using `none-ls.nvim`,
|
||||||
|
you can enable the **lsp.none-ls** extra
|
||||||
|
|
||||||
|
- `dashboard.nvim` is the new default dashboard plugin
|
||||||
|
|
||||||
|
- If you want to keep using `alpha.nvim`, you can enable the **ui.alpha** extra
|
||||||
|
|
||||||
|
- Improved **root detection**:
|
||||||
|
|
||||||
|
- New `:LazyRoot` command that shows info about the root dir detection
|
||||||
|
- Configurable with `vim.g.root_spec`
|
||||||
|
|
||||||
|
```lua
|
||||||
|
-- LazyVim root dir detection
|
||||||
|
-- Each entry can be:
|
||||||
|
-- * the name of a detector function like `lsp` or `cwd`
|
||||||
|
-- * a pattern or array of patterns like `.git` or `lua`.
|
||||||
|
-- * a function with signature `function(buf) -> string|string[]`
|
||||||
|
vim.g.root_spec = { "lsp", { ".git", "lua" }, "cwd" }
|
||||||
|
|
||||||
|
-- To disable root detection set to just "cwd"
|
||||||
|
vim.g.root_spec = { "cwd" }
|
||||||
|
```
|
||||||
|
|
@ -54,9 +54,10 @@ LazyVim 提供了两全其美的方式 - 根据需要调整配置的灵活性,
|
||||||
|
|
||||||
## ⚡️ 要求
|
## ⚡️ 要求
|
||||||
|
|
||||||
- Neovim >= **0.8.0** (需要用 **LuaJIT** 构建)
|
- Neovim >= **0.9.0** (需要用 **LuaJIT** 构建)
|
||||||
- Git >= **2.19.0** (用于部分克隆支持)
|
- Git >= **2.19.0** (用于部分克隆支持)
|
||||||
- 一个 [Nerd Font](https://www.nerdfonts.com/) 字体 **_(可选)_**
|
- 一个 [Nerd Font](https://www.nerdfonts.com/) 字体 **_(可选)_**
|
||||||
|
- 一个用于 `nvim-treesitter` 的 **C** 编译器。看 [这里](https://github.com/nvim-treesitter/nvim-treesitter#requirements)
|
||||||
|
|
||||||
## 🚀 入门
|
## 🚀 入门
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ to tweak your config as needed, along with the convenience of a pre-configured s
|
||||||
|
|
||||||
## ⚡️ Requirements
|
## ⚡️ Requirements
|
||||||
|
|
||||||
- Neovim >= **0.8.0** (needs to be built with **LuaJIT**)
|
- Neovim >= **0.9.0** (needs to be built with **LuaJIT**)
|
||||||
- Git >= **2.19.0** (for partial clones support)
|
- Git >= **2.19.0** (for partial clones support)
|
||||||
- a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_**
|
- a [Nerd Font](https://www.nerdfonts.com/) **_(optional)_**
|
||||||
- a **C** compiler for `nvim-treesitter`. See [here](https://github.com/nvim-treesitter/nvim-treesitter#requirements)
|
- a **C** compiler for `nvim-treesitter`. See [here](https://github.com/nvim-treesitter/nvim-treesitter#requirements)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
*LazyVim.txt* For Neovim >= 0.8.0 Last change: 2023 June 24
|
*LazyVim.txt* For Neovim >= 0.9.0 Last change: 2023 November 30
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Table of Contents *LazyVim-table-of-contents*
|
Table of Contents *LazyVim-table-of-contents*
|
||||||
|
|
@ -52,7 +52,7 @@ FEATURES *LazyVim-features*
|
||||||
|
|
||||||
REQUIREMENTS *LazyVim-requirements*
|
REQUIREMENTS *LazyVim-requirements*
|
||||||
|
|
||||||
- Neovim >= **0.8.0** (needs to be built with **LuaJIT**)
|
- Neovim >= **0.9.0** (needs to be built with **LuaJIT**)
|
||||||
- Git >= **2.19.0** (for partial clones support)
|
- Git >= **2.19.0** (for partial clones support)
|
||||||
- a Nerd Font <https://www.nerdfonts.com/> **(optional)**
|
- a Nerd Font <https://www.nerdfonts.com/> **(optional)**
|
||||||
- a **C** compiler for `nvim-treesitter`. See here <https://github.com/nvim-treesitter/nvim-treesitter#requirements>
|
- a **C** compiler for `nvim-treesitter`. See here <https://github.com/nvim-treesitter/nvim-treesitter#requirements>
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
-- This file is automatically loaded by lazyvim.config.init
|
-- This file is automatically loaded by lazyvim.config.init.
|
||||||
|
|
||||||
local function augroup(name)
|
local function augroup(name)
|
||||||
return vim.api.nvim_create_augroup("lazyvim_" .. name, { clear = true })
|
return vim.api.nvim_create_augroup("lazyvim_" .. name, { clear = true })
|
||||||
|
|
@ -22,16 +22,24 @@ vim.api.nvim_create_autocmd("TextYankPost", {
|
||||||
vim.api.nvim_create_autocmd({ "VimResized" }, {
|
vim.api.nvim_create_autocmd({ "VimResized" }, {
|
||||||
group = augroup("resize_splits"),
|
group = augroup("resize_splits"),
|
||||||
callback = function()
|
callback = function()
|
||||||
|
local current_tab = vim.fn.tabpagenr()
|
||||||
vim.cmd("tabdo wincmd =")
|
vim.cmd("tabdo wincmd =")
|
||||||
|
vim.cmd("tabnext " .. current_tab)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
-- go to last loc when opening a buffer
|
-- go to last loc when opening a buffer
|
||||||
vim.api.nvim_create_autocmd("BufReadPost", {
|
vim.api.nvim_create_autocmd("BufReadPost", {
|
||||||
group = augroup("last_loc"),
|
group = augroup("last_loc"),
|
||||||
callback = function()
|
callback = function(event)
|
||||||
local mark = vim.api.nvim_buf_get_mark(0, '"')
|
local exclude = { "gitcommit" }
|
||||||
local lcount = vim.api.nvim_buf_line_count(0)
|
local buf = event.buf
|
||||||
|
if vim.tbl_contains(exclude, vim.bo[buf].filetype) or vim.b[buf].lazyvim_last_loc then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vim.b[buf].lazyvim_last_loc = true
|
||||||
|
local mark = vim.api.nvim_buf_get_mark(buf, '"')
|
||||||
|
local lcount = vim.api.nvim_buf_line_count(buf)
|
||||||
if mark[1] > 0 and mark[1] <= lcount then
|
if mark[1] > 0 and mark[1] <= lcount then
|
||||||
pcall(vim.api.nvim_win_set_cursor, 0, mark)
|
pcall(vim.api.nvim_win_set_cursor, 0, mark)
|
||||||
end
|
end
|
||||||
|
|
@ -48,6 +56,7 @@ vim.api.nvim_create_autocmd("FileType", {
|
||||||
"man",
|
"man",
|
||||||
"notify",
|
"notify",
|
||||||
"qf",
|
"qf",
|
||||||
|
"query",
|
||||||
"spectre_panel",
|
"spectre_panel",
|
||||||
"startuptime",
|
"startuptime",
|
||||||
"tsplayground",
|
"tsplayground",
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,11 @@
|
||||||
---@type LazyVimConfig
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class LazyVimConfig: LazyVimOptions
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
M.lazy_version = ">=9.1.0"
|
M.version = "10.8.2" -- x-release-please-version
|
||||||
|
|
||||||
---@class LazyVimConfig
|
---@class LazyVimOptions
|
||||||
local defaults = {
|
local defaults = {
|
||||||
-- colorscheme can be a string like `catppuccin` or a function that will load the colorscheme
|
-- colorscheme can be a string like `catppuccin` or a function that will load the colorscheme
|
||||||
---@type string|fun()
|
---@type string|fun()
|
||||||
|
|
@ -17,104 +19,177 @@ local defaults = {
|
||||||
-- lazyvim.config.options can't be configured here since that's loaded before lazyvim setup
|
-- lazyvim.config.options can't be configured here since that's loaded before lazyvim setup
|
||||||
-- if you want to disable loading options, add `package.loaded["lazyvim.config.options"] = true` to the top of your init.lua
|
-- if you want to disable loading options, add `package.loaded["lazyvim.config.options"] = true` to the top of your init.lua
|
||||||
},
|
},
|
||||||
|
news = {
|
||||||
|
-- When enabled, NEWS.md will be shown when changed.
|
||||||
|
-- This only contains big new features and breaking changes.
|
||||||
|
lazyvim = true,
|
||||||
|
-- Same but for Neovim's news.txt
|
||||||
|
neovim = false,
|
||||||
|
},
|
||||||
-- icons used by other plugins
|
-- icons used by other plugins
|
||||||
|
-- stylua: ignore
|
||||||
icons = {
|
icons = {
|
||||||
|
misc = {
|
||||||
|
dots = "",
|
||||||
|
},
|
||||||
dap = {
|
dap = {
|
||||||
Stopped = { " ", "DiagnosticWarn", "DapStoppedLine" },
|
Stopped = { " ", "DiagnosticWarn", "DapStoppedLine" },
|
||||||
Breakpoint = " ",
|
Breakpoint = " ",
|
||||||
BreakpointCondition = " ",
|
BreakpointCondition = " ",
|
||||||
BreakpointRejected = { " ", "DiagnosticError" },
|
BreakpointRejected = { " ", "DiagnosticError" },
|
||||||
LogPoint = ".>",
|
LogPoint = ".>",
|
||||||
},
|
},
|
||||||
diagnostics = {
|
diagnostics = {
|
||||||
Error = " ",
|
Error = " ",
|
||||||
Warn = " ",
|
Warn = " ",
|
||||||
Hint = " ",
|
Hint = " ",
|
||||||
Info = " ",
|
Info = " ",
|
||||||
},
|
},
|
||||||
git = {
|
git = {
|
||||||
added = " ",
|
added = " ",
|
||||||
modified = " ",
|
modified = " ",
|
||||||
removed = " ",
|
removed = " ",
|
||||||
},
|
},
|
||||||
kinds = {
|
kinds = {
|
||||||
Array = " ",
|
Array = " ",
|
||||||
Boolean = " ",
|
Boolean = " ",
|
||||||
Class = " ",
|
Class = " ",
|
||||||
Color = " ",
|
Codeium = " ",
|
||||||
Constant = " ",
|
Color = " ",
|
||||||
Constructor = " ",
|
Control = " ",
|
||||||
Copilot = " ",
|
Collapsed = " ",
|
||||||
Enum = " ",
|
Constant = " ",
|
||||||
EnumMember = " ",
|
Constructor = " ",
|
||||||
Event = " ",
|
Copilot = " ",
|
||||||
Field = " ",
|
Enum = " ",
|
||||||
File = " ",
|
EnumMember = " ",
|
||||||
Folder = " ",
|
Event = " ",
|
||||||
Function = " ",
|
Field = " ",
|
||||||
Interface = " ",
|
File = " ",
|
||||||
Key = " ",
|
Folder = " ",
|
||||||
Keyword = " ",
|
Function = " ",
|
||||||
Method = " ",
|
Interface = " ",
|
||||||
Module = " ",
|
Key = " ",
|
||||||
Namespace = " ",
|
Keyword = " ",
|
||||||
Null = " ",
|
Method = " ",
|
||||||
Number = " ",
|
Module = " ",
|
||||||
Object = " ",
|
Namespace = " ",
|
||||||
Operator = " ",
|
Null = " ",
|
||||||
Package = " ",
|
Number = " ",
|
||||||
Property = " ",
|
Object = " ",
|
||||||
Reference = " ",
|
Operator = " ",
|
||||||
Snippet = " ",
|
Package = " ",
|
||||||
String = " ",
|
Property = " ",
|
||||||
Struct = " ",
|
Reference = " ",
|
||||||
Text = " ",
|
Snippet = " ",
|
||||||
|
String = " ",
|
||||||
|
Struct = " ",
|
||||||
|
TabNine = " ",
|
||||||
|
Text = " ",
|
||||||
TypeParameter = " ",
|
TypeParameter = " ",
|
||||||
Unit = " ",
|
Unit = " ",
|
||||||
Value = " ",
|
Value = " ",
|
||||||
Variable = " ",
|
Variable = " ",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
---@type table<string, string[]|boolean>?
|
||||||
|
kind_filter = {
|
||||||
|
default = {
|
||||||
|
"Class",
|
||||||
|
"Constructor",
|
||||||
|
"Enum",
|
||||||
|
"Field",
|
||||||
|
"Function",
|
||||||
|
"Interface",
|
||||||
|
"Method",
|
||||||
|
"Module",
|
||||||
|
"Namespace",
|
||||||
|
"Package",
|
||||||
|
"Property",
|
||||||
|
"Struct",
|
||||||
|
"Trait",
|
||||||
|
},
|
||||||
|
markdown = false,
|
||||||
|
help = false,
|
||||||
|
-- you can specify a different filter for each filetype
|
||||||
|
lua = {
|
||||||
|
"Class",
|
||||||
|
"Constructor",
|
||||||
|
"Enum",
|
||||||
|
"Field",
|
||||||
|
"Function",
|
||||||
|
"Interface",
|
||||||
|
"Method",
|
||||||
|
"Module",
|
||||||
|
"Namespace",
|
||||||
|
-- "Package", -- remove package since luals uses it for control flow structures
|
||||||
|
"Property",
|
||||||
|
"Struct",
|
||||||
|
"Trait",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
M.renames = {
|
M.json = {
|
||||||
["windwp/nvim-spectre"] = "nvim-pack/nvim-spectre",
|
version = 2,
|
||||||
|
data = {
|
||||||
|
version = nil, ---@type string?
|
||||||
|
news = {}, ---@type table<string, string>
|
||||||
|
extras = {}, ---@type string[]
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
---@type LazyVimConfig
|
function M.json.load()
|
||||||
|
local path = vim.fn.stdpath("config") .. "/lazyvim.json"
|
||||||
|
local f = io.open(path, "r")
|
||||||
|
if f then
|
||||||
|
local data = f:read("*a")
|
||||||
|
f:close()
|
||||||
|
local ok, json = pcall(vim.json.decode, data, { luanil = { object = true, array = true } })
|
||||||
|
if ok then
|
||||||
|
M.json.data = vim.tbl_deep_extend("force", M.json.data, json or {})
|
||||||
|
if M.json.data.version ~= M.json.version then
|
||||||
|
Util.json.migrate()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type LazyVimOptions
|
||||||
local options
|
local options
|
||||||
|
|
||||||
---@param opts? LazyVimConfig
|
---@param opts? LazyVimOptions
|
||||||
function M.setup(opts)
|
function M.setup(opts)
|
||||||
options = vim.tbl_deep_extend("force", defaults, opts or {})
|
options = vim.tbl_deep_extend("force", defaults, opts or {}) or {}
|
||||||
if not M.has() then
|
|
||||||
require("lazy.core.util").error(
|
|
||||||
"**LazyVim** needs **lazy.nvim** version "
|
|
||||||
.. M.lazy_version
|
|
||||||
.. " to work properly.\n"
|
|
||||||
.. "Please upgrade **lazy.nvim**",
|
|
||||||
{ title = "LazyVim" }
|
|
||||||
)
|
|
||||||
error("Exiting")
|
|
||||||
end
|
|
||||||
|
|
||||||
if vim.fn.argc(-1) == 0 then
|
-- autocmds can be loaded lazily when not opening a file
|
||||||
-- autocmds and keymaps can wait to load
|
local lazy_autocmds = vim.fn.argc(-1) == 0
|
||||||
vim.api.nvim_create_autocmd("User", {
|
if not lazy_autocmds then
|
||||||
group = vim.api.nvim_create_augroup("LazyVim", { clear = true }),
|
|
||||||
pattern = "VeryLazy",
|
|
||||||
callback = function()
|
|
||||||
M.load("autocmds")
|
|
||||||
M.load("keymaps")
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
-- load them now so they affect the opened buffers
|
|
||||||
M.load("autocmds")
|
M.load("autocmds")
|
||||||
M.load("keymaps")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
require("lazy.core.util").try(function()
|
local group = vim.api.nvim_create_augroup("LazyVim", { clear = true })
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
group = group,
|
||||||
|
pattern = "VeryLazy",
|
||||||
|
callback = function()
|
||||||
|
if lazy_autocmds then
|
||||||
|
M.load("autocmds")
|
||||||
|
end
|
||||||
|
M.load("keymaps")
|
||||||
|
|
||||||
|
Util.format.setup()
|
||||||
|
Util.news.setup()
|
||||||
|
Util.root.setup()
|
||||||
|
|
||||||
|
vim.api.nvim_create_user_command("LazyExtras", function()
|
||||||
|
Util.extras.show()
|
||||||
|
end, { desc = "Manage LazyVim extras" })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
Util.track("colorscheme")
|
||||||
|
Util.try(function()
|
||||||
if type(M.colorscheme) == "function" then
|
if type(M.colorscheme) == "function" then
|
||||||
M.colorscheme()
|
M.colorscheme()
|
||||||
else
|
else
|
||||||
|
|
@ -123,34 +198,36 @@ function M.setup(opts)
|
||||||
end, {
|
end, {
|
||||||
msg = "Could not load your colorscheme",
|
msg = "Could not load your colorscheme",
|
||||||
on_error = function(msg)
|
on_error = function(msg)
|
||||||
require("lazy.core.util").error(msg)
|
Util.error(msg)
|
||||||
vim.cmd.colorscheme("habamax")
|
vim.cmd.colorscheme("habamax")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
Util.track()
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param range? string
|
---@param buf? number
|
||||||
function M.has(range)
|
---@return string[]?
|
||||||
local Semver = require("lazy.manage.semver")
|
function M.get_kind_filter(buf)
|
||||||
return Semver.range(range or M.lazy_version):matches(require("lazy.core.config").version or "0.0.0")
|
buf = (buf == nil or buf == 0) and vim.api.nvim_get_current_buf() or buf
|
||||||
|
local ft = vim.bo[buf].filetype
|
||||||
|
if M.kind_filter == false then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if M.kind_filter[ft] == false then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
---@diagnostic disable-next-line: return-type-mismatch
|
||||||
|
return type(M.kind_filter) == "table" and type(M.kind_filter.default) == "table" and M.kind_filter.default or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param name "autocmds" | "options" | "keymaps"
|
---@param name "autocmds" | "options" | "keymaps"
|
||||||
function M.load(name)
|
function M.load(name)
|
||||||
local Util = require("lazy.core.util")
|
|
||||||
local function _load(mod)
|
local function _load(mod)
|
||||||
Util.try(function()
|
if require("lazy.core.cache").find(mod)[1] then
|
||||||
require(mod)
|
Util.try(function()
|
||||||
end, {
|
require(mod)
|
||||||
msg = "Failed loading " .. mod,
|
end, { msg = "Failed loading " .. mod })
|
||||||
on_error = function(msg)
|
end
|
||||||
local info = require("lazy.core.cache").find(mod)
|
|
||||||
if info == nil or (type(info) == "table" and #info == 0) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
Util.error(msg)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
-- always load lazyvim, then user file
|
-- always load lazyvim, then user file
|
||||||
if M.defaults[name] or name == "options" then
|
if M.defaults[name] or name == "options" then
|
||||||
|
|
@ -167,24 +244,30 @@ end
|
||||||
|
|
||||||
M.did_init = false
|
M.did_init = false
|
||||||
function M.init()
|
function M.init()
|
||||||
if not M.did_init then
|
if M.did_init then
|
||||||
M.did_init = true
|
return
|
||||||
-- delay notifications till vim.notify was replaced or after 500ms
|
|
||||||
require("lazyvim.util").lazy_notify()
|
|
||||||
|
|
||||||
-- load options here, before lazy init while sourcing plugin modules
|
|
||||||
-- this is needed to make sure options will be correctly applied
|
|
||||||
-- after installing missing plugins
|
|
||||||
require("lazyvim.config").load("options")
|
|
||||||
local Plugin = require("lazy.core.plugin")
|
|
||||||
local add = Plugin.Spec.add
|
|
||||||
Plugin.Spec.add = function(self, plugin, ...)
|
|
||||||
if type(plugin) == "table" and M.renames[plugin[1]] then
|
|
||||||
plugin[1] = M.renames[plugin[1]]
|
|
||||||
end
|
|
||||||
return add(self, plugin, ...)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
M.did_init = true
|
||||||
|
local plugin = require("lazy.core.config").spec.plugins.LazyVim
|
||||||
|
if plugin then
|
||||||
|
vim.opt.rtp:append(plugin.dir)
|
||||||
|
end
|
||||||
|
|
||||||
|
package.preload["lazyvim.plugins.lsp.format"] = function()
|
||||||
|
Util.deprecate([[require("lazyvim.plugins.lsp.format")]], [[require("lazyvim.util").format]])
|
||||||
|
return Util.format
|
||||||
|
end
|
||||||
|
|
||||||
|
-- delay notifications till vim.notify was replaced or after 500ms
|
||||||
|
require("lazyvim.util").lazy_notify()
|
||||||
|
|
||||||
|
-- load options here, before lazy init while sourcing plugin modules
|
||||||
|
-- this is needed to make sure options will be correctly applied
|
||||||
|
-- after installing missing plugins
|
||||||
|
M.load("options")
|
||||||
|
|
||||||
|
Util.plugin.setup()
|
||||||
|
M.json.load()
|
||||||
end
|
end
|
||||||
|
|
||||||
setmetatable(M, {
|
setmetatable(M, {
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,15 @@
|
||||||
-- This file is automatically loaded by lazyvim.config.init
|
-- This file is automatically loaded by lazyvim.config.init
|
||||||
local Util = require("lazyvim.util")
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
local function map(mode, lhs, rhs, opts)
|
-- DO NOT USE THIS IN YOU OWN CONFIG!!
|
||||||
local keys = require("lazy.core.handler").handlers.keys
|
-- use `vim.keymap.set` instead
|
||||||
---@cast keys LazyKeysHandler
|
local map = Util.safe_keymap_set
|
||||||
-- do not create the keymap if a lazy keys handler exists
|
|
||||||
if not keys.active[keys.parse({ lhs, mode = mode }).id] then
|
|
||||||
opts = opts or {}
|
|
||||||
opts.silent = opts.silent ~= false
|
|
||||||
if opts.remap and not vim.g.vscode then
|
|
||||||
opts.remap = nil
|
|
||||||
end
|
|
||||||
vim.keymap.set(mode, lhs, rhs, opts)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- better up/down
|
-- better up/down
|
||||||
map({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
|
map({ "n", "x" }, "j", "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
|
||||||
|
map({ "n", "x" }, "<Down>", "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true })
|
||||||
map({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
|
map({ "n", "x" }, "k", "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
|
||||||
|
map({ "n", "x" }, "<Up>", "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true })
|
||||||
|
|
||||||
-- Move to window using the <ctrl> hjkl keys
|
-- Move to window using the <ctrl> hjkl keys
|
||||||
map("n", "<C-h>", "<C-w>h", { desc = "Go to left window", remap = true })
|
map("n", "<C-h>", "<C-w>h", { desc = "Go to left window", remap = true })
|
||||||
|
|
@ -40,17 +32,10 @@ map("v", "<A-j>", ":m '>+1<cr>gv=gv", { desc = "Move down" })
|
||||||
map("v", "<A-k>", ":m '<-2<cr>gv=gv", { desc = "Move up" })
|
map("v", "<A-k>", ":m '<-2<cr>gv=gv", { desc = "Move up" })
|
||||||
|
|
||||||
-- buffers
|
-- buffers
|
||||||
if Util.has("bufferline.nvim") then
|
map("n", "<S-h>", "<cmd>bprevious<cr>", { desc = "Prev buffer" })
|
||||||
map("n", "<S-h>", "<cmd>BufferLineCyclePrev<cr>", { desc = "Prev buffer" })
|
map("n", "<S-l>", "<cmd>bnext<cr>", { desc = "Next buffer" })
|
||||||
map("n", "<S-l>", "<cmd>BufferLineCycleNext<cr>", { desc = "Next buffer" })
|
map("n", "[b", "<cmd>bprevious<cr>", { desc = "Prev buffer" })
|
||||||
map("n", "[b", "<cmd>BufferLineCyclePrev<cr>", { desc = "Prev buffer" })
|
map("n", "]b", "<cmd>bnext<cr>", { desc = "Next buffer" })
|
||||||
map("n", "]b", "<cmd>BufferLineCycleNext<cr>", { desc = "Next buffer" })
|
|
||||||
else
|
|
||||||
map("n", "<S-h>", "<cmd>bprevious<cr>", { desc = "Prev buffer" })
|
|
||||||
map("n", "<S-l>", "<cmd>bnext<cr>", { desc = "Next buffer" })
|
|
||||||
map("n", "[b", "<cmd>bprevious<cr>", { desc = "Prev buffer" })
|
|
||||||
map("n", "]b", "<cmd>bnext<cr>", { desc = "Next buffer" })
|
|
||||||
end
|
|
||||||
map("n", "<leader>bb", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
|
map("n", "<leader>bb", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
|
||||||
map("n", "<leader>`", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
|
map("n", "<leader>`", "<cmd>e #<cr>", { desc = "Switch to Other Buffer" })
|
||||||
|
|
||||||
|
|
@ -66,13 +51,11 @@ map(
|
||||||
{ desc = "Redraw / clear hlsearch / diff update" }
|
{ desc = "Redraw / clear hlsearch / diff update" }
|
||||||
)
|
)
|
||||||
|
|
||||||
map({ "n", "x" }, "gw", "*N", { desc = "Search word under cursor" })
|
|
||||||
|
|
||||||
-- https://github.com/mhinz/vim-galore#saner-behavior-of-n-and-n
|
-- https://github.com/mhinz/vim-galore#saner-behavior-of-n-and-n
|
||||||
map("n", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result" })
|
map("n", "n", "'Nn'[v:searchforward].'zv'", { expr = true, desc = "Next search result" })
|
||||||
map("x", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result" })
|
map("x", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result" })
|
||||||
map("o", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result" })
|
map("o", "n", "'Nn'[v:searchforward]", { expr = true, desc = "Next search result" })
|
||||||
map("n", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev search result" })
|
map("n", "N", "'nN'[v:searchforward].'zv'", { expr = true, desc = "Prev search result" })
|
||||||
map("x", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev search result" })
|
map("x", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev search result" })
|
||||||
map("o", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev search result" })
|
map("o", "N", "'nN'[v:searchforward]", { expr = true, desc = "Prev search result" })
|
||||||
|
|
||||||
|
|
@ -82,14 +65,17 @@ map("i", ".", ".<c-g>u")
|
||||||
map("i", ";", ";<c-g>u")
|
map("i", ";", ";<c-g>u")
|
||||||
|
|
||||||
-- save file
|
-- save file
|
||||||
map({ "i", "v", "n", "s" }, "<C-s>", "<cmd>w<cr><esc>", { desc = "Save file" })
|
map({ "i", "x", "n", "s" }, "<C-s>", "<cmd>w<cr><esc>", { desc = "Save file" })
|
||||||
|
|
||||||
|
--keywordprg
|
||||||
|
map("n", "<leader>K", "<cmd>norm! K<cr>", { desc = "Keywordprg" })
|
||||||
|
|
||||||
-- better indenting
|
-- better indenting
|
||||||
map("v", "<", "<gv")
|
map("v", "<", "<gv")
|
||||||
map("v", ">", ">gv")
|
map("v", ">", ">gv")
|
||||||
|
|
||||||
-- lazy
|
-- lazy
|
||||||
map("n", "<leader>l", "<cmd>:Lazy<cr>", { desc = "Lazy" })
|
map("n", "<leader>l", "<cmd>Lazy<cr>", { desc = "Lazy" })
|
||||||
|
|
||||||
-- new file
|
-- new file
|
||||||
map("n", "<leader>fn", "<cmd>enew<cr>", { desc = "New File" })
|
map("n", "<leader>fn", "<cmd>enew<cr>", { desc = "New File" })
|
||||||
|
|
@ -97,41 +83,64 @@ map("n", "<leader>fn", "<cmd>enew<cr>", { desc = "New File" })
|
||||||
map("n", "<leader>xl", "<cmd>lopen<cr>", { desc = "Location List" })
|
map("n", "<leader>xl", "<cmd>lopen<cr>", { desc = "Location List" })
|
||||||
map("n", "<leader>xq", "<cmd>copen<cr>", { desc = "Quickfix List" })
|
map("n", "<leader>xq", "<cmd>copen<cr>", { desc = "Quickfix List" })
|
||||||
|
|
||||||
if not Util.has("trouble.nvim") then
|
map("n", "[q", vim.cmd.cprev, { desc = "Previous quickfix" })
|
||||||
map("n", "[q", vim.cmd.cprev, { desc = "Previous quickfix" })
|
map("n", "]q", vim.cmd.cnext, { desc = "Next quickfix" })
|
||||||
map("n", "]q", vim.cmd.cnext, { desc = "Next quickfix" })
|
|
||||||
|
-- formatting
|
||||||
|
map({ "n", "v" }, "<leader>cf", function()
|
||||||
|
Util.format({ force = true })
|
||||||
|
end, { desc = "Format" })
|
||||||
|
|
||||||
|
-- diagnostic
|
||||||
|
local diagnostic_goto = function(next, severity)
|
||||||
|
local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev
|
||||||
|
severity = severity and vim.diagnostic.severity[severity] or nil
|
||||||
|
return function()
|
||||||
|
go({ severity = severity })
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
map("n", "<leader>cd", vim.diagnostic.open_float, { desc = "Line Diagnostics" })
|
||||||
|
map("n", "]d", diagnostic_goto(true), { desc = "Next Diagnostic" })
|
||||||
|
map("n", "[d", diagnostic_goto(false), { desc = "Prev Diagnostic" })
|
||||||
|
map("n", "]e", diagnostic_goto(true, "ERROR"), { desc = "Next Error" })
|
||||||
|
map("n", "[e", diagnostic_goto(false, "ERROR"), { desc = "Prev Error" })
|
||||||
|
map("n", "]w", diagnostic_goto(true, "WARN"), { desc = "Next Warning" })
|
||||||
|
map("n", "[w", diagnostic_goto(false, "WARN"), { desc = "Prev Warning" })
|
||||||
|
|
||||||
-- stylua: ignore start
|
-- stylua: ignore start
|
||||||
|
|
||||||
-- toggle options
|
-- toggle options
|
||||||
map("n", "<leader>uf", require("lazyvim.plugins.lsp.format").toggle, { desc = "Toggle format on Save" })
|
map("n", "<leader>uf", function() Util.format.toggle() end, { desc = "Toggle auto format (global)" })
|
||||||
|
map("n", "<leader>uF", function() Util.format.toggle(true) end, { desc = "Toggle auto format (buffer)" })
|
||||||
map("n", "<leader>us", function() Util.toggle("spell") end, { desc = "Toggle Spelling" })
|
map("n", "<leader>us", function() Util.toggle("spell") end, { desc = "Toggle Spelling" })
|
||||||
map("n", "<leader>uw", function() Util.toggle("wrap") end, { desc = "Toggle Word Wrap" })
|
map("n", "<leader>uw", function() Util.toggle("wrap") end, { desc = "Toggle Word Wrap" })
|
||||||
map("n", "<leader>ul", function() Util.toggle("relativenumber", true) Util.toggle("number") end, { desc = "Toggle Line Numbers" })
|
map("n", "<leader>uL", function() Util.toggle("relativenumber") end, { desc = "Toggle Relative Line Numbers" })
|
||||||
map("n", "<leader>ud", Util.toggle_diagnostics, { desc = "Toggle Diagnostics" })
|
map("n", "<leader>ul", function() Util.toggle.number() end, { desc = "Toggle Line Numbers" })
|
||||||
|
map("n", "<leader>ud", function() Util.toggle.diagnostics() end, { desc = "Toggle Diagnostics" })
|
||||||
local conceallevel = vim.o.conceallevel > 0 and vim.o.conceallevel or 3
|
local conceallevel = vim.o.conceallevel > 0 and vim.o.conceallevel or 3
|
||||||
map("n", "<leader>uc", function() Util.toggle("conceallevel", false, {0, conceallevel}) end, { desc = "Toggle Conceal" })
|
map("n", "<leader>uc", function() Util.toggle("conceallevel", false, {0, conceallevel}) end, { desc = "Toggle Conceal" })
|
||||||
if vim.lsp.buf.inlay_hint then
|
if vim.lsp.buf.inlay_hint or vim.lsp.inlay_hint then
|
||||||
map("n", "<leader>uh", function() vim.lsp.buf.inlay_hint(0, nil) end, { desc = "Toggle Inlay Hints" })
|
map( "n", "<leader>uh", function() Util.toggle.inlay_hints() end, { desc = "Toggle Inlay Hints" })
|
||||||
end
|
end
|
||||||
|
map("n", "<leader>uT", function() if vim.b.ts_highlight then vim.treesitter.stop() else vim.treesitter.start() end end, { desc = "Toggle Treesitter Highlight" })
|
||||||
|
|
||||||
-- lazygit
|
-- lazygit
|
||||||
map("n", "<leader>gg", function() Util.float_term({ "lazygit" }, { cwd = Util.get_root(), esc_esc = false, ctrl_hjkl = false }) end, { desc = "Lazygit (root dir)" })
|
map("n", "<leader>gg", function() Util.terminal({ "lazygit" }, { cwd = Util.root(), esc_esc = false, ctrl_hjkl = false }) end, { desc = "Lazygit (root dir)" })
|
||||||
map("n", "<leader>gG", function() Util.float_term({ "lazygit" }, {esc_esc = false, ctrl_hjkl = false}) end, { desc = "Lazygit (cwd)" })
|
map("n", "<leader>gG", function() Util.terminal({ "lazygit" }, {esc_esc = false, ctrl_hjkl = false}) end, { desc = "Lazygit (cwd)" })
|
||||||
|
|
||||||
-- quit
|
-- quit
|
||||||
map("n", "<leader>qq", "<cmd>qa<cr>", { desc = "Quit all" })
|
map("n", "<leader>qq", "<cmd>qa<cr>", { desc = "Quit all" })
|
||||||
|
|
||||||
-- highlights under cursor
|
-- highlights under cursor
|
||||||
if vim.fn.has("nvim-0.9.0") == 1 then
|
map("n", "<leader>ui", vim.show_pos, { desc = "Inspect Pos" })
|
||||||
map("n", "<leader>ui", vim.show_pos, { desc = "Inspect Pos" })
|
|
||||||
end
|
-- LazyVim Changelog
|
||||||
|
map("n", "<leader>L", function() Util.news.changelog() end, { desc = "LazyVim Changelog" })
|
||||||
|
|
||||||
-- floating terminal
|
-- floating terminal
|
||||||
local lazyterm = function() Util.float_term(nil, { cwd = Util.get_root() }) end
|
local lazyterm = function() Util.terminal(nil, { cwd = Util.root() }) end
|
||||||
map("n", "<leader>ft", lazyterm, { desc = "Terminal (root dir)" })
|
map("n", "<leader>ft", lazyterm, { desc = "Terminal (root dir)" })
|
||||||
map("n", "<leader>fT", function() Util.float_term() end, { desc = "Terminal (cwd)" })
|
map("n", "<leader>fT", function() Util.terminal() end, { desc = "Terminal (cwd)" })
|
||||||
map("n", "<c-/>", lazyterm, { desc = "Terminal (root dir)" })
|
map("n", "<c-/>", lazyterm, { desc = "Terminal (root dir)" })
|
||||||
map("n", "<c-_>", lazyterm, { desc = "which_key_ignore" })
|
map("n", "<c-_>", lazyterm, { desc = "which_key_ignore" })
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,16 @@
|
||||||
-- This file is automatically loaded by plugins.core
|
-- This file is automatically loaded by plugins.core
|
||||||
vim.g.mapleader = " "
|
vim.g.mapleader = " "
|
||||||
vim.g.maplocalleader = " "
|
vim.g.maplocalleader = "\\"
|
||||||
|
|
||||||
|
-- Enable LazyVim auto format
|
||||||
|
vim.g.autoformat = true
|
||||||
|
|
||||||
|
-- LazyVim root dir detection
|
||||||
|
-- Each entry can be:
|
||||||
|
-- * the name of a detector function like `lsp` or `cwd`
|
||||||
|
-- * a pattern or array of patterns like `.git` or `lua`.
|
||||||
|
-- * a function with signature `function(buf) -> string|string[]`
|
||||||
|
vim.g.root_spec = { "lsp", { ".git", "lua" }, "cwd" }
|
||||||
|
|
||||||
local opt = vim.opt
|
local opt = vim.opt
|
||||||
|
|
||||||
|
|
@ -16,7 +26,7 @@ opt.grepformat = "%f:%l:%c:%m"
|
||||||
opt.grepprg = "rg --vimgrep"
|
opt.grepprg = "rg --vimgrep"
|
||||||
opt.ignorecase = true -- Ignore case
|
opt.ignorecase = true -- Ignore case
|
||||||
opt.inccommand = "nosplit" -- preview incremental substitute
|
opt.inccommand = "nosplit" -- preview incremental substitute
|
||||||
opt.laststatus = 0
|
opt.laststatus = 3 -- global statusline
|
||||||
opt.list = true -- Show some invisible characters (tabs...
|
opt.list = true -- Show some invisible characters (tabs...
|
||||||
opt.mouse = "a" -- Enable mouse mode
|
opt.mouse = "a" -- Enable mouse mode
|
||||||
opt.number = true -- Print line number
|
opt.number = true -- Print line number
|
||||||
|
|
@ -24,10 +34,10 @@ opt.pumblend = 10 -- Popup blend
|
||||||
opt.pumheight = 10 -- Maximum number of entries in a popup
|
opt.pumheight = 10 -- Maximum number of entries in a popup
|
||||||
opt.relativenumber = true -- Relative line numbers
|
opt.relativenumber = true -- Relative line numbers
|
||||||
opt.scrolloff = 4 -- Lines of context
|
opt.scrolloff = 4 -- Lines of context
|
||||||
opt.sessionoptions = { "buffers", "curdir", "tabpages", "winsize" }
|
opt.sessionoptions = { "buffers", "curdir", "tabpages", "winsize", "help", "globals", "skiprtp", "folds" }
|
||||||
opt.shiftround = true -- Round indent
|
opt.shiftround = true -- Round indent
|
||||||
opt.shiftwidth = 2 -- Size of an indent
|
opt.shiftwidth = 2 -- Size of an indent
|
||||||
opt.shortmess:append({ W = true, I = true, c = true })
|
opt.shortmess:append({ W = true, I = true, c = true, C = true })
|
||||||
opt.showmode = false -- Dont show mode since we have a statusline
|
opt.showmode = false -- Dont show mode since we have a statusline
|
||||||
opt.sidescrolloff = 8 -- Columns of context
|
opt.sidescrolloff = 8 -- Columns of context
|
||||||
opt.signcolumn = "yes" -- Always show the signcolumn, otherwise it would shift the text each time
|
opt.signcolumn = "yes" -- Always show the signcolumn, otherwise it would shift the text each time
|
||||||
|
|
@ -35,6 +45,7 @@ opt.smartcase = true -- Don't ignore case with capitals
|
||||||
opt.smartindent = true -- Insert indents automatically
|
opt.smartindent = true -- Insert indents automatically
|
||||||
opt.spelllang = { "en" }
|
opt.spelllang = { "en" }
|
||||||
opt.splitbelow = true -- Put new windows below current
|
opt.splitbelow = true -- Put new windows below current
|
||||||
|
opt.splitkeep = "screen"
|
||||||
opt.splitright = true -- Put new windows right of current
|
opt.splitright = true -- Put new windows right of current
|
||||||
opt.tabstop = 2 -- Number of spaces tabs count for
|
opt.tabstop = 2 -- Number of spaces tabs count for
|
||||||
opt.termguicolors = true -- True color support
|
opt.termguicolors = true -- True color support
|
||||||
|
|
@ -42,14 +53,41 @@ opt.timeoutlen = 300
|
||||||
opt.undofile = true
|
opt.undofile = true
|
||||||
opt.undolevels = 10000
|
opt.undolevels = 10000
|
||||||
opt.updatetime = 200 -- Save swap file and trigger CursorHold
|
opt.updatetime = 200 -- Save swap file and trigger CursorHold
|
||||||
|
opt.virtualedit = "block" -- Allow cursor to move where there is no text in visual block mode
|
||||||
opt.wildmode = "longest:full,full" -- Command-line completion mode
|
opt.wildmode = "longest:full,full" -- Command-line completion mode
|
||||||
opt.winminwidth = 5 -- Minimum window width
|
opt.winminwidth = 5 -- Minimum window width
|
||||||
opt.wrap = false -- Disable line wrap
|
opt.wrap = false -- Disable line wrap
|
||||||
|
opt.fillchars = {
|
||||||
|
foldopen = "",
|
||||||
|
foldclose = "",
|
||||||
|
-- fold = "⸱",
|
||||||
|
fold = " ",
|
||||||
|
foldsep = " ",
|
||||||
|
diff = "╱",
|
||||||
|
eob = " ",
|
||||||
|
}
|
||||||
|
|
||||||
|
if vim.fn.has("nvim-0.10") == 1 then
|
||||||
|
opt.smoothscroll = true
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Folding
|
||||||
|
vim.opt.foldlevel = 99
|
||||||
|
vim.opt.foldtext = "v:lua.require'lazyvim.util'.ui.foldtext()"
|
||||||
|
|
||||||
if vim.fn.has("nvim-0.9.0") == 1 then
|
if vim.fn.has("nvim-0.9.0") == 1 then
|
||||||
opt.splitkeep = "screen"
|
vim.opt.statuscolumn = [[%!v:lua.require'lazyvim.util'.ui.statuscolumn()]]
|
||||||
opt.shortmess:append({ C = true })
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- HACK: causes freezes on <= 0.9, so only enable on >= 0.10 for now
|
||||||
|
if vim.fn.has("nvim-0.10") == 1 then
|
||||||
|
vim.opt.foldmethod = "expr"
|
||||||
|
vim.opt.foldexpr = "v:lua.require'lazyvim.util'.ui.foldexpr()"
|
||||||
|
else
|
||||||
|
vim.opt.foldmethod = "indent"
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.o.formatexpr = "v:lua.require'lazyvim.util'.format.formatexpr()"
|
||||||
|
|
||||||
-- Fix markdown indentation settings
|
-- Fix markdown indentation settings
|
||||||
vim.g.markdown_recommended_style = 0
|
vim.g.markdown_recommended_style = 0
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ local error = vim.health.error or vim.health.report_error
|
||||||
function M.check()
|
function M.check()
|
||||||
start("LazyVim")
|
start("LazyVim")
|
||||||
|
|
||||||
if vim.fn.has("nvim-0.8.0") == 1 then
|
if vim.fn.has("nvim-0.9.0") == 1 then
|
||||||
ok("Using Neovim >= 0.8.0")
|
ok("Using Neovim >= 0.9.0")
|
||||||
else
|
else
|
||||||
error("Neovim >= 0.8.0 is required")
|
error("Neovim >= 0.9.0 is required")
|
||||||
end
|
end
|
||||||
|
|
||||||
for _, cmd in ipairs({ "git", "rg", { "fd", "fdfind" }, "lazygit" }) do
|
for _, cmd in ipairs({ "git", "rg", { "fd", "fdfind" }, "lazygit" }) do
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ return {
|
||||||
opts = function()
|
opts = function()
|
||||||
vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true })
|
vim.api.nvim_set_hl(0, "CmpGhostText", { link = "Comment", default = true })
|
||||||
local cmp = require("cmp")
|
local cmp = require("cmp")
|
||||||
|
local defaults = require("cmp.config.default")()
|
||||||
return {
|
return {
|
||||||
completion = {
|
completion = {
|
||||||
completeopt = "menu,menuone,noinsert",
|
completeopt = "menu,menuone,noinsert",
|
||||||
|
|
@ -65,12 +66,17 @@ return {
|
||||||
behavior = cmp.ConfirmBehavior.Replace,
|
behavior = cmp.ConfirmBehavior.Replace,
|
||||||
select = true,
|
select = true,
|
||||||
}), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
|
}), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items.
|
||||||
|
["<C-CR>"] = function(fallback)
|
||||||
|
cmp.abort()
|
||||||
|
fallback()
|
||||||
|
end,
|
||||||
}),
|
}),
|
||||||
sources = cmp.config.sources({
|
sources = cmp.config.sources({
|
||||||
{ name = "nvim_lsp" },
|
{ name = "nvim_lsp" },
|
||||||
{ name = "luasnip" },
|
{ name = "luasnip" },
|
||||||
{ name = "buffer" },
|
|
||||||
{ name = "path" },
|
{ name = "path" },
|
||||||
|
}, {
|
||||||
|
{ name = "buffer" },
|
||||||
}),
|
}),
|
||||||
formatting = {
|
formatting = {
|
||||||
format = function(_, item)
|
format = function(_, item)
|
||||||
|
|
@ -86,8 +92,16 @@ return {
|
||||||
hl_group = "CmpGhostText",
|
hl_group = "CmpGhostText",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
sorting = defaults.sorting,
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
|
---@param opts cmp.ConfigSchema
|
||||||
|
config = function(_, opts)
|
||||||
|
for _, source in ipairs(opts.sources) do
|
||||||
|
source.group_index = source.group_index or 1
|
||||||
|
end
|
||||||
|
require("cmp").setup(opts)
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- auto pairs
|
-- auto pairs
|
||||||
|
|
@ -95,9 +109,27 @@ return {
|
||||||
"echasnovski/mini.pairs",
|
"echasnovski/mini.pairs",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
opts = {},
|
opts = {},
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>up",
|
||||||
|
function()
|
||||||
|
local Util = require("lazy.core.util")
|
||||||
|
vim.g.minipairs_disable = not vim.g.minipairs_disable
|
||||||
|
if vim.g.minipairs_disable then
|
||||||
|
Util.warn("Disabled auto pairs", { title = "Option" })
|
||||||
|
else
|
||||||
|
Util.info("Enabled auto pairs", { title = "Option" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Toggle auto pairs",
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- surround
|
-- Fast and feature-rich surround actions. For text that includes
|
||||||
|
-- surrounding characters like brackets or quotes, this allows you
|
||||||
|
-- to select the text inside, change or modify the surrounding characters,
|
||||||
|
-- and more.
|
||||||
{
|
{
|
||||||
"echasnovski/mini.surround",
|
"echasnovski/mini.surround",
|
||||||
keys = function(_, keys)
|
keys = function(_, keys)
|
||||||
|
|
@ -120,19 +152,25 @@ return {
|
||||||
end,
|
end,
|
||||||
opts = {
|
opts = {
|
||||||
mappings = {
|
mappings = {
|
||||||
add = "gza", -- Add surrounding in Normal and Visual modes
|
add = "gsa", -- Add surrounding in Normal and Visual modes
|
||||||
delete = "gzd", -- Delete surrounding
|
delete = "gsd", -- Delete surrounding
|
||||||
find = "gzf", -- Find surrounding (to the right)
|
find = "gsf", -- Find surrounding (to the right)
|
||||||
find_left = "gzF", -- Find surrounding (to the left)
|
find_left = "gsF", -- Find surrounding (to the left)
|
||||||
highlight = "gzh", -- Highlight surrounding
|
highlight = "gsh", -- Highlight surrounding
|
||||||
replace = "gzr", -- Replace surrounding
|
replace = "gsr", -- Replace surrounding
|
||||||
update_n_lines = "gzn", -- Update `n_lines`
|
update_n_lines = "gsn", -- Update `n_lines`
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- comments
|
-- comments
|
||||||
{ "JoosepAlviste/nvim-ts-context-commentstring", lazy = true },
|
{
|
||||||
|
"JoosepAlviste/nvim-ts-context-commentstring",
|
||||||
|
lazy = true,
|
||||||
|
opts = {
|
||||||
|
enable_autocmd = false,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"echasnovski/mini.comment",
|
"echasnovski/mini.comment",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
|
|
@ -145,7 +183,7 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- better text-objects
|
-- Better text-objects
|
||||||
{
|
{
|
||||||
"echasnovski/mini.ai",
|
"echasnovski/mini.ai",
|
||||||
-- keys = {
|
-- keys = {
|
||||||
|
|
@ -153,7 +191,6 @@ return {
|
||||||
-- { "i", mode = { "x", "o" } },
|
-- { "i", mode = { "x", "o" } },
|
||||||
-- },
|
-- },
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
dependencies = { "nvim-treesitter-textobjects" },
|
|
||||||
opts = function()
|
opts = function()
|
||||||
local ai = require("mini.ai")
|
local ai = require("mini.ai")
|
||||||
return {
|
return {
|
||||||
|
|
@ -165,13 +202,14 @@ return {
|
||||||
}, {}),
|
}, {}),
|
||||||
f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }, {}),
|
f = ai.gen_spec.treesitter({ a = "@function.outer", i = "@function.inner" }, {}),
|
||||||
c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }, {}),
|
c = ai.gen_spec.treesitter({ a = "@class.outer", i = "@class.inner" }, {}),
|
||||||
|
t = { "<([%p%w]-)%f[^<%w][^<>]->.-</%1>", "^<.->().*()</[^/]->$" },
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
require("mini.ai").setup(opts)
|
require("mini.ai").setup(opts)
|
||||||
-- register all text objects with which-key
|
-- register all text objects with which-key
|
||||||
if require("lazyvim.util").has("which-key.nvim") then
|
require("lazyvim.util").on_load("which-key.nvim", function()
|
||||||
---@type table<string, string|table>
|
---@type table<string, string|table>
|
||||||
local i = {
|
local i = {
|
||||||
[" "] = "Whitespace",
|
[" "] = "Whitespace",
|
||||||
|
|
@ -212,7 +250,7 @@ return {
|
||||||
i = i,
|
i = i,
|
||||||
a = a,
|
a = a,
|
||||||
})
|
})
|
||||||
end
|
end)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,12 +14,19 @@ return {
|
||||||
name = "catppuccin",
|
name = "catppuccin",
|
||||||
opts = {
|
opts = {
|
||||||
integrations = {
|
integrations = {
|
||||||
|
aerial = true,
|
||||||
alpha = true,
|
alpha = true,
|
||||||
cmp = true,
|
cmp = true,
|
||||||
|
dashboard = true,
|
||||||
|
flash = true,
|
||||||
gitsigns = true,
|
gitsigns = true,
|
||||||
|
headlines = true,
|
||||||
illuminate = true,
|
illuminate = true,
|
||||||
indent_blankline = { enabled = true },
|
indent_blankline = { enabled = true },
|
||||||
|
leap = true,
|
||||||
lsp_trouble = true,
|
lsp_trouble = true,
|
||||||
|
mason = true,
|
||||||
|
markdown = true,
|
||||||
mini = true,
|
mini = true,
|
||||||
native_lsp = {
|
native_lsp = {
|
||||||
enabled = true,
|
enabled = true,
|
||||||
|
|
@ -30,14 +37,15 @@ return {
|
||||||
information = { "undercurl" },
|
information = { "undercurl" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
navic = { enabled = true },
|
navic = { enabled = true, custom_bg = "lualine" },
|
||||||
neotest = true,
|
neotest = true,
|
||||||
|
neotree = true,
|
||||||
noice = true,
|
noice = true,
|
||||||
notify = true,
|
notify = true,
|
||||||
nvimtree = true,
|
|
||||||
semantic_tokens = true,
|
semantic_tokens = true,
|
||||||
telescope = true,
|
telescope = true,
|
||||||
treesitter = true,
|
treesitter = true,
|
||||||
|
treesitter_context = true,
|
||||||
which_key = true,
|
which_key = true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
require("lazyvim.config").init()
|
|
||||||
|
|
||||||
return {
|
|
||||||
{ "folke/lazy.nvim", version = "*" },
|
|
||||||
{ "LazyVim/LazyVim", priority = 10000, lazy = false, config = true, cond = true, version = "*" },
|
|
||||||
}
|
|
||||||
|
|
@ -5,12 +5,13 @@ return {
|
||||||
-- file explorer
|
-- file explorer
|
||||||
{
|
{
|
||||||
"nvim-neo-tree/neo-tree.nvim",
|
"nvim-neo-tree/neo-tree.nvim",
|
||||||
|
branch = "v3.x",
|
||||||
cmd = "Neotree",
|
cmd = "Neotree",
|
||||||
keys = {
|
keys = {
|
||||||
{
|
{
|
||||||
"<leader>fe",
|
"<leader>fe",
|
||||||
function()
|
function()
|
||||||
require("neo-tree.command").execute({ toggle = true, dir = require("lazyvim.util").get_root() })
|
require("neo-tree.command").execute({ toggle = true, dir = Util.root() })
|
||||||
end,
|
end,
|
||||||
desc = "Explorer NeoTree (root dir)",
|
desc = "Explorer NeoTree (root dir)",
|
||||||
},
|
},
|
||||||
|
|
@ -23,13 +24,26 @@ return {
|
||||||
},
|
},
|
||||||
{ "<leader>e", "<leader>fe", desc = "Explorer NeoTree (root dir)", remap = true },
|
{ "<leader>e", "<leader>fe", desc = "Explorer NeoTree (root dir)", remap = true },
|
||||||
{ "<leader>E", "<leader>fE", desc = "Explorer NeoTree (cwd)", remap = true },
|
{ "<leader>E", "<leader>fE", desc = "Explorer NeoTree (cwd)", remap = true },
|
||||||
|
{
|
||||||
|
"<leader>ge",
|
||||||
|
function()
|
||||||
|
require("neo-tree.command").execute({ source = "git_status", toggle = true })
|
||||||
|
end,
|
||||||
|
desc = "Git explorer",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>be",
|
||||||
|
function()
|
||||||
|
require("neo-tree.command").execute({ source = "buffers", toggle = true })
|
||||||
|
end,
|
||||||
|
desc = "Buffer explorer",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
deactivate = function()
|
deactivate = function()
|
||||||
vim.cmd([[Neotree close]])
|
vim.cmd([[Neotree close]])
|
||||||
end,
|
end,
|
||||||
init = function()
|
init = function()
|
||||||
vim.g.neo_tree_remove_legacy_commands = 1
|
if vim.fn.argc(-1) == 1 then
|
||||||
if vim.fn.argc() == 1 then
|
|
||||||
local stat = vim.loop.fs_stat(vim.fn.argv(0))
|
local stat = vim.loop.fs_stat(vim.fn.argv(0))
|
||||||
if stat and stat.type == "directory" then
|
if stat and stat.type == "directory" then
|
||||||
require("neo-tree")
|
require("neo-tree")
|
||||||
|
|
@ -38,10 +52,10 @@ return {
|
||||||
end,
|
end,
|
||||||
opts = {
|
opts = {
|
||||||
sources = { "filesystem", "buffers", "git_status", "document_symbols" },
|
sources = { "filesystem", "buffers", "git_status", "document_symbols" },
|
||||||
open_files_do_not_replace_types = { "terminal", "Trouble", "qf", "Outline" },
|
open_files_do_not_replace_types = { "terminal", "Trouble", "trouble", "qf", "Outline" },
|
||||||
filesystem = {
|
filesystem = {
|
||||||
bind_to_cwd = false,
|
bind_to_cwd = false,
|
||||||
follow_current_file = true,
|
follow_current_file = { enabled = true },
|
||||||
use_libuv_file_watcher = true,
|
use_libuv_file_watcher = true,
|
||||||
},
|
},
|
||||||
window = {
|
window = {
|
||||||
|
|
@ -56,19 +70,19 @@ return {
|
||||||
expander_expanded = "",
|
expander_expanded = "",
|
||||||
expander_highlight = "NeoTreeExpander",
|
expander_highlight = "NeoTreeExpander",
|
||||||
},
|
},
|
||||||
icon = {
|
|
||||||
folder_empty = "",
|
|
||||||
folder_empty_open = "",
|
|
||||||
},
|
|
||||||
git_status = {
|
|
||||||
symbols = {
|
|
||||||
renamed = "",
|
|
||||||
unstaged = "",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
|
local function on_move(data)
|
||||||
|
Util.lsp.on_rename(data.source, data.destination)
|
||||||
|
end
|
||||||
|
|
||||||
|
local events = require("neo-tree.events")
|
||||||
|
opts.event_handlers = opts.event_handlers or {}
|
||||||
|
vim.list_extend(opts.event_handlers, {
|
||||||
|
{ event = events.FILE_MOVED, handler = on_move },
|
||||||
|
{ event = events.FILE_RENAMED, handler = on_move },
|
||||||
|
})
|
||||||
require("neo-tree").setup(opts)
|
require("neo-tree").setup(opts)
|
||||||
vim.api.nvim_create_autocmd("TermClose", {
|
vim.api.nvim_create_autocmd("TermClose", {
|
||||||
pattern = "*lazygit",
|
pattern = "*lazygit",
|
||||||
|
|
@ -84,6 +98,7 @@ return {
|
||||||
-- search/replace in multiple files
|
-- search/replace in multiple files
|
||||||
{
|
{
|
||||||
"nvim-pack/nvim-spectre",
|
"nvim-pack/nvim-spectre",
|
||||||
|
build = false,
|
||||||
cmd = "Spectre",
|
cmd = "Spectre",
|
||||||
opts = { open_cmd = "noswapfile vnew" },
|
opts = { open_cmd = "noswapfile vnew" },
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
|
|
@ -92,19 +107,38 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- fuzzy finder
|
-- Fuzzy finder.
|
||||||
|
-- The default key bindings to find files will use Telescope's
|
||||||
|
-- `find_files` or `git_files` depending on whether the
|
||||||
|
-- directory is a git repo.
|
||||||
{
|
{
|
||||||
"nvim-telescope/telescope.nvim",
|
"nvim-telescope/telescope.nvim",
|
||||||
commit = vim.fn.has("nvim-0.9.0") == 0 and "057ee0f8783" or nil,
|
|
||||||
cmd = "Telescope",
|
cmd = "Telescope",
|
||||||
version = false, -- telescope did only one release, so use HEAD for now
|
version = false, -- telescope did only one release, so use HEAD for now
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"nvim-telescope/telescope-fzf-native.nvim",
|
||||||
|
build = "make",
|
||||||
|
enabled = vim.fn.executable("make") == 1,
|
||||||
|
config = function()
|
||||||
|
Util.on_load("telescope.nvim", function()
|
||||||
|
require("telescope").load_extension("fzf")
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>,", "<cmd>Telescope buffers show_all_buffers=true<cr>", desc = "Switch Buffer" },
|
{
|
||||||
|
"<leader>,",
|
||||||
|
"<cmd>Telescope buffers sort_mru=true sort_lastused=true<cr>",
|
||||||
|
desc = "Switch Buffer",
|
||||||
|
},
|
||||||
{ "<leader>/", Util.telescope("live_grep"), desc = "Grep (root dir)" },
|
{ "<leader>/", Util.telescope("live_grep"), desc = "Grep (root dir)" },
|
||||||
{ "<leader>:", "<cmd>Telescope command_history<cr>", desc = "Command History" },
|
{ "<leader>:", "<cmd>Telescope command_history<cr>", desc = "Command History" },
|
||||||
{ "<leader><space>", Util.telescope("files"), desc = "Find Files (root dir)" },
|
{ "<leader><space>", Util.telescope("files"), desc = "Find Files (root dir)" },
|
||||||
-- find
|
-- find
|
||||||
{ "<leader>fb", "<cmd>Telescope buffers<cr>", desc = "Buffers" },
|
{ "<leader>fb", "<cmd>Telescope buffers sort_mru=true sort_lastused=true<cr>", desc = "Buffers" },
|
||||||
|
{ "<leader>fc", Util.telescope.config_files(), desc = "Find Config File" },
|
||||||
{ "<leader>ff", Util.telescope("files"), desc = "Find Files (root dir)" },
|
{ "<leader>ff", Util.telescope("files"), desc = "Find Files (root dir)" },
|
||||||
{ "<leader>fF", Util.telescope("files", { cwd = false }), desc = "Find Files (cwd)" },
|
{ "<leader>fF", Util.telescope("files", { cwd = false }), desc = "Find Files (cwd)" },
|
||||||
{ "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "Recent" },
|
{ "<leader>fr", "<cmd>Telescope oldfiles<cr>", desc = "Recent" },
|
||||||
|
|
@ -113,6 +147,7 @@ return {
|
||||||
{ "<leader>gc", "<cmd>Telescope git_commits<CR>", desc = "commits" },
|
{ "<leader>gc", "<cmd>Telescope git_commits<CR>", desc = "commits" },
|
||||||
{ "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "status" },
|
{ "<leader>gs", "<cmd>Telescope git_status<CR>", desc = "status" },
|
||||||
-- search
|
-- search
|
||||||
|
{ '<leader>s"', "<cmd>Telescope registers<cr>", desc = "Registers" },
|
||||||
{ "<leader>sa", "<cmd>Telescope autocommands<cr>", desc = "Auto Commands" },
|
{ "<leader>sa", "<cmd>Telescope autocommands<cr>", desc = "Auto Commands" },
|
||||||
{ "<leader>sb", "<cmd>Telescope current_buffer_fuzzy_find<cr>", desc = "Buffer" },
|
{ "<leader>sb", "<cmd>Telescope current_buffer_fuzzy_find<cr>", desc = "Buffer" },
|
||||||
{ "<leader>sc", "<cmd>Telescope command_history<cr>", desc = "Command History" },
|
{ "<leader>sc", "<cmd>Telescope command_history<cr>", desc = "Command History" },
|
||||||
|
|
@ -128,123 +163,140 @@ return {
|
||||||
{ "<leader>sm", "<cmd>Telescope marks<cr>", desc = "Jump to Mark" },
|
{ "<leader>sm", "<cmd>Telescope marks<cr>", desc = "Jump to Mark" },
|
||||||
{ "<leader>so", "<cmd>Telescope vim_options<cr>", desc = "Options" },
|
{ "<leader>so", "<cmd>Telescope vim_options<cr>", desc = "Options" },
|
||||||
{ "<leader>sR", "<cmd>Telescope resume<cr>", desc = "Resume" },
|
{ "<leader>sR", "<cmd>Telescope resume<cr>", desc = "Resume" },
|
||||||
{ "<leader>sw", Util.telescope("grep_string"), desc = "Word (root dir)" },
|
{ "<leader>sw", Util.telescope("grep_string", { word_match = "-w" }), desc = "Word (root dir)" },
|
||||||
{ "<leader>sW", Util.telescope("grep_string", { cwd = false }), desc = "Word (cwd)" },
|
{ "<leader>sW", Util.telescope("grep_string", { cwd = false, word_match = "-w" }), desc = "Word (cwd)" },
|
||||||
|
{ "<leader>sw", Util.telescope("grep_string"), mode = "v", desc = "Selection (root dir)" },
|
||||||
|
{ "<leader>sW", Util.telescope("grep_string", { cwd = false }), mode = "v", desc = "Selection (cwd)" },
|
||||||
{ "<leader>uC", Util.telescope("colorscheme", { enable_preview = true }), desc = "Colorscheme with preview" },
|
{ "<leader>uC", Util.telescope("colorscheme", { enable_preview = true }), desc = "Colorscheme with preview" },
|
||||||
{
|
{
|
||||||
"<leader>ss",
|
"<leader>ss",
|
||||||
Util.telescope("lsp_document_symbols", {
|
function()
|
||||||
symbols = {
|
require("telescope.builtin").lsp_document_symbols({
|
||||||
"Class",
|
symbols = require("lazyvim.config").get_kind_filter(),
|
||||||
"Function",
|
})
|
||||||
"Method",
|
end,
|
||||||
"Constructor",
|
|
||||||
"Interface",
|
|
||||||
"Module",
|
|
||||||
"Struct",
|
|
||||||
"Trait",
|
|
||||||
"Field",
|
|
||||||
"Property",
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
desc = "Goto Symbol",
|
desc = "Goto Symbol",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"<leader>sS",
|
"<leader>sS",
|
||||||
Util.telescope("lsp_dynamic_workspace_symbols", {
|
function()
|
||||||
symbols = {
|
require("telescope.builtin").lsp_dynamic_workspace_symbols({
|
||||||
"Class",
|
symbols = require("lazyvim.config").get_kind_filter(),
|
||||||
"Function",
|
})
|
||||||
"Method",
|
end,
|
||||||
"Constructor",
|
|
||||||
"Interface",
|
|
||||||
"Module",
|
|
||||||
"Struct",
|
|
||||||
"Trait",
|
|
||||||
"Field",
|
|
||||||
"Property",
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
desc = "Goto Symbol (Workspace)",
|
desc = "Goto Symbol (Workspace)",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
opts = {
|
opts = function()
|
||||||
defaults = {
|
local actions = require("telescope.actions")
|
||||||
prompt_prefix = " ",
|
|
||||||
selection_caret = " ",
|
local open_with_trouble = function(...)
|
||||||
mappings = {
|
return require("trouble.providers.telescope").open_with_trouble(...)
|
||||||
i = {
|
end
|
||||||
["<c-t>"] = function(...)
|
local open_selected_with_trouble = function(...)
|
||||||
return require("trouble.providers.telescope").open_with_trouble(...)
|
return require("trouble.providers.telescope").open_selected_with_trouble(...)
|
||||||
end,
|
end
|
||||||
["<a-t>"] = function(...)
|
local find_files_no_ignore = function()
|
||||||
return require("trouble.providers.telescope").open_selected_with_trouble(...)
|
local action_state = require("telescope.actions.state")
|
||||||
end,
|
local line = action_state.get_current_line()
|
||||||
["<a-i>"] = function()
|
Util.telescope("find_files", { no_ignore = true, default_text = line })()
|
||||||
local action_state = require("telescope.actions.state")
|
end
|
||||||
local line = action_state.get_current_line()
|
local find_files_with_hidden = function()
|
||||||
Util.telescope("find_files", { no_ignore = true, default_text = line })()
|
local action_state = require("telescope.actions.state")
|
||||||
end,
|
local line = action_state.get_current_line()
|
||||||
["<a-h>"] = function()
|
Util.telescope("find_files", { hidden = true, default_text = line })()
|
||||||
local action_state = require("telescope.actions.state")
|
end
|
||||||
local line = action_state.get_current_line()
|
|
||||||
Util.telescope("find_files", { hidden = true, default_text = line })()
|
return {
|
||||||
end,
|
defaults = {
|
||||||
["<C-Down>"] = function(...)
|
prompt_prefix = " ",
|
||||||
return require("telescope.actions").cycle_history_next(...)
|
selection_caret = " ",
|
||||||
end,
|
-- open files in the first window that is an actual file.
|
||||||
["<C-Up>"] = function(...)
|
-- use the current window if no other window is available.
|
||||||
return require("telescope.actions").cycle_history_prev(...)
|
get_selection_window = function()
|
||||||
end,
|
local wins = vim.api.nvim_list_wins()
|
||||||
["<C-f>"] = function(...)
|
table.insert(wins, 1, vim.api.nvim_get_current_win())
|
||||||
return require("telescope.actions").preview_scrolling_down(...)
|
for _, win in ipairs(wins) do
|
||||||
end,
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
["<C-b>"] = function(...)
|
if vim.bo[buf].buftype == "" then
|
||||||
return require("telescope.actions").preview_scrolling_up(...)
|
return win
|
||||||
end,
|
end
|
||||||
},
|
end
|
||||||
n = {
|
return 0
|
||||||
["q"] = function(...)
|
end,
|
||||||
return require("telescope.actions").close(...)
|
mappings = {
|
||||||
end,
|
i = {
|
||||||
|
["<c-t>"] = open_with_trouble,
|
||||||
|
["<a-t>"] = open_selected_with_trouble,
|
||||||
|
["<a-i>"] = find_files_no_ignore,
|
||||||
|
["<a-h>"] = find_files_with_hidden,
|
||||||
|
["<C-Down>"] = actions.cycle_history_next,
|
||||||
|
["<C-Up>"] = actions.cycle_history_prev,
|
||||||
|
["<C-f>"] = actions.preview_scrolling_down,
|
||||||
|
["<C-b>"] = actions.preview_scrolling_up,
|
||||||
|
},
|
||||||
|
n = {
|
||||||
|
["q"] = actions.close,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
}
|
||||||
},
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- easily jump to any location and enhanced f/t motions for Leap
|
-- Flash enhances the built-in search functionality by showing labels
|
||||||
|
-- at the end of each match, letting you quickly jump to a specific
|
||||||
|
-- location.
|
||||||
{
|
{
|
||||||
"ggandor/flit.nvim",
|
"folke/flash.nvim",
|
||||||
keys = function()
|
event = "VeryLazy",
|
||||||
---@type LazyKeys[]
|
vscode = true,
|
||||||
local ret = {}
|
---@type Flash.Config
|
||||||
for _, key in ipairs({ "f", "F", "t", "T" }) do
|
opts = {},
|
||||||
ret[#ret + 1] = { key, mode = { "n", "x", "o" }, desc = key }
|
-- stylua: ignore
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end,
|
|
||||||
opts = { labeled_modes = "nx" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"ggandor/leap.nvim",
|
|
||||||
keys = {
|
keys = {
|
||||||
{ "s", mode = { "n", "x", "o" }, desc = "Leap forward to" },
|
{ "s", mode = { "n", "x", "o" }, function() require("flash").jump() end, desc = "Flash" },
|
||||||
{ "S", mode = { "n", "x", "o" }, desc = "Leap backward to" },
|
{ "S", mode = { "n", "o", "x" }, function() require("flash").treesitter() end, desc = "Flash Treesitter" },
|
||||||
{ "gs", mode = { "n", "x", "o" }, desc = "Leap from windows" },
|
{ "r", mode = "o", function() require("flash").remote() end, desc = "Remote Flash" },
|
||||||
|
{ "R", mode = { "o", "x" }, function() require("flash").treesitter_search() end, desc = "Treesitter Search" },
|
||||||
|
{ "<c-s>", mode = { "c" }, function() require("flash").toggle() end, desc = "Toggle Flash Search" },
|
||||||
},
|
},
|
||||||
config = function(_, opts)
|
},
|
||||||
local leap = require("leap")
|
|
||||||
for k, v in pairs(opts) do
|
-- Flash Telescope config
|
||||||
leap.opts[k] = v
|
{
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
if not Util.has("flash.nvim") then
|
||||||
|
return
|
||||||
end
|
end
|
||||||
leap.add_default_mappings(true)
|
local function flash(prompt_bufnr)
|
||||||
vim.keymap.del({ "x", "o" }, "x")
|
require("flash").jump({
|
||||||
vim.keymap.del({ "x", "o" }, "X")
|
pattern = "^",
|
||||||
|
label = { after = { 0, 0 } },
|
||||||
|
search = {
|
||||||
|
mode = "search",
|
||||||
|
exclude = {
|
||||||
|
function(win)
|
||||||
|
return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "TelescopeResults"
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
action = function(match)
|
||||||
|
local picker = require("telescope.actions.state").get_current_picker(prompt_bufnr)
|
||||||
|
picker:set_selection(match.pos[1] - 1)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
opts.defaults = vim.tbl_deep_extend("force", opts.defaults or {}, {
|
||||||
|
mappings = { n = { s = flash }, i = { ["<c-s>"] = flash } },
|
||||||
|
})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- which-key
|
-- which-key helps you remember key bindings by showing a popup
|
||||||
|
-- with the active keybindings of the command you started typing.
|
||||||
{
|
{
|
||||||
"folke/which-key.nvim",
|
"folke/which-key.nvim",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
|
|
@ -253,7 +305,7 @@ return {
|
||||||
defaults = {
|
defaults = {
|
||||||
mode = { "n", "v" },
|
mode = { "n", "v" },
|
||||||
["g"] = { name = "+goto" },
|
["g"] = { name = "+goto" },
|
||||||
["gz"] = { name = "+surround" },
|
["gs"] = { name = "+surround" },
|
||||||
["]"] = { name = "+next" },
|
["]"] = { name = "+next" },
|
||||||
["["] = { name = "+prev" },
|
["["] = { name = "+prev" },
|
||||||
["<leader><tab>"] = { name = "+tabs" },
|
["<leader><tab>"] = { name = "+tabs" },
|
||||||
|
|
@ -276,10 +328,12 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- git signs
|
-- git signs highlights text that has changed since the list
|
||||||
|
-- git commit, and also lets you interactively stage & unstage
|
||||||
|
-- hunks in a commit.
|
||||||
{
|
{
|
||||||
"lewis6991/gitsigns.nvim",
|
"lewis6991/gitsigns.nvim",
|
||||||
event = { "BufReadPre", "BufNewFile" },
|
event = "LazyFile",
|
||||||
opts = {
|
opts = {
|
||||||
signs = {
|
signs = {
|
||||||
add = { text = "▎" },
|
add = { text = "▎" },
|
||||||
|
|
@ -313,10 +367,12 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- references
|
-- Automatically highlights other instances of the word under your cursor.
|
||||||
|
-- This works with LSP, Treesitter, and regexp matching to find the other
|
||||||
|
-- instances.
|
||||||
{
|
{
|
||||||
"RRethy/vim-illuminate",
|
"RRethy/vim-illuminate",
|
||||||
event = { "BufReadPost", "BufNewFile" },
|
event = "LazyFile",
|
||||||
opts = {
|
opts = {
|
||||||
delay = 200,
|
delay = 200,
|
||||||
large_file_cutoff = 2000,
|
large_file_cutoff = 2000,
|
||||||
|
|
@ -354,9 +410,27 @@ return {
|
||||||
-- buffer remove
|
-- buffer remove
|
||||||
{
|
{
|
||||||
"echasnovski/mini.bufremove",
|
"echasnovski/mini.bufremove",
|
||||||
-- stylua: ignore
|
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>bd", function() require("mini.bufremove").delete(0, false) end, desc = "Delete Buffer" },
|
{
|
||||||
|
"<leader>bd",
|
||||||
|
function()
|
||||||
|
local bd = require("mini.bufremove").delete
|
||||||
|
if vim.bo.modified then
|
||||||
|
local choice = vim.fn.confirm(("Save changes to %q?"):format(vim.fn.bufname()), "&Yes\n&No\n&Cancel")
|
||||||
|
if choice == 1 then -- Yes
|
||||||
|
vim.cmd.write()
|
||||||
|
bd(0)
|
||||||
|
elseif choice == 2 then -- No
|
||||||
|
bd(0, true)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
bd(0)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Delete Buffer",
|
||||||
|
},
|
||||||
|
-- stylua: ignore
|
||||||
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "Delete Buffer (Force)" },
|
{ "<leader>bD", function() require("mini.bufremove").delete(0, true) end, desc = "Delete Buffer (Force)" },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -402,11 +476,12 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- todo comments
|
-- Finds and lists all of the TODO, HACK, BUG, etc comment
|
||||||
|
-- in your project and loads them into a browsable list.
|
||||||
{
|
{
|
||||||
"folke/todo-comments.nvim",
|
"folke/todo-comments.nvim",
|
||||||
cmd = { "TodoTrouble", "TodoTelescope" },
|
cmd = { "TodoTrouble", "TodoTelescope" },
|
||||||
event = { "BufReadPost", "BufNewFile" },
|
event = "LazyFile",
|
||||||
config = true,
|
config = true,
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
keys = {
|
keys = {
|
||||||
|
|
|
||||||
33
lua/lazyvim/plugins/extras/coding/codeium.lua
Normal file
33
lua/lazyvim/plugins/extras/coding/codeium.lua
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- codeium cmp source
|
||||||
|
{
|
||||||
|
"nvim-cmp",
|
||||||
|
dependencies = {
|
||||||
|
-- codeium
|
||||||
|
{
|
||||||
|
"Exafunction/codeium.nvim",
|
||||||
|
cmd = "Codeium",
|
||||||
|
build = ":Codeium Auth",
|
||||||
|
opts = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
---@param opts cmp.ConfigSchema
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sources, 1, {
|
||||||
|
name = "codeium",
|
||||||
|
group_index = 1,
|
||||||
|
priority = 100,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
optional = true,
|
||||||
|
event = "VeryLazy",
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sections.lualine_x, 2, require("lazyvim.util").lualine.cmp_source("codeium"))
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -21,10 +21,10 @@ return {
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
local Util = require("lazyvim.util")
|
local Util = require("lazyvim.util")
|
||||||
local colors = {
|
local colors = {
|
||||||
[""] = Util.fg("Special"),
|
[""] = Util.ui.fg("Special"),
|
||||||
["Normal"] = Util.fg("Special"),
|
["Normal"] = Util.ui.fg("Special"),
|
||||||
["Warning"] = Util.fg("DiagnosticError"),
|
["Warning"] = Util.ui.fg("DiagnosticError"),
|
||||||
["InProgress"] = Util.fg("DiagnosticWarn"),
|
["InProgress"] = Util.ui.fg("DiagnosticWarn"),
|
||||||
}
|
}
|
||||||
table.insert(opts.sections.lualine_x, 2, {
|
table.insert(opts.sections.lualine_x, 2, {
|
||||||
function()
|
function()
|
||||||
|
|
@ -33,7 +33,13 @@ return {
|
||||||
return icon .. (status.message or "")
|
return icon .. (status.message or "")
|
||||||
end,
|
end,
|
||||||
cond = function()
|
cond = function()
|
||||||
local ok, clients = pcall(vim.lsp.get_active_clients, { name = "copilot", bufnr = 0 })
|
if not package.loaded["copilot"] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local ok, clients = pcall(require("lazyvim.util").lsp.get_clients, { name = "copilot", bufnr = 0 })
|
||||||
|
if not ok then
|
||||||
|
return false
|
||||||
|
end
|
||||||
return ok and #clients > 0
|
return ok and #clients > 0
|
||||||
end,
|
end,
|
||||||
color = function()
|
color = function()
|
||||||
|
|
@ -60,7 +66,7 @@ return {
|
||||||
copilot_cmp.setup(opts)
|
copilot_cmp.setup(opts)
|
||||||
-- attach cmp source whenever copilot attaches
|
-- attach cmp source whenever copilot attaches
|
||||||
-- fixes lazy-loading issues with the copilot cmp source
|
-- fixes lazy-loading issues with the copilot cmp source
|
||||||
require("lazyvim.util").on_attach(function(client)
|
require("lazyvim.util").lsp.on_attach(function(client)
|
||||||
if client.name == "copilot" then
|
if client.name == "copilot" then
|
||||||
copilot_cmp._on_insert_enter({})
|
copilot_cmp._on_insert_enter({})
|
||||||
end
|
end
|
||||||
|
|
@ -70,28 +76,11 @@ return {
|
||||||
},
|
},
|
||||||
---@param opts cmp.ConfigSchema
|
---@param opts cmp.ConfigSchema
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
local cmp = require("cmp")
|
table.insert(opts.sources, 1, {
|
||||||
|
name = "copilot",
|
||||||
table.insert(opts.sources, 1, { name = "copilot", group_index = 2 })
|
group_index = 1,
|
||||||
|
priority = 100,
|
||||||
opts.sorting = {
|
})
|
||||||
priority_weight = 2,
|
|
||||||
comparators = {
|
|
||||||
require("copilot_cmp.comparators").prioritize,
|
|
||||||
|
|
||||||
-- Below is the default comparitor list and order for nvim-cmp
|
|
||||||
cmp.config.compare.offset,
|
|
||||||
-- cmp.config.compare.scopes, --this is commented in nvim-cmp too
|
|
||||||
cmp.config.compare.exact,
|
|
||||||
cmp.config.compare.score,
|
|
||||||
cmp.config.compare.recently_used,
|
|
||||||
cmp.config.compare.locality,
|
|
||||||
cmp.config.compare.kind,
|
|
||||||
cmp.config.compare.sort_text,
|
|
||||||
cmp.config.compare.length,
|
|
||||||
cmp.config.compare.order,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
51
lua/lazyvim/plugins/extras/coding/tabnine.lua
Normal file
51
lua/lazyvim/plugins/extras/coding/tabnine.lua
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
return {
|
||||||
|
-- Tabnine cmp source
|
||||||
|
{
|
||||||
|
"nvim-cmp",
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"tzachar/cmp-tabnine",
|
||||||
|
build = {
|
||||||
|
Util.is_win() and "pwsh -noni .\\install.ps1" or "./install.sh",
|
||||||
|
":CmpTabnineHub",
|
||||||
|
},
|
||||||
|
dependencies = "hrsh7th/nvim-cmp",
|
||||||
|
opts = {
|
||||||
|
max_lines = 1000,
|
||||||
|
max_num_results = 3,
|
||||||
|
sort = true,
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
require("cmp_tabnine.config"):setup(opts)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
---@param opts cmp.ConfigSchema
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sources, 1, {
|
||||||
|
name = "cmp_tabnine",
|
||||||
|
group_index = 1,
|
||||||
|
priority = 100,
|
||||||
|
})
|
||||||
|
|
||||||
|
opts.formatting.format = Util.inject.args(opts.formatting.format, function(entry, item)
|
||||||
|
-- Hide percentage in the menu
|
||||||
|
if entry.source.name == "cmp_tabnine" then
|
||||||
|
item.menu = ""
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
-- Show TabNine status in lualine
|
||||||
|
{
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
optional = true,
|
||||||
|
event = "VeryLazy",
|
||||||
|
opts = function(_, opts)
|
||||||
|
local icon = require("lazyvim.config").icons.kinds.TabNine
|
||||||
|
table.insert(opts.sections.lualine_x, 2, require("lazyvim.util").lualine.cmp_source("cmp_tabnine", icon))
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
32
lua/lazyvim/plugins/extras/coding/yanky.lua
Normal file
32
lua/lazyvim/plugins/extras/coding/yanky.lua
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
return {
|
||||||
|
-- better yank/paste
|
||||||
|
{
|
||||||
|
"gbprod/yanky.nvim",
|
||||||
|
dependencies = { { "kkharji/sqlite.lua", enabled = not jit.os:find("Windows") } },
|
||||||
|
opts = {
|
||||||
|
highlight = { timer = 250 },
|
||||||
|
ring = { storage = jit.os:find("Windows") and "shada" or "sqlite" },
|
||||||
|
},
|
||||||
|
keys = {
|
||||||
|
-- stylua: ignore
|
||||||
|
{ "<leader>p", function() require("telescope").extensions.yank_history.yank_history({ }) end, desc = "Open Yank History" },
|
||||||
|
{ "y", "<Plug>(YankyYank)", mode = { "n", "x" }, desc = "Yank text" },
|
||||||
|
{ "p", "<Plug>(YankyPutAfter)", mode = { "n", "x" }, desc = "Put yanked text after cursor" },
|
||||||
|
{ "P", "<Plug>(YankyPutBefore)", mode = { "n", "x" }, desc = "Put yanked text before cursor" },
|
||||||
|
{ "gp", "<Plug>(YankyGPutAfter)", mode = { "n", "x" }, desc = "Put yanked text after selection" },
|
||||||
|
{ "gP", "<Plug>(YankyGPutBefore)", mode = { "n", "x" }, desc = "Put yanked text before selection" },
|
||||||
|
{ "[y", "<Plug>(YankyCycleForward)", desc = "Cycle forward through yank history" },
|
||||||
|
{ "]y", "<Plug>(YankyCycleBackward)", desc = "Cycle backward through yank history" },
|
||||||
|
{ "]p", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
||||||
|
{ "[p", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
||||||
|
{ "]P", "<Plug>(YankyPutIndentAfterLinewise)", desc = "Put indented after cursor (linewise)" },
|
||||||
|
{ "[P", "<Plug>(YankyPutIndentBeforeLinewise)", desc = "Put indented before cursor (linewise)" },
|
||||||
|
{ ">p", "<Plug>(YankyPutIndentAfterShiftRight)", desc = "Put and indent right" },
|
||||||
|
{ "<p", "<Plug>(YankyPutIndentAfterShiftLeft)", desc = "Put and indent left" },
|
||||||
|
{ ">P", "<Plug>(YankyPutIndentBeforeShiftRight)", desc = "Put before and indent right" },
|
||||||
|
{ "<P", "<Plug>(YankyPutIndentBeforeShiftLeft)", desc = "Put before and indent left" },
|
||||||
|
{ "=p", "<Plug>(YankyPutAfterFilter)", desc = "Put after applying a filter" },
|
||||||
|
{ "=P", "<Plug>(YankyPutBeforeFilter)", desc = "Put before applying a filter" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,15 @@
|
||||||
|
---@param config {args?:string[]|fun():string[]?}
|
||||||
|
local function get_args(config)
|
||||||
|
local args = type(config.args) == "function" and (config.args() or {}) or config.args or {}
|
||||||
|
config = vim.deepcopy(config)
|
||||||
|
---@cast args string[]
|
||||||
|
config.args = function()
|
||||||
|
local new_args = vim.fn.input("Run with args: ", table.concat(args, " ")) --[[@as string]]
|
||||||
|
return vim.split(vim.fn.expand(new_args) --[[@as string]], " ")
|
||||||
|
end
|
||||||
|
return config
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"mfussenegger/nvim-dap",
|
"mfussenegger/nvim-dap",
|
||||||
|
|
||||||
|
|
@ -13,6 +25,8 @@ return {
|
||||||
},
|
},
|
||||||
opts = {},
|
opts = {},
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
|
-- setup dap config by VsCode launch.json file
|
||||||
|
-- require("dap.ext.vscode").load_launchjs()
|
||||||
local dap = require("dap")
|
local dap = require("dap")
|
||||||
local dapui = require("dapui")
|
local dapui = require("dapui")
|
||||||
dapui.setup(opts)
|
dapui.setup(opts)
|
||||||
|
|
@ -41,7 +55,6 @@ return {
|
||||||
opts = {
|
opts = {
|
||||||
defaults = {
|
defaults = {
|
||||||
["<leader>d"] = { name = "+debug" },
|
["<leader>d"] = { name = "+debug" },
|
||||||
["<leader>da"] = { name = "+adapters" },
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
@ -74,6 +87,7 @@ return {
|
||||||
{ "<leader>dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" },
|
{ "<leader>dB", function() require("dap").set_breakpoint(vim.fn.input('Breakpoint condition: ')) end, desc = "Breakpoint Condition" },
|
||||||
{ "<leader>db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" },
|
{ "<leader>db", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" },
|
||||||
{ "<leader>dc", function() require("dap").continue() end, desc = "Continue" },
|
{ "<leader>dc", function() require("dap").continue() end, desc = "Continue" },
|
||||||
|
{ "<leader>da", function() require("dap").continue({ before = get_args }) end, desc = "Run with Args" },
|
||||||
{ "<leader>dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" },
|
{ "<leader>dC", function() require("dap").run_to_cursor() end, desc = "Run to Cursor" },
|
||||||
{ "<leader>dg", function() require("dap").goto_() end, desc = "Go to line (no execute)" },
|
{ "<leader>dg", function() require("dap").goto_() end, desc = "Go to line (no execute)" },
|
||||||
{ "<leader>di", function() require("dap").step_into() end, desc = "Step Into" },
|
{ "<leader>di", function() require("dap").step_into() end, desc = "Step Into" },
|
||||||
|
|
|
||||||
|
|
@ -1,24 +1,40 @@
|
||||||
return {
|
return {
|
||||||
"mfussenegger/nvim-dap",
|
"mfussenegger/nvim-dap",
|
||||||
|
|
||||||
dependencies = {
|
dependencies = {
|
||||||
{
|
{
|
||||||
"jbyuki/one-small-step-for-vimkind",
|
"jbyuki/one-small-step-for-vimkind",
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
keys = {
|
|
||||||
{ "<leader>daL", function() require("osv").launch({ port = 8086 }) end, desc = "Adapter Lua Server" },
|
|
||||||
{ "<leader>dal", function() require("osv").run_this() end, desc = "Adapter Lua" },
|
|
||||||
},
|
|
||||||
config = function()
|
config = function()
|
||||||
local dap = require("dap")
|
local dap = require("dap")
|
||||||
dap.adapters.nlua = function(callback, config)
|
dap.adapters.nlua = function(callback, conf)
|
||||||
callback({ type = "server", host = config.host or "127.0.0.1", port = config.port or 8086 })
|
local adapter = {
|
||||||
|
type = "server",
|
||||||
|
host = conf.host or "127.0.0.1",
|
||||||
|
port = conf.port or 8086,
|
||||||
|
}
|
||||||
|
if conf.start_neovim then
|
||||||
|
local dap_run = dap.run
|
||||||
|
dap.run = function(c)
|
||||||
|
adapter.port = c.port
|
||||||
|
adapter.host = c.host
|
||||||
|
end
|
||||||
|
require("osv").run_this()
|
||||||
|
dap.run = dap_run
|
||||||
|
end
|
||||||
|
callback(adapter)
|
||||||
end
|
end
|
||||||
dap.configurations.lua = {
|
dap.configurations.lua = {
|
||||||
{
|
{
|
||||||
type = "nlua",
|
type = "nlua",
|
||||||
request = "attach",
|
request = "attach",
|
||||||
name = "Attach to running Neovim instance",
|
name = "Run this file",
|
||||||
|
start_neovim = {},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type = "nlua",
|
||||||
|
request = "attach",
|
||||||
|
name = "Attach to running Neovim instance (port = 8086)",
|
||||||
|
port = 8086,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end,
|
end,
|
||||||
|
|
|
||||||
123
lua/lazyvim/plugins/extras/editor/aerial.lua
Normal file
123
lua/lazyvim/plugins/extras/editor/aerial.lua
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
return {
|
||||||
|
desc = "Aerial Symbol Browser",
|
||||||
|
{
|
||||||
|
"stevearc/aerial.nvim",
|
||||||
|
event = "LazyFile",
|
||||||
|
opts = function()
|
||||||
|
local icons = vim.deepcopy(Config.icons.kinds)
|
||||||
|
|
||||||
|
-- HACK: fix lua's weird choice for `Package` for control
|
||||||
|
-- structures like if/else/for/etc.
|
||||||
|
icons.lua = { Package = icons.Control }
|
||||||
|
|
||||||
|
---@type table<string, string[]>|false
|
||||||
|
local filter_kind = false
|
||||||
|
if Config.kind_filter then
|
||||||
|
filter_kind = assert(vim.deepcopy(Config.kind_filter))
|
||||||
|
filter_kind._ = filter_kind.default
|
||||||
|
filter_kind.default = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local opts = {
|
||||||
|
attach_mode = "global",
|
||||||
|
backends = { "lsp", "treesitter", "markdown", "man" },
|
||||||
|
show_guides = true,
|
||||||
|
layout = {
|
||||||
|
resize_to_content = false,
|
||||||
|
win_opts = {
|
||||||
|
winhl = "Normal:NormalFloat,FloatBorder:NormalFloat,SignColumn:SignColumnSB",
|
||||||
|
signcolumn = "yes",
|
||||||
|
statuscolumn = " ",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
icons = icons,
|
||||||
|
filter_kind = filter_kind,
|
||||||
|
-- stylua: ignore
|
||||||
|
guides = {
|
||||||
|
mid_item = "├╴",
|
||||||
|
last_item = "└╴",
|
||||||
|
nested_top = "│ ",
|
||||||
|
whitespace = " ",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return opts
|
||||||
|
end,
|
||||||
|
keys = {
|
||||||
|
{ "<leader>cs", "<cmd>AerialToggle<cr>", desc = "Aerial (Symbols)" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Telescope integration
|
||||||
|
{
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function()
|
||||||
|
Util.on_load("telescope.nvim", function()
|
||||||
|
require("telescope").load_extension("aerial")
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>ss",
|
||||||
|
"<cmd>Telescope aerial<cr>",
|
||||||
|
desc = "Goto Symbol (Aerial)",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- edgy integration
|
||||||
|
{
|
||||||
|
"folke/edgy.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local edgy_idx = Util.plugin.extra_idx("ui.edgy")
|
||||||
|
local aerial_idx = Util.plugin.extra_idx("editor.aerial")
|
||||||
|
|
||||||
|
if edgy_idx and edgy_idx > aerial_idx then
|
||||||
|
Util.warn("The `edgy.nvim` extra must be **imported** before the `aerial.nvim` extra to work properly.", {
|
||||||
|
title = "LazyVim",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
opts.right = opts.right or {}
|
||||||
|
table.insert(opts.right, {
|
||||||
|
title = "Aerial",
|
||||||
|
ft = "aerial",
|
||||||
|
pinned = true,
|
||||||
|
open = "AerialOpen",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- lualine integration
|
||||||
|
{
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sections.lualine_c, {
|
||||||
|
"aerial",
|
||||||
|
sep = " ", -- separator between symbols
|
||||||
|
sep_icon = "", -- separator between icon and symbol
|
||||||
|
|
||||||
|
-- The number of symbols to render top-down. In order to render only 'N' last
|
||||||
|
-- symbols, negative numbers may be supplied. For instance, 'depth = -1' can
|
||||||
|
-- be used in order to render only current symbol.
|
||||||
|
depth = 5,
|
||||||
|
|
||||||
|
-- When 'dense' mode is on, icons are not rendered near their symbols. Only
|
||||||
|
-- a single icon that represents the kind of current symbol is rendered at
|
||||||
|
-- the beginning of status line.
|
||||||
|
dense = false,
|
||||||
|
|
||||||
|
-- The separator to be used to separate symbols in dense mode.
|
||||||
|
dense_sep = ".",
|
||||||
|
|
||||||
|
-- Color the symbol icons.
|
||||||
|
colored = true,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
return {
|
|
||||||
{ "ggandor/leap.nvim", enabled = false },
|
|
||||||
{ "ggandor/flit.nvim", enabled = false },
|
|
||||||
{
|
|
||||||
"folke/flash.nvim",
|
|
||||||
event = "VeryLazy",
|
|
||||||
---@type Flash.Config
|
|
||||||
opts = {},
|
|
||||||
keys = {
|
|
||||||
{
|
|
||||||
"s",
|
|
||||||
mode = { "n", "x", "o" },
|
|
||||||
function()
|
|
||||||
require("flash").jump()
|
|
||||||
end,
|
|
||||||
desc = "Flash",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"S",
|
|
||||||
mode = { "n", "o", "x" },
|
|
||||||
function()
|
|
||||||
require("flash").treesitter()
|
|
||||||
end,
|
|
||||||
desc = "Flash Treesitter",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"r",
|
|
||||||
mode = "o",
|
|
||||||
function()
|
|
||||||
require("flash").remote()
|
|
||||||
end,
|
|
||||||
desc = "Remote Flash",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nvim-telescope/telescope.nvim",
|
|
||||||
optional = true,
|
|
||||||
opts = function(_, opts)
|
|
||||||
local function flash(prompt_bufnr)
|
|
||||||
require("flash").jump({
|
|
||||||
pattern = "^",
|
|
||||||
highlight = { label = { after = { 0, 0 } } },
|
|
||||||
search = {
|
|
||||||
mode = "search",
|
|
||||||
exclude = {
|
|
||||||
function(win)
|
|
||||||
return vim.bo[vim.api.nvim_win_get_buf(win)].filetype ~= "TelescopeResults"
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
action = function(match)
|
|
||||||
local picker = require("telescope.actions.state").get_current_picker(prompt_bufnr)
|
|
||||||
picker:set_selection(match.pos[1] - 1)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
opts.defaults = vim.tbl_deep_extend("force", opts.defaults or {}, {
|
|
||||||
mappings = {
|
|
||||||
n = { s = flash },
|
|
||||||
i = { ["<c-s>"] = flash },
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
56
lua/lazyvim/plugins/extras/editor/leap.lua
Normal file
56
lua/lazyvim/plugins/extras/editor/leap.lua
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
return {
|
||||||
|
-- disable flash
|
||||||
|
{ "folke/flash.nvim", enabled = false, optional = true },
|
||||||
|
|
||||||
|
-- easily jump to any location and enhanced f/t motions for Leap
|
||||||
|
{
|
||||||
|
"ggandor/flit.nvim",
|
||||||
|
enabled = true,
|
||||||
|
keys = function()
|
||||||
|
---@type LazyKeys[]
|
||||||
|
local ret = {}
|
||||||
|
for _, key in ipairs({ "f", "F", "t", "T" }) do
|
||||||
|
ret[#ret + 1] = { key, mode = { "n", "x", "o" }, desc = key }
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end,
|
||||||
|
opts = { labeled_modes = "nx" },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ggandor/leap.nvim",
|
||||||
|
enabled = true,
|
||||||
|
keys = {
|
||||||
|
{ "s", mode = { "n", "x", "o" }, desc = "Leap forward to" },
|
||||||
|
{ "S", mode = { "n", "x", "o" }, desc = "Leap backward to" },
|
||||||
|
{ "gs", mode = { "n", "x", "o" }, desc = "Leap from windows" },
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
local leap = require("leap")
|
||||||
|
for k, v in pairs(opts) do
|
||||||
|
leap.opts[k] = v
|
||||||
|
end
|
||||||
|
leap.add_default_mappings(true)
|
||||||
|
vim.keymap.del({ "x", "o" }, "x")
|
||||||
|
vim.keymap.del({ "x", "o" }, "X")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- rename surround mappings from gs to gz to prevent conflict with leap
|
||||||
|
{
|
||||||
|
"echasnovski/mini.surround",
|
||||||
|
opts = {
|
||||||
|
mappings = {
|
||||||
|
add = "gza", -- Add surrounding in Normal and Visual modes
|
||||||
|
delete = "gzd", -- Delete surrounding
|
||||||
|
find = "gzf", -- Find surrounding (to the right)
|
||||||
|
find_left = "gzF", -- Find surrounding (to the left)
|
||||||
|
highlight = "gzh", -- Highlight surrounding
|
||||||
|
replace = "gzr", -- Replace surrounding
|
||||||
|
update_n_lines = "gzn", -- Update `n_lines`
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- makes some plugins dot-repeatable like leap
|
||||||
|
{ "tpope/vim-repeat", event = "VeryLazy" },
|
||||||
|
}
|
||||||
|
|
@ -3,6 +3,8 @@ return {
|
||||||
opts = {
|
opts = {
|
||||||
windows = {
|
windows = {
|
||||||
preview = true,
|
preview = true,
|
||||||
|
width_focus = 30,
|
||||||
|
width_preview = 30,
|
||||||
},
|
},
|
||||||
options = {
|
options = {
|
||||||
-- Whether to use for editing directories
|
-- Whether to use for editing directories
|
||||||
|
|
@ -30,8 +32,12 @@ return {
|
||||||
require("mini.files").setup(opts)
|
require("mini.files").setup(opts)
|
||||||
|
|
||||||
local show_dotfiles = true
|
local show_dotfiles = true
|
||||||
local filter_show = function(fs_entry) return true end
|
local filter_show = function(fs_entry)
|
||||||
local filter_hide = function(fs_entry) return not vim.startswith(fs_entry.name, ".") end
|
return true
|
||||||
|
end
|
||||||
|
local filter_hide = function(fs_entry)
|
||||||
|
return not vim.startswith(fs_entry.name, ".")
|
||||||
|
end
|
||||||
|
|
||||||
local toggle_dotfiles = function()
|
local toggle_dotfiles = function()
|
||||||
show_dotfiles = not show_dotfiles
|
show_dotfiles = not show_dotfiles
|
||||||
|
|
@ -47,5 +53,12 @@ return {
|
||||||
vim.keymap.set("n", "g.", toggle_dotfiles, { buffer = buf_id })
|
vim.keymap.set("n", "g.", toggle_dotfiles, { buffer = buf_id })
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "MiniFilesActionRename",
|
||||||
|
callback = function(event)
|
||||||
|
require("lazyvim.util").lsp.on_rename(event.data.from, event.data.to)
|
||||||
|
end,
|
||||||
|
})
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
|
|
|
||||||
42
lua/lazyvim/plugins/extras/editor/navic.lua
Normal file
42
lua/lazyvim/plugins/extras/editor/navic.lua
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
return {
|
||||||
|
-- lsp symbol navigation for lualine. This shows where
|
||||||
|
-- in the code structure you are - within functions, classes,
|
||||||
|
-- etc - in the statusline.
|
||||||
|
{
|
||||||
|
"SmiteshP/nvim-navic",
|
||||||
|
lazy = true,
|
||||||
|
init = function()
|
||||||
|
vim.g.navic_silence = true
|
||||||
|
require("lazyvim.util").lsp.on_attach(function(client, buffer)
|
||||||
|
if client.supports_method("textDocument/documentSymbol") then
|
||||||
|
require("nvim-navic").attach(client, buffer)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
opts = function()
|
||||||
|
return {
|
||||||
|
separator = " ",
|
||||||
|
highlight = true,
|
||||||
|
depth_limit = 5,
|
||||||
|
icons = require("lazyvim.config").icons.kinds,
|
||||||
|
lazy_update_context = true,
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- lualine integration
|
||||||
|
{
|
||||||
|
"nvim-lualine/lualine.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sections.lualine_c, {
|
||||||
|
function()
|
||||||
|
return require("nvim-navic").get_location()
|
||||||
|
end,
|
||||||
|
cond = function()
|
||||||
|
return package.loaded["nvim-navic"] and require("nvim-navic").is_available()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
61
lua/lazyvim/plugins/extras/editor/symbols-outline.lua
Normal file
61
lua/lazyvim/plugins/extras/editor/symbols-outline.lua
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"simrat39/symbols-outline.nvim",
|
||||||
|
keys = { { "<leader>cs", "<cmd>SymbolsOutline<cr>", desc = "Symbols Outline" } },
|
||||||
|
cmd = "SymbolsOutline",
|
||||||
|
opts = function()
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
local defaults = require("symbols-outline.config").defaults
|
||||||
|
local opts = {
|
||||||
|
symbols = {},
|
||||||
|
symbol_blacklist = {},
|
||||||
|
}
|
||||||
|
local filter = Config.kind_filter
|
||||||
|
|
||||||
|
if type(filter) == "table" then
|
||||||
|
filter = filter.default
|
||||||
|
if type(filter) == "table" then
|
||||||
|
for kind, symbol in pairs(defaults.symbols) do
|
||||||
|
opts.symbols[kind] = {
|
||||||
|
icon = Config.icons.kinds[kind] or symbol.icon,
|
||||||
|
hl = symbol.hl,
|
||||||
|
}
|
||||||
|
if not vim.tbl_contains(filter, kind) then
|
||||||
|
table.insert(opts.symbol_blacklist, kind)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return opts
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- edgy integration
|
||||||
|
{
|
||||||
|
"folke/edgy.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local edgy_idx = Util.plugin.extra_idx("ui.edgy")
|
||||||
|
local symbols_idx = Util.plugin.extra_idx("editor.symbols-outline")
|
||||||
|
|
||||||
|
if edgy_idx and edgy_idx > symbols_idx then
|
||||||
|
Util.warn(
|
||||||
|
"The `edgy.nvim` extra must be **imported** before the `symbols-outline.nvim` extra to work properly.",
|
||||||
|
{
|
||||||
|
title = "LazyVim",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
opts.right = opts.right or {}
|
||||||
|
table.insert(opts.right, {
|
||||||
|
title = "Symbols Outline",
|
||||||
|
ft = "Outline",
|
||||||
|
pinned = true,
|
||||||
|
open = "SymbolsOutline",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
26
lua/lazyvim/plugins/extras/formatting/black.lua
Normal file
26
lua/lazyvim/plugins/extras/formatting/black.lua
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.ensure_installed, "black")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = opts.sources or {}
|
||||||
|
table.insert(opts.sources, nls.builtins.formatting.black)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
formatters_by_ft = {
|
||||||
|
["python"] = { "black" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -2,14 +2,40 @@ return {
|
||||||
{
|
{
|
||||||
"williamboman/mason.nvim",
|
"williamboman/mason.nvim",
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
table.insert(opts.ensure_installed, "prettierd")
|
table.insert(opts.ensure_installed, "prettier")
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"jose-elias-alvarez/null-ls.nvim",
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
local nls = require("null-ls")
|
local nls = require("null-ls")
|
||||||
table.insert(opts.sources, nls.builtins.formatting.prettierd)
|
opts.sources = opts.sources or {}
|
||||||
|
table.insert(opts.sources, nls.builtins.formatting.prettier)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
formatters_by_ft = {
|
||||||
|
["javascript"] = { "prettier" },
|
||||||
|
["javascriptreact"] = { "prettier" },
|
||||||
|
["typescript"] = { "prettier" },
|
||||||
|
["typescriptreact"] = { "prettier" },
|
||||||
|
["vue"] = { "prettier" },
|
||||||
|
["css"] = { "prettier" },
|
||||||
|
["scss"] = { "prettier" },
|
||||||
|
["less"] = { "prettier" },
|
||||||
|
["html"] = { "prettier" },
|
||||||
|
["json"] = { "prettier" },
|
||||||
|
["jsonc"] = { "prettier" },
|
||||||
|
["yaml"] = { "prettier" },
|
||||||
|
["markdown"] = { "prettier" },
|
||||||
|
["markdown.mdx"] = { "prettier" },
|
||||||
|
["graphql"] = { "prettier" },
|
||||||
|
["handlebars"] = { "prettier" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
154
lua/lazyvim/plugins/extras/lang/clangd.lua
Normal file
154
lua/lazyvim/plugins/extras/lang/clangd.lua
Normal file
|
|
@ -0,0 +1,154 @@
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- Add C/C++ to treesitter
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "c", "cpp" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"p00f/clangd_extensions.nvim",
|
||||||
|
lazy = true,
|
||||||
|
config = function() end,
|
||||||
|
opts = {
|
||||||
|
inlay_hints = {
|
||||||
|
inline = false,
|
||||||
|
},
|
||||||
|
ast = {
|
||||||
|
--These require codicons (https://github.com/microsoft/vscode-codicons)
|
||||||
|
role_icons = {
|
||||||
|
type = "",
|
||||||
|
declaration = "",
|
||||||
|
expression = "",
|
||||||
|
specifier = "",
|
||||||
|
statement = "",
|
||||||
|
["template argument"] = "",
|
||||||
|
},
|
||||||
|
kind_icons = {
|
||||||
|
Compound = "",
|
||||||
|
Recovery = "",
|
||||||
|
TranslationUnit = "",
|
||||||
|
PackExpansion = "",
|
||||||
|
TemplateTypeParm = "",
|
||||||
|
TemplateTemplateParm = "",
|
||||||
|
TemplateParamObject = "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Correctly setup lspconfig for clangd 🚀
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
-- Ensure mason installs the server
|
||||||
|
clangd = {
|
||||||
|
keys = {
|
||||||
|
{ "<leader>cR", "<cmd>ClangdSwitchSourceHeader<cr>", desc = "Switch Source/Header (C/C++)" },
|
||||||
|
},
|
||||||
|
root_dir = function(fname)
|
||||||
|
return require("lspconfig.util").root_pattern(
|
||||||
|
"Makefile",
|
||||||
|
"configure.ac",
|
||||||
|
"configure.in",
|
||||||
|
"config.h.in",
|
||||||
|
"meson.build",
|
||||||
|
"meson_options.txt",
|
||||||
|
"build.ninja"
|
||||||
|
)(fname) or require("lspconfig.util").root_pattern("compile_commands.json", "compile_flags.txt")(
|
||||||
|
fname
|
||||||
|
) or require("lspconfig.util").find_git_ancestor(fname)
|
||||||
|
end,
|
||||||
|
capabilities = {
|
||||||
|
offsetEncoding = { "utf-16" },
|
||||||
|
},
|
||||||
|
cmd = {
|
||||||
|
"clangd",
|
||||||
|
"--background-index",
|
||||||
|
"--clang-tidy",
|
||||||
|
"--header-insertion=iwyu",
|
||||||
|
"--completion-style=detailed",
|
||||||
|
"--function-arg-placeholders",
|
||||||
|
"--fallback-style=llvm",
|
||||||
|
},
|
||||||
|
init_options = {
|
||||||
|
usePlaceholders = true,
|
||||||
|
completeUnimported = true,
|
||||||
|
clangdFileStatus = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup = {
|
||||||
|
clangd = function(_, opts)
|
||||||
|
local clangd_ext_opts = require("lazyvim.util").opts("clangd_extensions.nvim")
|
||||||
|
require("clangd_extensions").setup(vim.tbl_deep_extend("force", clangd_ext_opts or {}, { server = opts }))
|
||||||
|
return false
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"nvim-cmp",
|
||||||
|
opts = function(_, opts)
|
||||||
|
table.insert(opts.sorting.comparators, 1, require("clangd_extensions.cmp_scores"))
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-dap",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
-- Ensure C/C++ debugger is installed
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "codelldb" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
opts = function()
|
||||||
|
local dap = require("dap")
|
||||||
|
if not dap.adapters["codelldb"] then
|
||||||
|
require("dap").adapters["codelldb"] = {
|
||||||
|
type = "server",
|
||||||
|
host = "localhost",
|
||||||
|
port = "${port}",
|
||||||
|
executable = {
|
||||||
|
command = "codelldb",
|
||||||
|
args = {
|
||||||
|
"--port",
|
||||||
|
"${port}",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
for _, lang in ipairs({ "c", "cpp" }) do
|
||||||
|
dap.configurations[lang] = {
|
||||||
|
{
|
||||||
|
type = "codelldb",
|
||||||
|
request = "launch",
|
||||||
|
name = "Launch file",
|
||||||
|
program = function()
|
||||||
|
return vim.fn.input("Path to executable: ", vim.fn.getcwd() .. "/", "file")
|
||||||
|
end,
|
||||||
|
cwd = "${workspaceFolder}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type = "codelldb",
|
||||||
|
request = "attach",
|
||||||
|
name = "Attach to process",
|
||||||
|
processId = require("dap.utils").pick_process,
|
||||||
|
cwd = "${workspaceFolder}",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
49
lua/lazyvim/plugins/extras/lang/cmake.lua
Normal file
49
lua/lazyvim/plugins/extras/lang/cmake.lua
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "cmake" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.diagnostics.cmake_lint,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
linters_by_ft = {
|
||||||
|
cmake = { "cmakelint" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "cmakelang", "cmakelint" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
neocmake = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Civitasv/cmake-tools.nvim",
|
||||||
|
opts = {},
|
||||||
|
event = "LazyFile",
|
||||||
|
},
|
||||||
|
}
|
||||||
45
lua/lazyvim/plugins/extras/lang/docker.lua
Normal file
45
lua/lazyvim/plugins/extras/lang/docker.lua
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "dockerfile" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "hadolint" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.diagnostics.hadolint,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
linters_by_ft = {
|
||||||
|
dockerfile = { "hadolint" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
dockerls = {},
|
||||||
|
docker_compose_language_service = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
57
lua/lazyvim/plugins/extras/lang/elixir.lua
Normal file
57
lua/lazyvim/plugins/extras/lang/elixir.lua
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
vim.list_extend(opts.ensure_installed, {
|
||||||
|
"elixir",
|
||||||
|
"heex",
|
||||||
|
"eex",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
vim.list_extend(opts.ensure_installed, {
|
||||||
|
"elixir-ls",
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvim-neotest/neotest",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
"jfpedroza/neotest-elixir",
|
||||||
|
},
|
||||||
|
opts = {
|
||||||
|
adapters = {
|
||||||
|
["neotest-elixir"] = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
if vim.fn.executable("credo") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.diagnostics.credo,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
if vim.fn.executable("credo") == 0 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
opts.linters_by_ft = {
|
||||||
|
elixir = { "credo" },
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -15,18 +15,53 @@ return {
|
||||||
opts = {
|
opts = {
|
||||||
servers = {
|
servers = {
|
||||||
gopls = {
|
gopls = {
|
||||||
|
keys = {
|
||||||
|
-- Workaround for the lack of a DAP strategy in neotest-go: https://github.com/nvim-neotest/neotest-go/issues/12
|
||||||
|
{ "<leader>td", "<cmd>lua require('dap-go').debug_test()<CR>", desc = "Debug Nearest (Go)" },
|
||||||
|
},
|
||||||
settings = {
|
settings = {
|
||||||
gopls = {
|
gopls = {
|
||||||
|
gofumpt = true,
|
||||||
|
codelenses = {
|
||||||
|
gc_details = false,
|
||||||
|
generate = true,
|
||||||
|
regenerate_cgo = true,
|
||||||
|
run_govulncheck = true,
|
||||||
|
test = true,
|
||||||
|
tidy = true,
|
||||||
|
upgrade_dependency = true,
|
||||||
|
vendor = true,
|
||||||
|
},
|
||||||
|
hints = {
|
||||||
|
assignVariableTypes = true,
|
||||||
|
compositeLiteralFields = true,
|
||||||
|
compositeLiteralTypes = true,
|
||||||
|
constantValues = true,
|
||||||
|
functionTypeParameters = true,
|
||||||
|
parameterNames = true,
|
||||||
|
rangeVariableTypes = true,
|
||||||
|
},
|
||||||
|
analyses = {
|
||||||
|
fieldalignment = true,
|
||||||
|
nilness = true,
|
||||||
|
unusedparams = true,
|
||||||
|
unusedwrite = true,
|
||||||
|
useany = true,
|
||||||
|
},
|
||||||
|
usePlaceholders = true,
|
||||||
|
completeUnimported = true,
|
||||||
|
staticcheck = true,
|
||||||
|
directoryFilters = { "-.git", "-.vscode", "-.idea", "-.vscode-test", "-node_modules" },
|
||||||
semanticTokens = true,
|
semanticTokens = true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup = {
|
setup = {
|
||||||
gopls = function()
|
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
|
||||||
require("lazyvim.util").on_attach(function(client, _)
|
require("lazyvim.util").lsp.on_attach(function(client, _)
|
||||||
if client.name == "gopls" then
|
if client.name == "gopls" then
|
||||||
if not client.server_capabilities.semanticTokensProvider then
|
if not client.server_capabilities.semanticTokensProvider then
|
||||||
local semantic = client.config.capabilities.textDocument.semanticTokens
|
local semantic = client.config.capabilities.textDocument.semanticTokens
|
||||||
|
|
@ -46,17 +81,60 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
-- Ensure Go tools are installed
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "goimports", "gofumpt" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "gomodifytags", "impl" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.code_actions.gomodifytags,
|
||||||
|
nls.builtins.code_actions.impl,
|
||||||
|
nls.builtins.formatting.goimports,
|
||||||
|
nls.builtins.formatting.gofumpt,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
formatters_by_ft = {
|
||||||
|
go = { "goimports", "gofumpt" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"mfussenegger/nvim-dap",
|
"mfussenegger/nvim-dap",
|
||||||
optional = true,
|
optional = true,
|
||||||
dependencies = {
|
dependencies = {
|
||||||
{
|
{
|
||||||
"mason.nvim",
|
"williamboman/mason.nvim",
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
opts.ensure_installed = opts.ensure_installed or {}
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
table.insert(opts.ensure_installed, "delve")
|
vim.list_extend(opts.ensure_installed, { "delve" })
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"leoluz/nvim-dap-go",
|
||||||
|
config = true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
||||||
227
lua/lazyvim/plugins/extras/lang/java.lua
Normal file
227
lua/lazyvim/plugins/extras/lang/java.lua
Normal file
|
|
@ -0,0 +1,227 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
-- This is the same as in lspconfig.server_configurations.jdtls, but avoids
|
||||||
|
-- needing to require that when this module loads.
|
||||||
|
local java_filetypes = { "java" }
|
||||||
|
|
||||||
|
-- Utility function to extend or override a config table, similar to the way
|
||||||
|
-- that Plugin.opts works.
|
||||||
|
---@param config table
|
||||||
|
---@param custom function | table | nil
|
||||||
|
local function extend_or_override(config, custom, ...)
|
||||||
|
if type(custom) == "function" then
|
||||||
|
config = custom(config, ...) or config
|
||||||
|
elseif custom then
|
||||||
|
config = vim.tbl_deep_extend("force", config, custom) --[[@as table]]
|
||||||
|
end
|
||||||
|
return config
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
-- Add java to treesitter.
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "java" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Ensure java debugger and test packages are installed.
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-dap",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "java-test", "java-debug-adapter" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Configure nvim-lspconfig to install the server automatically via mason, but
|
||||||
|
-- defer actually starting it to our configuration of nvim-jtdls below.
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
-- make sure mason installs the server
|
||||||
|
servers = {
|
||||||
|
jdtls = {},
|
||||||
|
},
|
||||||
|
setup = {
|
||||||
|
jdtls = function()
|
||||||
|
return true -- avoid duplicate servers
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Set up nvim-jdtls to attach to java files.
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-jdtls",
|
||||||
|
dependencies = { "folke/which-key.nvim" },
|
||||||
|
ft = java_filetypes,
|
||||||
|
opts = function()
|
||||||
|
return {
|
||||||
|
-- How to find the root dir for a given filename. The default comes from
|
||||||
|
-- lspconfig which provides a function specifically for java projects.
|
||||||
|
root_dir = require("lspconfig.server_configurations.jdtls").default_config.root_dir,
|
||||||
|
|
||||||
|
-- How to find the project name for a given root dir.
|
||||||
|
project_name = function(root_dir)
|
||||||
|
return root_dir and vim.fs.basename(root_dir)
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- Where are the config and workspace dirs for a project?
|
||||||
|
jdtls_config_dir = function(project_name)
|
||||||
|
return vim.fn.stdpath("cache") .. "/jdtls/" .. project_name .. "/config"
|
||||||
|
end,
|
||||||
|
jdtls_workspace_dir = function(project_name)
|
||||||
|
return vim.fn.stdpath("cache") .. "/jdtls/" .. project_name .. "/workspace"
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- How to run jdtls. This can be overridden to a full java command-line
|
||||||
|
-- if the Python wrapper script doesn't suffice.
|
||||||
|
cmd = { vim.fn.exepath("jdtls") },
|
||||||
|
full_cmd = function(opts)
|
||||||
|
local fname = vim.api.nvim_buf_get_name(0)
|
||||||
|
local root_dir = opts.root_dir(fname)
|
||||||
|
local project_name = opts.project_name(root_dir)
|
||||||
|
local cmd = vim.deepcopy(opts.cmd)
|
||||||
|
if project_name then
|
||||||
|
vim.list_extend(cmd, {
|
||||||
|
"-configuration",
|
||||||
|
opts.jdtls_config_dir(project_name),
|
||||||
|
"-data",
|
||||||
|
opts.jdtls_workspace_dir(project_name),
|
||||||
|
})
|
||||||
|
end
|
||||||
|
return cmd
|
||||||
|
end,
|
||||||
|
|
||||||
|
-- These depend on nvim-dap, but can additionally be disabled by setting false here.
|
||||||
|
dap = { hotcodereplace = "auto", config_overrides = {} },
|
||||||
|
test = true,
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
config = function()
|
||||||
|
local opts = Util.opts("nvim-jdtls") or {}
|
||||||
|
|
||||||
|
-- Find the extra bundles that should be passed on the jdtls command-line
|
||||||
|
-- if nvim-dap is enabled with java debug/test.
|
||||||
|
local mason_registry = require("mason-registry")
|
||||||
|
local bundles = {} ---@type string[]
|
||||||
|
if opts.dap and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then
|
||||||
|
local java_dbg_pkg = mason_registry.get_package("java-debug-adapter")
|
||||||
|
local java_dbg_path = java_dbg_pkg:get_install_path()
|
||||||
|
local jar_patterns = {
|
||||||
|
java_dbg_path .. "/extension/server/com.microsoft.java.debug.plugin-*.jar",
|
||||||
|
}
|
||||||
|
-- java-test also depends on java-debug-adapter.
|
||||||
|
if opts.test and mason_registry.is_installed("java-test") then
|
||||||
|
local java_test_pkg = mason_registry.get_package("java-test")
|
||||||
|
local java_test_path = java_test_pkg:get_install_path()
|
||||||
|
vim.list_extend(jar_patterns, {
|
||||||
|
java_test_path .. "/extension/server/*.jar",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
for _, jar_pattern in ipairs(jar_patterns) do
|
||||||
|
for _, bundle in ipairs(vim.split(vim.fn.glob(jar_pattern), "\n")) do
|
||||||
|
table.insert(bundles, bundle)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function attach_jdtls()
|
||||||
|
local fname = vim.api.nvim_buf_get_name(0)
|
||||||
|
|
||||||
|
-- Configuration can be augmented and overridden by opts.jdtls
|
||||||
|
local config = extend_or_override({
|
||||||
|
cmd = opts.full_cmd(opts),
|
||||||
|
root_dir = opts.root_dir(fname),
|
||||||
|
init_options = {
|
||||||
|
bundles = bundles,
|
||||||
|
},
|
||||||
|
-- enable CMP capabilities
|
||||||
|
capabilities = require("cmp_nvim_lsp").default_capabilities(),
|
||||||
|
}, opts.jdtls)
|
||||||
|
|
||||||
|
-- Existing server will be reused if the root_dir matches.
|
||||||
|
require("jdtls").start_or_attach(config)
|
||||||
|
-- not need to require("jdtls.setup").add_commands(), start automatically adds commands
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Attach the jdtls for each java buffer. HOWEVER, this plugin loads
|
||||||
|
-- depending on filetype, so this autocmd doesn't run for the first file.
|
||||||
|
-- For that, we call directly below.
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = java_filetypes,
|
||||||
|
callback = attach_jdtls,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Setup keymap and dap after the lsp is fully attached.
|
||||||
|
-- https://github.com/mfussenegger/nvim-jdtls#nvim-dap-configuration
|
||||||
|
-- https://neovim.io/doc/user/lsp.html#LspAttach
|
||||||
|
vim.api.nvim_create_autocmd("LspAttach", {
|
||||||
|
callback = function(args)
|
||||||
|
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
||||||
|
if client and client.name == "jdtls" then
|
||||||
|
local wk = require("which-key")
|
||||||
|
wk.register({
|
||||||
|
["<leader>cx"] = { name = "+extract" },
|
||||||
|
["<leader>cxv"] = { require("jdtls").extract_variable_all, "Extract Variable" },
|
||||||
|
["<leader>cxc"] = { require("jdtls").extract_constant, "Extract Constant" },
|
||||||
|
["gs"] = { require("jdtls").super_implementation, "Goto Super" },
|
||||||
|
["gS"] = { require("jdtls.tests").goto_subjects, "Goto Subjects" },
|
||||||
|
["<leader>co"] = { require("jdtls").organize_imports, "Organize Imports" },
|
||||||
|
}, { mode = "n", buffer = args.buf })
|
||||||
|
wk.register({
|
||||||
|
["<leader>c"] = { name = "+code" },
|
||||||
|
["<leader>cx"] = { name = "+extract" },
|
||||||
|
["<leader>cxm"] = {
|
||||||
|
[[<ESC><CMD>lua require('jdtls').extract_method(true)<CR>]],
|
||||||
|
"Extract Method",
|
||||||
|
},
|
||||||
|
["<leader>cxv"] = {
|
||||||
|
[[<ESC><CMD>lua require('jdtls').extract_variable_all(true)<CR>]],
|
||||||
|
"Extract Variable",
|
||||||
|
},
|
||||||
|
["<leader>cxc"] = {
|
||||||
|
[[<ESC><CMD>lua require('jdtls').extract_constant(true)<CR>]],
|
||||||
|
"Extract Constant",
|
||||||
|
},
|
||||||
|
}, { mode = "v", buffer = args.buf })
|
||||||
|
|
||||||
|
if opts.dap and Util.has("nvim-dap") and mason_registry.is_installed("java-debug-adapter") then
|
||||||
|
-- custom init for Java debugger
|
||||||
|
require("jdtls").setup_dap(opts.dap)
|
||||||
|
require("jdtls.dap").setup_dap_main_class_configs()
|
||||||
|
|
||||||
|
-- Java Test require Java debugger to work
|
||||||
|
if opts.test and mason_registry.is_installed("java-test") then
|
||||||
|
-- custom keymaps for Java test runner (not yet compatible with neotest)
|
||||||
|
wk.register({
|
||||||
|
["<leader>t"] = { name = "+test" },
|
||||||
|
["<leader>tt"] = { require("jdtls.dap").test_class, "Run All Test" },
|
||||||
|
["<leader>tr"] = { require("jdtls.dap").test_nearest_method, "Run Nearest Test" },
|
||||||
|
["<leader>tT"] = { require("jdtls.dap").pick_test, "Run Test" },
|
||||||
|
}, { mode = "n", buffer = args.buf })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- User can set additional keymaps in opts.on_attach
|
||||||
|
if opts.on_attach then
|
||||||
|
opts.on_attach(args)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Avoid race condition by calling attach the first time, since the autocmd won't fire.
|
||||||
|
attach_jdtls()
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -10,13 +10,16 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- yaml schema support
|
||||||
|
{
|
||||||
|
"b0o/SchemaStore.nvim",
|
||||||
|
lazy = true,
|
||||||
|
version = false, -- last release is way too old
|
||||||
|
},
|
||||||
|
|
||||||
-- correctly setup lspconfig
|
-- correctly setup lspconfig
|
||||||
{
|
{
|
||||||
"neovim/nvim-lspconfig",
|
"neovim/nvim-lspconfig",
|
||||||
dependencies = {
|
|
||||||
"b0o/SchemaStore.nvim",
|
|
||||||
version = false, -- last release is way too old
|
|
||||||
},
|
|
||||||
opts = {
|
opts = {
|
||||||
-- make sure mason installs the server
|
-- make sure mason installs the server
|
||||||
servers = {
|
servers = {
|
||||||
|
|
|
||||||
90
lua/lazyvim/plugins/extras/lang/markdown.lua
Normal file
90
lua/lazyvim/plugins/extras/lang/markdown.lua
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "markdown", "markdown_inline" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
vim.list_extend(opts.ensure_installed, { "markdownlint", "marksman" })
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.diagnostics.markdownlint,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
linters_by_ft = {
|
||||||
|
markdown = { "markdownlint" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
marksman = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Markdown preview
|
||||||
|
{
|
||||||
|
"iamcco/markdown-preview.nvim",
|
||||||
|
cmd = { "MarkdownPreviewToggle", "MarkdownPreview", "MarkdownPreviewStop" },
|
||||||
|
build = function()
|
||||||
|
vim.fn["mkdp#util#install"]()
|
||||||
|
end,
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>cp",
|
||||||
|
ft = "markdown",
|
||||||
|
"<cmd>MarkdownPreviewToggle<cr>",
|
||||||
|
desc = "Markdown Preview",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
vim.cmd([[do FileType]])
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"lukas-reineke/headlines.nvim",
|
||||||
|
opts = function()
|
||||||
|
local opts = {}
|
||||||
|
for _, ft in ipairs({ "markdown", "norg", "rmd", "org" }) do
|
||||||
|
opts[ft] = {
|
||||||
|
headline_highlights = {},
|
||||||
|
}
|
||||||
|
for i = 1, 6 do
|
||||||
|
local hl = "Headline" .. i
|
||||||
|
vim.api.nvim_set_hl(0, hl, { link = "Headline", default = true })
|
||||||
|
table.insert(opts[ft].headline_highlights, hl)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return opts
|
||||||
|
end,
|
||||||
|
ft = { "markdown", "norg", "rmd", "org" },
|
||||||
|
config = function(_, opts)
|
||||||
|
-- PERF: schedule to prevent headlines slowing down opening a file
|
||||||
|
vim.schedule(function()
|
||||||
|
require("headlines").setup(opts)
|
||||||
|
require("headlines").refresh()
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
68
lua/lazyvim/plugins/extras/lang/omnisharp.lua
Normal file
68
lua/lazyvim/plugins/extras/lang/omnisharp.lua
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
return {
|
||||||
|
{ "Hoffs/omnisharp-extended-lsp.nvim", lazy = true },
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "c_sharp" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.sources = opts.sources or {}
|
||||||
|
table.insert(opts.sources, nls.builtins.formatting.csharpier)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
formatters_by_ft = {
|
||||||
|
cs = { "csharpier" },
|
||||||
|
},
|
||||||
|
formatters = {
|
||||||
|
csharpier = {
|
||||||
|
command = "dotnet-csharpier",
|
||||||
|
args = { "--write-stdout" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
opts = function(_, opts)
|
||||||
|
opts.ensure_installed = opts.ensure_installed or {}
|
||||||
|
table.insert(opts.ensure_installed, "csharpier")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
omnisharp = {
|
||||||
|
handlers = {
|
||||||
|
["textDocument/definition"] = function(...)
|
||||||
|
return require("omnisharp_extended").handler(...)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"gd",
|
||||||
|
function()
|
||||||
|
require("omnisharp_extended").telescope_lsp_definitions()
|
||||||
|
end,
|
||||||
|
desc = "Goto Definition",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
enable_roslyn_analyzers = true,
|
||||||
|
organize_imports_on_format = true,
|
||||||
|
enable_import_completion = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
32
lua/lazyvim/plugins/extras/lang/python-semshi.lua
Normal file
32
lua/lazyvim/plugins/extras/lang/python-semshi.lua
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
return {
|
||||||
|
-- "numiras/semshi",
|
||||||
|
"wookayin/semshi", -- use a maintained fork
|
||||||
|
ft = "python",
|
||||||
|
build = ":UpdateRemotePlugins",
|
||||||
|
init = function()
|
||||||
|
-- Disabled these features better provided by LSP or other more general plugins
|
||||||
|
vim.g["semshi#error_sign"] = false
|
||||||
|
vim.g["semshi#simplify_markup"] = false
|
||||||
|
vim.g["semshi#mark_selected_nodes"] = false
|
||||||
|
vim.g["semshi#update_delay_factor"] = 0.001
|
||||||
|
|
||||||
|
-- This autocmd must be defined in init to take effect
|
||||||
|
vim.api.nvim_create_autocmd({ "VimEnter", "ColorScheme" }, {
|
||||||
|
group = vim.api.nvim_create_augroup("SemanticHighlight", {}),
|
||||||
|
callback = function()
|
||||||
|
-- Only add style, inherit or link to the LSP's colors
|
||||||
|
vim.cmd([[
|
||||||
|
highlight! semshiGlobal gui=italic
|
||||||
|
highlight! link semshiImported @none
|
||||||
|
highlight! link semshiParameter @lsp.type.parameter
|
||||||
|
highlight! link semshiParameterUnused DiagnosticUnnecessary
|
||||||
|
highlight! link semshiBuiltin @function.builtin
|
||||||
|
highlight! link semshiAttribute @field
|
||||||
|
highlight! link semshiSelf @lsp.type.selfKeyword
|
||||||
|
highlight! link semshiUnresolved @lsp.type.unresolvedReference
|
||||||
|
highlight! link semshiFree @none
|
||||||
|
]])
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
}
|
||||||
95
lua/lazyvim/plugins/extras/lang/python.lua
Normal file
95
lua/lazyvim/plugins/extras/lang/python.lua
Normal file
|
|
@ -0,0 +1,95 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "ninja", "python", "rst", "toml" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
pyright = {},
|
||||||
|
ruff_lsp = {
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>co",
|
||||||
|
function()
|
||||||
|
vim.lsp.buf.code_action({
|
||||||
|
apply = true,
|
||||||
|
context = {
|
||||||
|
only = { "source.organizeImports" },
|
||||||
|
diagnostics = {},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
desc = "Organize Imports",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup = {
|
||||||
|
ruff_lsp = function()
|
||||||
|
require("lazyvim.util").lsp.on_attach(function(client, _)
|
||||||
|
if client.name == "ruff_lsp" then
|
||||||
|
-- Disable hover in favor of Pyright
|
||||||
|
client.server_capabilities.hoverProvider = false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvim-neotest/neotest",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
"nvim-neotest/neotest-python",
|
||||||
|
},
|
||||||
|
opts = {
|
||||||
|
adapters = {
|
||||||
|
["neotest-python"] = {
|
||||||
|
-- Here you can specify the settings for the adapter, i.e.
|
||||||
|
-- runner = "pytest",
|
||||||
|
-- python = ".venv/bin/python",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-dap",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
"mfussenegger/nvim-dap-python",
|
||||||
|
-- stylua: ignore
|
||||||
|
keys = {
|
||||||
|
{ "<leader>dPt", function() require('dap-python').test_method() end, desc = "Debug Method", ft = "python" },
|
||||||
|
{ "<leader>dPc", function() require('dap-python').test_class() end, desc = "Debug Class", ft = "python" },
|
||||||
|
},
|
||||||
|
config = function()
|
||||||
|
local path = require("mason-registry").get_package("debugpy"):get_install_path()
|
||||||
|
require("dap-python").setup(path .. "/venv/bin/python")
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"linux-cultist/venv-selector.nvim",
|
||||||
|
cmd = "VenvSelect",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if require("lazyvim.util").has("nvim-dap-python") then
|
||||||
|
opts.dap_enabled = true
|
||||||
|
end
|
||||||
|
return vim.tbl_deep_extend("force", opts, {
|
||||||
|
name = {
|
||||||
|
"venv",
|
||||||
|
".venv",
|
||||||
|
"env",
|
||||||
|
".env",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
keys = { { "<leader>cv", "<cmd>:VenvSelect<cr>", desc = "Select VirtualEnv" } },
|
||||||
|
},
|
||||||
|
}
|
||||||
162
lua/lazyvim/plugins/extras/lang/rust.lua
Normal file
162
lua/lazyvim/plugins/extras/lang/rust.lua
Normal file
|
|
@ -0,0 +1,162 @@
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- Extend auto completion
|
||||||
|
{
|
||||||
|
"hrsh7th/nvim-cmp",
|
||||||
|
dependencies = {
|
||||||
|
{
|
||||||
|
"Saecki/crates.nvim",
|
||||||
|
event = { "BufRead Cargo.toml" },
|
||||||
|
opts = {
|
||||||
|
src = {
|
||||||
|
cmp = { enabled = true },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
---@param opts cmp.ConfigSchema
|
||||||
|
opts = function(_, opts)
|
||||||
|
local cmp = require("cmp")
|
||||||
|
opts.sources = cmp.config.sources(vim.list_extend(opts.sources, {
|
||||||
|
{ name = "crates" },
|
||||||
|
}))
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Add Rust & related to treesitter
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "ron", "rust", "toml" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Ensure Rust debugger is installed
|
||||||
|
{
|
||||||
|
"williamboman/mason.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "codelldb" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"simrat39/rust-tools.nvim",
|
||||||
|
lazy = true,
|
||||||
|
opts = function()
|
||||||
|
local ok, mason_registry = pcall(require, "mason-registry")
|
||||||
|
local adapter ---@type any
|
||||||
|
if ok then
|
||||||
|
-- rust tools configuration for debugging support
|
||||||
|
local codelldb = mason_registry.get_package("codelldb")
|
||||||
|
local extension_path = codelldb:get_install_path() .. "/extension/"
|
||||||
|
local codelldb_path = extension_path .. "adapter/codelldb"
|
||||||
|
local liblldb_path = ""
|
||||||
|
if vim.loop.os_uname().sysname:find("Windows") then
|
||||||
|
liblldb_path = extension_path .. "lldb\\bin\\liblldb.dll"
|
||||||
|
elseif vim.fn.has("mac") == 1 then
|
||||||
|
liblldb_path = extension_path .. "lldb/lib/liblldb.dylib"
|
||||||
|
else
|
||||||
|
liblldb_path = extension_path .. "lldb/lib/liblldb.so"
|
||||||
|
end
|
||||||
|
adapter = require("rust-tools.dap").get_codelldb_adapter(codelldb_path, liblldb_path)
|
||||||
|
end
|
||||||
|
return {
|
||||||
|
dap = {
|
||||||
|
adapter = adapter,
|
||||||
|
},
|
||||||
|
tools = {
|
||||||
|
on_initialized = function()
|
||||||
|
vim.cmd([[
|
||||||
|
augroup RustLSP
|
||||||
|
autocmd CursorHold *.rs silent! lua vim.lsp.buf.document_highlight()
|
||||||
|
autocmd CursorMoved,InsertEnter *.rs silent! lua vim.lsp.buf.clear_references()
|
||||||
|
autocmd BufEnter,CursorHold,InsertLeave *.rs silent! lua vim.lsp.codelens.refresh()
|
||||||
|
augroup END
|
||||||
|
]])
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
config = function() end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Correctly setup lspconfig for Rust 🚀
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
-- Ensure mason installs the server
|
||||||
|
rust_analyzer = {
|
||||||
|
keys = {
|
||||||
|
{ "K", "<cmd>RustHoverActions<cr>", desc = "Hover Actions (Rust)" },
|
||||||
|
{ "<leader>cR", "<cmd>RustCodeAction<cr>", desc = "Code Action (Rust)" },
|
||||||
|
{ "<leader>dr", "<cmd>RustDebuggables<cr>", desc = "Run Debuggables (Rust)" },
|
||||||
|
},
|
||||||
|
settings = {
|
||||||
|
["rust-analyzer"] = {
|
||||||
|
cargo = {
|
||||||
|
allFeatures = true,
|
||||||
|
loadOutDirsFromCheck = true,
|
||||||
|
runBuildScripts = true,
|
||||||
|
},
|
||||||
|
-- Add clippy lints for Rust.
|
||||||
|
checkOnSave = {
|
||||||
|
allFeatures = true,
|
||||||
|
command = "clippy",
|
||||||
|
extraArgs = { "--no-deps" },
|
||||||
|
},
|
||||||
|
procMacro = {
|
||||||
|
enable = true,
|
||||||
|
ignored = {
|
||||||
|
["async-trait"] = { "async_trait" },
|
||||||
|
["napi-derive"] = { "napi" },
|
||||||
|
["async-recursion"] = { "async_recursion" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
taplo = {
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"K",
|
||||||
|
function()
|
||||||
|
if vim.fn.expand("%:t") == "Cargo.toml" and require("crates").popup_available() then
|
||||||
|
require("crates").show_popup()
|
||||||
|
else
|
||||||
|
vim.lsp.buf.hover()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Show Crate Documentation",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup = {
|
||||||
|
rust_analyzer = function(_, opts)
|
||||||
|
local rust_tools_opts = require("lazyvim.util").opts("rust-tools.nvim")
|
||||||
|
require("rust-tools").setup(vim.tbl_deep_extend("force", rust_tools_opts or {}, { server = opts }))
|
||||||
|
return true
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"nvim-neotest/neotest",
|
||||||
|
optional = true,
|
||||||
|
dependencies = {
|
||||||
|
"rouge8/neotest-rust",
|
||||||
|
},
|
||||||
|
opts = {
|
||||||
|
adapters = {
|
||||||
|
["neotest-rust"] = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -4,16 +4,30 @@ return {
|
||||||
opts = {
|
opts = {
|
||||||
servers = {
|
servers = {
|
||||||
tailwindcss = {
|
tailwindcss = {
|
||||||
|
-- exclude a filetype from the default_config
|
||||||
filetypes_exclude = { "markdown" },
|
filetypes_exclude = { "markdown" },
|
||||||
|
-- add additional filetypes to the default_config
|
||||||
|
filetypes_include = {},
|
||||||
|
-- to fully override the default_config, change the below
|
||||||
|
-- filetypes = {}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup = {
|
setup = {
|
||||||
tailwindcss = function(_, opts)
|
tailwindcss = function(_, opts)
|
||||||
local tw = require("lspconfig.server_configurations.tailwindcss")
|
local tw = require("lspconfig.server_configurations.tailwindcss")
|
||||||
|
opts.filetypes = opts.filetypes or {}
|
||||||
|
|
||||||
|
-- Add default filetypes
|
||||||
|
vim.list_extend(opts.filetypes, tw.default_config.filetypes)
|
||||||
|
|
||||||
|
-- Remove excluded filetypes
|
||||||
--- @param ft string
|
--- @param ft string
|
||||||
opts.filetypes = vim.tbl_filter(function(ft)
|
opts.filetypes = vim.tbl_filter(function(ft)
|
||||||
return not vim.tbl_contains(opts.filetypes_exclude or {}, ft)
|
return not vim.tbl_contains(opts.filetypes_exclude or {}, ft)
|
||||||
end, tw.default_config.filetypes)
|
end, opts.filetypes)
|
||||||
|
|
||||||
|
-- Add additional filetypes
|
||||||
|
vim.list_extend(opts.filetypes, opts.filetypes_include or {})
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
59
lua/lazyvim/plugins/extras/lang/terraform.lua
Normal file
59
lua/lazyvim/plugins/extras/lang/terraform.lua
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
vim.api.nvim_create_autocmd("FileType", {
|
||||||
|
pattern = { "hcl", "terraform" },
|
||||||
|
desc = "terraform/hcl commentstring configuration",
|
||||||
|
command = "setlocal commentstring=#\\ %s",
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, {
|
||||||
|
"terraform",
|
||||||
|
"hcl",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
terraformls = {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local null_ls = require("null-ls")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
null_ls.builtins.formatting.terraform_fmt,
|
||||||
|
null_ls.builtins.diagnostics.terraform_validate,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
linters_by_ft = {
|
||||||
|
terraform = { "terraform_validate" },
|
||||||
|
tf = { "terraform_validate" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
formatters_by_ft = {
|
||||||
|
terraform = { "terraform_fmt" },
|
||||||
|
tf = { "terraform_fmt" },
|
||||||
|
["terraform-vars"] = { "terraform_fmt" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
58
lua/lazyvim/plugins/extras/lang/tex.lua
Normal file
58
lua/lazyvim/plugins/extras/lang/tex.lua
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"folke/which-key.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
defaults = {
|
||||||
|
["<localLeader>l"] = { name = "+vimtex" },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Add BibTeX/LaTeX to treesitter
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "bibtex", "latex" })
|
||||||
|
end
|
||||||
|
if type(opts.highlight.disable) == "table" then
|
||||||
|
vim.list_extend(opts.highlight.disable, { "latex" })
|
||||||
|
else
|
||||||
|
opts.highlight.disable = { "latex" }
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
"lervag/vimtex",
|
||||||
|
lazy = false, -- lazy-loading will disable inverse search
|
||||||
|
config = function()
|
||||||
|
vim.api.nvim_create_autocmd({ "FileType" }, {
|
||||||
|
group = vim.api.nvim_create_augroup("lazyvim_vimtex_conceal", { clear = true }),
|
||||||
|
pattern = { "bib", "tex" },
|
||||||
|
callback = function()
|
||||||
|
vim.wo.conceallevel = 2
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
vim.g.vimtex_mappings_disable = { ["n"] = { "K" } } -- disable `K` as it conflicts with LSP hover
|
||||||
|
vim.g.vimtex_quickfix_method = vim.fn.executable("pplatex") == 1 and "pplatex" or "latexlog"
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Correctly setup lspconfig for LaTeX 🚀
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
servers = {
|
||||||
|
texlab = {
|
||||||
|
keys = {
|
||||||
|
{ "<Leader>K", "<plug>(vimtex-doc-package)", desc = "Vimtex Docs", silent = true },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -13,12 +13,39 @@ return {
|
||||||
-- correctly setup lspconfig
|
-- correctly setup lspconfig
|
||||||
{
|
{
|
||||||
"neovim/nvim-lspconfig",
|
"neovim/nvim-lspconfig",
|
||||||
dependencies = { "jose-elias-alvarez/typescript.nvim" },
|
|
||||||
opts = {
|
opts = {
|
||||||
-- make sure mason installs the server
|
-- make sure mason installs the server
|
||||||
servers = {
|
servers = {
|
||||||
---@type lspconfig.options.tsserver
|
---@type lspconfig.options.tsserver
|
||||||
tsserver = {
|
tsserver = {
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>co",
|
||||||
|
function()
|
||||||
|
vim.lsp.buf.code_action({
|
||||||
|
apply = true,
|
||||||
|
context = {
|
||||||
|
only = { "source.organizeImports.ts" },
|
||||||
|
diagnostics = {},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
desc = "Organize Imports",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"<leader>cR",
|
||||||
|
function()
|
||||||
|
vim.lsp.buf.code_action({
|
||||||
|
apply = true,
|
||||||
|
context = {
|
||||||
|
only = { "source.removeUnused.ts" },
|
||||||
|
diagnostics = {},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
desc = "Remove Unused Imports",
|
||||||
|
},
|
||||||
|
},
|
||||||
settings = {
|
settings = {
|
||||||
typescript = {
|
typescript = {
|
||||||
format = {
|
format = {
|
||||||
|
|
@ -40,28 +67,8 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup = {
|
|
||||||
tsserver = function(_, opts)
|
|
||||||
require("lazyvim.util").on_attach(function(client, buffer)
|
|
||||||
if client.name == "tsserver" then
|
|
||||||
-- stylua: ignore
|
|
||||||
vim.keymap.set("n", "<leader>co", "<cmd>TypescriptOrganizeImports<CR>", { buffer = buffer, desc = "Organize Imports" })
|
|
||||||
-- stylua: ignore
|
|
||||||
vim.keymap.set("n", "<leader>cR", "<cmd>TypescriptRenameFile<CR>", { desc = "Rename File", buffer = buffer })
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
require("typescript").setup({ server = opts })
|
|
||||||
return true
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"jose-elias-alvarez/null-ls.nvim",
|
|
||||||
opts = function(_, opts)
|
|
||||||
table.insert(opts.sources, require("typescript.extensions.null-ls.code-actions"))
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"mfussenegger/nvim-dap",
|
"mfussenegger/nvim-dap",
|
||||||
optional = true,
|
optional = true,
|
||||||
|
|
@ -92,7 +99,7 @@ return {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
for _, language in ipairs({ "typescript", "javascript" }) do
|
for _, language in ipairs({ "typescript", "javascript", "typescriptreact", "javascriptreact" }) do
|
||||||
if not dap.configurations[language] then
|
if not dap.configurations[language] then
|
||||||
dap.configurations[language] = {
|
dap.configurations[language] = {
|
||||||
{
|
{
|
||||||
|
|
|
||||||
77
lua/lazyvim/plugins/extras/lang/yaml.lua
Normal file
77
lua/lazyvim/plugins/extras/lang/yaml.lua
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- add yaml specific modules to treesitter
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
vim.list_extend(opts.ensure_installed, { "yaml" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- yaml schema support
|
||||||
|
{
|
||||||
|
"b0o/SchemaStore.nvim",
|
||||||
|
lazy = true,
|
||||||
|
version = false, -- last release is way too old
|
||||||
|
},
|
||||||
|
|
||||||
|
-- correctly setup lspconfig
|
||||||
|
{
|
||||||
|
"neovim/nvim-lspconfig",
|
||||||
|
opts = {
|
||||||
|
-- make sure mason installs the server
|
||||||
|
servers = {
|
||||||
|
yamlls = {
|
||||||
|
-- Have to add this for yamlls to understand that we support line folding
|
||||||
|
capabilities = {
|
||||||
|
textDocument = {
|
||||||
|
foldingRange = {
|
||||||
|
dynamicRegistration = false,
|
||||||
|
lineFoldingOnly = true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
-- lazy-load schemastore when needed
|
||||||
|
on_new_config = function(new_config)
|
||||||
|
new_config.settings.yaml.schemas = vim.tbl_deep_extend(
|
||||||
|
"force",
|
||||||
|
new_config.settings.yaml.schemas or {},
|
||||||
|
require("schemastore").yaml.schemas()
|
||||||
|
)
|
||||||
|
end,
|
||||||
|
settings = {
|
||||||
|
redhat = { telemetry = { enabled = false } },
|
||||||
|
yaml = {
|
||||||
|
keyOrdering = false,
|
||||||
|
format = {
|
||||||
|
enable = true,
|
||||||
|
},
|
||||||
|
validate = true,
|
||||||
|
schemaStore = {
|
||||||
|
-- Must disable built-in schemaStore support to use
|
||||||
|
-- schemas from SchemaStore.nvim plugin
|
||||||
|
enable = false,
|
||||||
|
-- Avoid TypeError: Cannot read properties of undefined (reading 'length')
|
||||||
|
url = "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup = {
|
||||||
|
yamlls = function()
|
||||||
|
-- Neovim < 0.10 does not have dynamic registration for formatting
|
||||||
|
if vim.fn.has("nvim-0.10") == 0 then
|
||||||
|
require("lazyvim.util").lsp.on_attach(function(client, _)
|
||||||
|
if client.name == "yamlls" then
|
||||||
|
client.server_capabilities.documentFormattingProvider = true
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -14,22 +14,37 @@ return {
|
||||||
},
|
},
|
||||||
setup = {
|
setup = {
|
||||||
eslint = function()
|
eslint = function()
|
||||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
local function get_client(buf)
|
||||||
callback = function(event)
|
return require("lazyvim.util").lsp.get_clients({ name = "eslint", bufnr = buf })[1]
|
||||||
if not require("lazyvim.plugins.lsp.format").enabled() then
|
end
|
||||||
-- exit early if autoformat is not enabled
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local client = vim.lsp.get_active_clients({ bufnr = event.buf, name = "eslint" })[1]
|
local formatter = require("lazyvim.util").lsp.formatter({
|
||||||
|
name = "eslint: lsp",
|
||||||
|
primary = false,
|
||||||
|
priority = 200,
|
||||||
|
filter = "eslint",
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Use EslintFixAll on Neovim < 0.10.0
|
||||||
|
if not pcall(require, "vim.lsp._dynamic") then
|
||||||
|
formatter.name = "eslint: EslintFixAll"
|
||||||
|
formatter.sources = function(buf)
|
||||||
|
local client = get_client(buf)
|
||||||
|
return client and { "eslint" } or {}
|
||||||
|
end
|
||||||
|
formatter.format = function(buf)
|
||||||
|
local client = get_client(buf)
|
||||||
if client then
|
if client then
|
||||||
local diag = vim.diagnostic.get(event.buf, { namespace = vim.lsp.diagnostic.get_namespace(client.id) })
|
local diag = vim.diagnostic.get(buf, { namespace = vim.lsp.diagnostic.get_namespace(client.id) })
|
||||||
if #diag > 0 then
|
if #diag > 0 then
|
||||||
vim.cmd("EslintFixAll")
|
vim.cmd("EslintFixAll")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end,
|
end
|
||||||
})
|
end
|
||||||
|
|
||||||
|
-- register the formatter with LazyVim
|
||||||
|
require("lazyvim.util").format.register(formatter)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
45
lua/lazyvim/plugins/extras/lsp/none-ls.lua
Normal file
45
lua/lazyvim/plugins/extras/lsp/none-ls.lua
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
return {
|
||||||
|
-- none-ls
|
||||||
|
{
|
||||||
|
"nvimtools/none-ls.nvim",
|
||||||
|
event = "LazyFile",
|
||||||
|
dependencies = { "mason.nvim" },
|
||||||
|
init = function()
|
||||||
|
Util.on_very_lazy(function()
|
||||||
|
-- register the formatter with LazyVim
|
||||||
|
require("lazyvim.util").format.register({
|
||||||
|
name = "none-ls.nvim",
|
||||||
|
priority = 200, -- set higher than conform, the builtin formatter
|
||||||
|
primary = true,
|
||||||
|
format = function(buf)
|
||||||
|
return Util.lsp.format({
|
||||||
|
bufnr = buf,
|
||||||
|
filter = function(client)
|
||||||
|
return client.name == "null-ls"
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
sources = function(buf)
|
||||||
|
local ret = require("null-ls.sources").get_available(vim.bo[buf].filetype, "NULL_LS_FORMATTING") or {}
|
||||||
|
return vim.tbl_map(function(source)
|
||||||
|
return source.name
|
||||||
|
end, ret)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local nls = require("null-ls")
|
||||||
|
opts.root_dir = opts.root_dir
|
||||||
|
or require("null-ls.utils").root_pattern(".null-ls-root", ".neoconf.json", "Makefile", ".git")
|
||||||
|
opts.sources = vim.list_extend(opts.sources or {}, {
|
||||||
|
nls.builtins.formatting.fish_indent,
|
||||||
|
nls.builtins.diagnostics.fish,
|
||||||
|
nls.builtins.formatting.stylua,
|
||||||
|
nls.builtins.formatting.shfmt,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ return {
|
||||||
quickfix = {
|
quickfix = {
|
||||||
open = function()
|
open = function()
|
||||||
if require("lazyvim.util").has("trouble.nvim") then
|
if require("lazyvim.util").has("trouble.nvim") then
|
||||||
vim.cmd("Trouble quickfix")
|
require("trouble").open({ mode = "quickfix", focus = false })
|
||||||
else
|
else
|
||||||
vim.cmd("copen")
|
vim.cmd("copen")
|
||||||
end
|
end
|
||||||
|
|
@ -46,6 +46,37 @@ return {
|
||||||
},
|
},
|
||||||
}, neotest_ns)
|
}, neotest_ns)
|
||||||
|
|
||||||
|
if require("lazyvim.util").has("trouble.nvim") then
|
||||||
|
opts.consumers = opts.consumers or {}
|
||||||
|
-- Refresh and auto close trouble after running tests
|
||||||
|
---@type neotest.Consumer
|
||||||
|
opts.consumers.trouble = function(client)
|
||||||
|
client.listeners.results = function(adapter_id, results, partial)
|
||||||
|
if partial then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local tree = assert(client:get_position(nil, { adapter = adapter_id }))
|
||||||
|
|
||||||
|
local failed = 0
|
||||||
|
for pos_id, result in pairs(results) do
|
||||||
|
if result.status == "failed" and tree:get_key(pos_id) then
|
||||||
|
failed = failed + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
vim.schedule(function()
|
||||||
|
local trouble = require("trouble")
|
||||||
|
if trouble.is_open() then
|
||||||
|
trouble.refresh()
|
||||||
|
if failed == 0 then
|
||||||
|
trouble.close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
if opts.adapters then
|
if opts.adapters then
|
||||||
local adapters = {}
|
local adapters = {}
|
||||||
for name, config in pairs(opts.adapters or {}) do
|
for name, config in pairs(opts.adapters or {}) do
|
||||||
|
|
|
||||||
79
lua/lazyvim/plugins/extras/ui/alpha.lua
Normal file
79
lua/lazyvim/plugins/extras/ui/alpha.lua
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
return {
|
||||||
|
|
||||||
|
{ "nvimdev/dashboard-nvim", enabled = false },
|
||||||
|
{ "echasnovski/mini.starter", enabled = false },
|
||||||
|
-- Dashboard. This runs when neovim starts, and is what displays
|
||||||
|
-- the "LAZYVIM" banner.
|
||||||
|
{
|
||||||
|
"goolord/alpha-nvim",
|
||||||
|
event = "VimEnter",
|
||||||
|
enabled = true,
|
||||||
|
init = false,
|
||||||
|
opts = function()
|
||||||
|
local dashboard = require("alpha.themes.dashboard")
|
||||||
|
local logo = [[
|
||||||
|
██╗ █████╗ ███████╗██╗ ██╗██╗ ██╗██╗███╗ ███╗ Z
|
||||||
|
██║ ██╔══██╗╚══███╔╝╚██╗ ██╔╝██║ ██║██║████╗ ████║ Z
|
||||||
|
██║ ███████║ ███╔╝ ╚████╔╝ ██║ ██║██║██╔████╔██║ z
|
||||||
|
██║ ██╔══██║ ███╔╝ ╚██╔╝ ╚██╗ ██╔╝██║██║╚██╔╝██║ z
|
||||||
|
███████╗██║ ██║███████╗ ██║ ╚████╔╝ ██║██║ ╚═╝ ██║
|
||||||
|
╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
|
||||||
|
]]
|
||||||
|
|
||||||
|
dashboard.section.header.val = vim.split(logo, "\n")
|
||||||
|
-- stylua: ignore
|
||||||
|
dashboard.section.buttons.val = {
|
||||||
|
dashboard.button("f", " " .. " Find file", "<cmd> Telescope find_files <cr>"),
|
||||||
|
dashboard.button("n", " " .. " New file", "<cmd> ene <BAR> startinsert <cr>"),
|
||||||
|
dashboard.button("r", " " .. " Recent files", "<cmd> Telescope oldfiles <cr>"),
|
||||||
|
dashboard.button("g", " " .. " Find text", "<cmd> Telescope live_grep <cr>"),
|
||||||
|
dashboard.button("c", " " .. " Config", "<cmd> lua require('lazyvim.util').telescope.config_files()() <cr>"),
|
||||||
|
dashboard.button("s", " " .. " Restore Session", [[<cmd> lua require("persistence").load() <cr>]]),
|
||||||
|
dashboard.button("x", " " .. " Lazy Extras", "<cmd> LazyExtras <cr>"),
|
||||||
|
dashboard.button("l", " " .. " Lazy", "<cmd> Lazy <cr>"),
|
||||||
|
dashboard.button("q", " " .. " Quit", "<cmd> qa <cr>"),
|
||||||
|
}
|
||||||
|
for _, button in ipairs(dashboard.section.buttons.val) do
|
||||||
|
button.opts.hl = "AlphaButtons"
|
||||||
|
button.opts.hl_shortcut = "AlphaShortcut"
|
||||||
|
end
|
||||||
|
dashboard.section.header.opts.hl = "AlphaHeader"
|
||||||
|
dashboard.section.buttons.opts.hl = "AlphaButtons"
|
||||||
|
dashboard.section.footer.opts.hl = "AlphaFooter"
|
||||||
|
dashboard.opts.layout[1].val = 8
|
||||||
|
return dashboard
|
||||||
|
end,
|
||||||
|
config = function(_, dashboard)
|
||||||
|
-- close Lazy and re-open when the dashboard is ready
|
||||||
|
if vim.o.filetype == "lazy" then
|
||||||
|
vim.cmd.close()
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
once = true,
|
||||||
|
pattern = "AlphaReady",
|
||||||
|
callback = function()
|
||||||
|
require("lazy").show()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
require("alpha").setup(dashboard.opts)
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
once = true,
|
||||||
|
pattern = "LazyVimStarted",
|
||||||
|
callback = function()
|
||||||
|
local stats = require("lazy").stats()
|
||||||
|
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
|
||||||
|
dashboard.section.footer.val = "⚡ Neovim loaded "
|
||||||
|
.. stats.loaded
|
||||||
|
.. "/"
|
||||||
|
.. stats.count
|
||||||
|
.. " plugins in "
|
||||||
|
.. ms
|
||||||
|
.. "ms"
|
||||||
|
pcall(vim.cmd.AlphaRedraw)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -40,6 +40,12 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
"Trouble",
|
"Trouble",
|
||||||
|
{
|
||||||
|
ft = "trouble",
|
||||||
|
filter = function(buf, win)
|
||||||
|
return vim.api.nvim_win_get_config(win).relative == ""
|
||||||
|
end,
|
||||||
|
},
|
||||||
{ ft = "qf", title = "QuickFix" },
|
{ ft = "qf", title = "QuickFix" },
|
||||||
{
|
{
|
||||||
ft = "help",
|
ft = "help",
|
||||||
|
|
@ -49,7 +55,7 @@ return {
|
||||||
return vim.bo[buf].buftype == "help"
|
return vim.bo[buf].buftype == "help"
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
{ ft = "spectre_panel", size = { height = 0.4 } },
|
{ title = "Spectre", ft = "spectre_panel", size = { height = 0.4 } },
|
||||||
{ title = "Neotest Output", ft = "neotest-output-panel", size = { height = 15 } },
|
{ title = "Neotest Output", ft = "neotest-output-panel", size = { height = 15 } },
|
||||||
},
|
},
|
||||||
left = {
|
left = {
|
||||||
|
|
@ -105,26 +111,31 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
local Util = require("lazyvim.util")
|
|
||||||
if Util.has("symbols-outline.nvim") then
|
|
||||||
table.insert(opts.left, {
|
|
||||||
title = "Outline",
|
|
||||||
ft = "outline",
|
|
||||||
pinned = true,
|
|
||||||
open = "SymbolsOutline",
|
|
||||||
})
|
|
||||||
end
|
|
||||||
return opts
|
return opts
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- use edgy's selection window
|
||||||
|
{
|
||||||
|
"nvim-telescope/telescope.nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = {
|
||||||
|
defaults = {
|
||||||
|
get_selection_window = function()
|
||||||
|
require("edgy").goto_main()
|
||||||
|
return 0
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
-- prevent neo-tree from opening files in edgy windows
|
-- prevent neo-tree from opening files in edgy windows
|
||||||
{
|
{
|
||||||
"nvim-neo-tree/neo-tree.nvim",
|
"nvim-neo-tree/neo-tree.nvim",
|
||||||
optional = true,
|
optional = true,
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
opts.open_files_do_not_replace_types = opts.open_files_do_not_replace_types
|
opts.open_files_do_not_replace_types = opts.open_files_do_not_replace_types
|
||||||
or { "terminal", "Trouble", "qf", "Outline" }
|
or { "terminal", "Trouble", "qf", "Outline", "trouble" }
|
||||||
table.insert(opts.open_files_do_not_replace_types, "edgy")
|
table.insert(opts.open_files_do_not_replace_types, "edgy")
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
return {
|
return {
|
||||||
-- disable alpha
|
-- disable alpha
|
||||||
{ "goolord/alpha-nvim", enabled = false },
|
{ "goolord/alpha-nvim", enabled = false },
|
||||||
|
{ "nvimdev/dashboard-nvim", enabled = false },
|
||||||
|
|
||||||
-- enable mini.starter
|
-- enable mini.starter
|
||||||
{
|
{
|
||||||
|
|
@ -28,14 +29,15 @@ return {
|
||||||
evaluate_single = true,
|
evaluate_single = true,
|
||||||
header = logo,
|
header = logo,
|
||||||
items = {
|
items = {
|
||||||
new_section("Find file", "Telescope find_files", "Telescope"),
|
new_section("Find file", "Telescope find_files", "Telescope"),
|
||||||
new_section("Recent files", "Telescope oldfiles", "Telescope"),
|
new_section("Recent files", "Telescope oldfiles", "Telescope"),
|
||||||
new_section("Grep text", "Telescope live_grep", "Telescope"),
|
new_section("Grep text", "Telescope live_grep", "Telescope"),
|
||||||
new_section("init.lua", "e $MYVIMRC", "Config"),
|
new_section("Config", "lua require('lazyvim.util').telescope.config_files()()", "Config"),
|
||||||
new_section("Lazy", "Lazy", "Config"),
|
new_section("Extras", "LazyExtras", "Config"),
|
||||||
new_section("New file", "ene | startinsert", "Built-in"),
|
new_section("Lazy", "Lazy", "Config"),
|
||||||
new_section("Quit", "qa", "Built-in"),
|
new_section("New file", "ene | startinsert", "Built-in"),
|
||||||
new_section("Session restore", [[lua require("persistence").load()]], "Session"),
|
new_section("Quit", "qa", "Built-in"),
|
||||||
|
new_section("Session restore", [[lua require("persistence").load()]], "Session"),
|
||||||
},
|
},
|
||||||
content_hooks = {
|
content_hooks = {
|
||||||
starter.gen_hook.adding_bullet(pad .. "░ ", false),
|
starter.gen_hook.adding_bullet(pad .. "░ ", false),
|
||||||
|
|
|
||||||
65
lua/lazyvim/plugins/extras/util/dot.lua
Normal file
65
lua/lazyvim/plugins/extras/util/dot.lua
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
---@type string
|
||||||
|
local xdg_config = vim.env.XDG_CONFIG_HOME or vim.env.HOME .. "/.config"
|
||||||
|
|
||||||
|
---@param path string
|
||||||
|
local function have(path)
|
||||||
|
return vim.loop.fs_stat(xdg_config .. "/" .. path) ~= nil
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
|
||||||
|
-- Add Hyprland Parser
|
||||||
|
{
|
||||||
|
"luckasRanarison/tree-sitter-hypr",
|
||||||
|
enabled = function()
|
||||||
|
return have("hypr")
|
||||||
|
end,
|
||||||
|
event = "BufRead */hypr/*.conf",
|
||||||
|
build = ":TSUpdate hypr",
|
||||||
|
config = function()
|
||||||
|
-- Fix ft detection for hyprland
|
||||||
|
vim.filetype.add({
|
||||||
|
pattern = { [".*/hypr/.*%.conf"] = "hypr" },
|
||||||
|
})
|
||||||
|
require("nvim-treesitter.parsers").get_parser_configs().hypr = {
|
||||||
|
install_info = {
|
||||||
|
url = "https://github.com/luckasRanarison/tree-sitter-hypr",
|
||||||
|
files = { "src/parser.c" },
|
||||||
|
branch = "master",
|
||||||
|
},
|
||||||
|
filetype = "hypr",
|
||||||
|
}
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
|
||||||
|
-- add some stuff to treesitter
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter",
|
||||||
|
opts = function(_, opts)
|
||||||
|
local function add(lang)
|
||||||
|
if type(opts.ensure_installed) == "table" then
|
||||||
|
table.insert(opts.ensure_installed, lang)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.filetype.add({
|
||||||
|
extension = { rasi = "rasi" },
|
||||||
|
pattern = {
|
||||||
|
[".*/waybar/config"] = "jsonc",
|
||||||
|
[".*/mako/config"] = "dosini",
|
||||||
|
[".*/kitty/*.conf"] = "bash",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
add("git_config")
|
||||||
|
|
||||||
|
if have("fish") then
|
||||||
|
add("fish")
|
||||||
|
end
|
||||||
|
|
||||||
|
if have("rofi") or have("wofi") then
|
||||||
|
add("rasi")
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,7 @@ M.hl = {}
|
||||||
|
|
||||||
M.plugin = {
|
M.plugin = {
|
||||||
"echasnovski/mini.hipatterns",
|
"echasnovski/mini.hipatterns",
|
||||||
event = "BufReadPre",
|
event = "LazyFile",
|
||||||
opts = function()
|
opts = function()
|
||||||
local hi = require("mini.hipatterns")
|
local hi = require("mini.hipatterns")
|
||||||
return {
|
return {
|
||||||
|
|
@ -54,7 +54,7 @@ M.plugin = {
|
||||||
local match = m.full_match
|
local match = m.full_match
|
||||||
---@type string, number
|
---@type string, number
|
||||||
local color, shade = match:match("[%w-]+%-([a-z%-]+)%-(%d+)")
|
local color, shade = match:match("[%w-]+%-([a-z%-]+)%-(%d+)")
|
||||||
shade = assert(tonumber(shade))
|
shade = tonumber(shade)
|
||||||
local bg = vim.tbl_get(M.colors, color, shade)
|
local bg = vim.tbl_get(M.colors, color, shade)
|
||||||
if bg then
|
if bg then
|
||||||
local hl = "MiniHipatternsTailwind" .. color .. shade
|
local hl = "MiniHipatternsTailwind" .. color .. shade
|
||||||
|
|
@ -67,7 +67,7 @@ M.plugin = {
|
||||||
return hl
|
return hl
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
priority = 2000,
|
extmark_opts = { priority = 2000 },
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
require("mini.hipatterns").setup(opts)
|
require("mini.hipatterns").setup(opts)
|
||||||
|
|
|
||||||
|
|
@ -5,11 +5,15 @@ return {
|
||||||
-- project management
|
-- project management
|
||||||
{
|
{
|
||||||
"ahmedkhalf/project.nvim",
|
"ahmedkhalf/project.nvim",
|
||||||
opts = {},
|
opts = {
|
||||||
|
manual_mode = true,
|
||||||
|
},
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
require("project_nvim").setup(opts)
|
require("project_nvim").setup(opts)
|
||||||
require("telescope").load_extension("projects")
|
require("lazyvim.util").on_load("telescope.nvim", function()
|
||||||
|
require("telescope").load_extension("projects")
|
||||||
|
end)
|
||||||
end,
|
end,
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>fp", "<Cmd>Telescope projects<CR>", desc = "Projects" },
|
{ "<leader>fp", "<Cmd>Telescope projects<CR>", desc = "Projects" },
|
||||||
|
|
@ -42,4 +46,21 @@ return {
|
||||||
vim.list_extend(opts.items, items)
|
vim.list_extend(opts.items, items)
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"nvimdev/dashboard-nvim",
|
||||||
|
optional = true,
|
||||||
|
opts = function(_, opts)
|
||||||
|
local projects = {
|
||||||
|
action = "Telescope projects",
|
||||||
|
desc = " Projects",
|
||||||
|
icon = " ",
|
||||||
|
key = "p",
|
||||||
|
}
|
||||||
|
|
||||||
|
projects.desc = projects.desc .. string.rep(" ", 43 - #projects.desc)
|
||||||
|
projects.key_format = " %s"
|
||||||
|
|
||||||
|
table.insert(opts.config.center, 3, projects)
|
||||||
|
end,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -18,26 +18,10 @@ local enabled = {
|
||||||
}
|
}
|
||||||
|
|
||||||
local Config = require("lazy.core.config")
|
local Config = require("lazy.core.config")
|
||||||
local Plugin = require("lazy.core.plugin")
|
|
||||||
Config.options.checker.enabled = false
|
Config.options.checker.enabled = false
|
||||||
Config.options.change_detection.enabled = false
|
Config.options.change_detection.enabled = false
|
||||||
|
Config.options.defaults.cond = function(plugin)
|
||||||
-- HACK: disable all plugins except the ones we want
|
return vim.tbl_contains(enabled, plugin.name) or plugin.vscode
|
||||||
local fix_disabled = Plugin.Spec.fix_disabled
|
|
||||||
function Plugin.Spec.fix_disabled(self)
|
|
||||||
for _, plugin in pairs(self.plugins) do
|
|
||||||
if not (vim.tbl_contains(enabled, plugin.name) or plugin.vscode) then
|
|
||||||
plugin.enabled = false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
fix_disabled(self)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- HACK: don't clean plugins in vscode
|
|
||||||
local update_state = Plugin.update_state
|
|
||||||
function Plugin.update_state()
|
|
||||||
update_state()
|
|
||||||
Config.to_clean = {}
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Add some vscode specific keymaps
|
-- Add some vscode specific keymaps
|
||||||
|
|
|
||||||
116
lua/lazyvim/plugins/formatting.lua
Normal file
116
lua/lazyvim/plugins/formatting.lua
Normal file
|
|
@ -0,0 +1,116 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@param opts ConformOpts
|
||||||
|
function M.setup(_, opts)
|
||||||
|
for name, formatter in pairs(opts.formatters or {}) do
|
||||||
|
if type(formatter) == "table" then
|
||||||
|
---@diagnostic disable-next-line: undefined-field
|
||||||
|
if formatter.extra_args then
|
||||||
|
---@diagnostic disable-next-line: undefined-field
|
||||||
|
formatter.prepend_args = formatter.extra_args
|
||||||
|
Util.deprecate(("opts.formatters.%s.extra_args"):format(name), ("opts.formatters.%s.prepend_args"):format(name))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, key in ipairs({ "format_on_save", "format_after_save" }) do
|
||||||
|
if opts[key] then
|
||||||
|
Util.warn(
|
||||||
|
("Don't set `opts.%s` for `conform.nvim`.\n**LazyVim** will use the conform formatter automatically"):format(
|
||||||
|
key
|
||||||
|
)
|
||||||
|
)
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
opts[key] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
require("conform").setup(opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"stevearc/conform.nvim",
|
||||||
|
dependencies = { "mason.nvim" },
|
||||||
|
lazy = true,
|
||||||
|
cmd = "ConformInfo",
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>cF",
|
||||||
|
function()
|
||||||
|
require("conform").format({ formatters = { "injected" } })
|
||||||
|
end,
|
||||||
|
mode = { "n", "v" },
|
||||||
|
desc = "Format Injected Langs",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
init = function()
|
||||||
|
-- Install the conform formatter on VeryLazy
|
||||||
|
require("lazyvim.util").on_very_lazy(function()
|
||||||
|
require("lazyvim.util").format.register({
|
||||||
|
name = "conform.nvim",
|
||||||
|
priority = 100,
|
||||||
|
primary = true,
|
||||||
|
format = function(buf)
|
||||||
|
local plugin = require("lazy.core.config").plugins["conform.nvim"]
|
||||||
|
local Plugin = require("lazy.core.plugin")
|
||||||
|
local opts = Plugin.values(plugin, "opts", false)
|
||||||
|
require("conform").format(Util.merge(opts.format, { bufnr = buf }))
|
||||||
|
end,
|
||||||
|
sources = function(buf)
|
||||||
|
local ret = require("conform").list_formatters(buf)
|
||||||
|
---@param v conform.FormatterInfo
|
||||||
|
return vim.tbl_map(function(v)
|
||||||
|
return v.name
|
||||||
|
end, ret)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
opts = function()
|
||||||
|
local plugin = require("lazy.core.config").plugins["conform.nvim"]
|
||||||
|
if plugin.config ~= M.setup then
|
||||||
|
Util.error({
|
||||||
|
"Don't set `plugin.config` for `conform.nvim`.\n",
|
||||||
|
"This will break **LazyVim** formatting.\n",
|
||||||
|
"Please refer to the docs at https://www.lazyvim.org/plugins/formatting",
|
||||||
|
}, { title = "LazyVim" })
|
||||||
|
end
|
||||||
|
---@class ConformOpts
|
||||||
|
local opts = {
|
||||||
|
-- LazyVim will use these options when formatting with the conform.nvim formatter
|
||||||
|
format = {
|
||||||
|
timeout_ms = 3000,
|
||||||
|
async = false, -- not recommended to change
|
||||||
|
quiet = false, -- not recommended to change
|
||||||
|
},
|
||||||
|
---@type table<string, conform.FormatterUnit[]>
|
||||||
|
formatters_by_ft = {
|
||||||
|
lua = { "stylua" },
|
||||||
|
fish = { "fish_indent" },
|
||||||
|
sh = { "shfmt" },
|
||||||
|
},
|
||||||
|
-- The options you set here will be merged with the builtin formatters.
|
||||||
|
-- You can also define any custom formatters here.
|
||||||
|
---@type table<string, conform.FormatterConfigOverride|fun(bufnr: integer): nil|conform.FormatterConfigOverride>
|
||||||
|
formatters = {
|
||||||
|
injected = { options = { ignore_errors = true } },
|
||||||
|
-- # Example of using dprint only when a dprint.json file is present
|
||||||
|
-- dprint = {
|
||||||
|
-- condition = function(ctx)
|
||||||
|
-- return vim.fs.find({ "dprint.json" }, { path = ctx.filename, upward = true })[1]
|
||||||
|
-- end,
|
||||||
|
-- },
|
||||||
|
--
|
||||||
|
-- # Example of using shfmt with extra args
|
||||||
|
-- shfmt = {
|
||||||
|
-- prepend_args = { "-i", "2", "-ci" },
|
||||||
|
-- },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
return opts
|
||||||
|
end,
|
||||||
|
config = M.setup,
|
||||||
|
},
|
||||||
|
}
|
||||||
16
lua/lazyvim/plugins/init.lua
Normal file
16
lua/lazyvim/plugins/init.lua
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
if vim.fn.has("nvim-0.9.0") == 0 then
|
||||||
|
vim.api.nvim_echo({
|
||||||
|
{ "LazyVim requires Neovim >= 0.9.0\n", "ErrorMsg" },
|
||||||
|
{ "Press any key to exit", "MoreMsg" },
|
||||||
|
}, true, {})
|
||||||
|
vim.fn.getchar()
|
||||||
|
vim.cmd([[quit]])
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
|
||||||
|
require("lazyvim.config").init()
|
||||||
|
|
||||||
|
return {
|
||||||
|
{ "folke/lazy.nvim", version = "*" },
|
||||||
|
{ "LazyVim/LazyVim", priority = 10000, lazy = false, config = true, cond = true, version = "*" },
|
||||||
|
}
|
||||||
93
lua/lazyvim/plugins/linting.lua
Normal file
93
lua/lazyvim/plugins/linting.lua
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
return {
|
||||||
|
{
|
||||||
|
"mfussenegger/nvim-lint",
|
||||||
|
event = "LazyFile",
|
||||||
|
opts = {
|
||||||
|
-- Event to trigger linters
|
||||||
|
events = { "BufWritePost", "BufReadPost", "InsertLeave" },
|
||||||
|
linters_by_ft = {
|
||||||
|
fish = { "fish" },
|
||||||
|
-- Use the "*" filetype to run linters on all filetypes.
|
||||||
|
-- ['*'] = { 'global linter' },
|
||||||
|
-- Use the "_" filetype to run linters on filetypes that don't have other linters configured.
|
||||||
|
-- ['_'] = { 'fallback linter' },
|
||||||
|
},
|
||||||
|
-- LazyVim extension to easily override linter options
|
||||||
|
-- or add custom linters.
|
||||||
|
---@type table<string,table>
|
||||||
|
linters = {
|
||||||
|
-- -- Example of using selene only when a selene.toml file is present
|
||||||
|
-- selene = {
|
||||||
|
-- -- `condition` is another LazyVim extension that allows you to
|
||||||
|
-- -- dynamically enable/disable linters based on the context.
|
||||||
|
-- condition = function(ctx)
|
||||||
|
-- return vim.fs.find({ "selene.toml" }, { path = ctx.filename, upward = true })[1]
|
||||||
|
-- end,
|
||||||
|
-- },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
local lint = require("lint")
|
||||||
|
for name, linter in pairs(opts.linters) do
|
||||||
|
if type(linter) == "table" and type(lint.linters[name]) == "table" then
|
||||||
|
lint.linters[name] = vim.tbl_deep_extend("force", lint.linters[name], linter)
|
||||||
|
else
|
||||||
|
lint.linters[name] = linter
|
||||||
|
end
|
||||||
|
end
|
||||||
|
lint.linters_by_ft = opts.linters_by_ft
|
||||||
|
|
||||||
|
function M.debounce(ms, fn)
|
||||||
|
local timer = vim.loop.new_timer()
|
||||||
|
return function(...)
|
||||||
|
local argv = { ... }
|
||||||
|
timer:start(ms, 0, function()
|
||||||
|
timer:stop()
|
||||||
|
vim.schedule_wrap(fn)(unpack(argv))
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.lint()
|
||||||
|
-- Use nvim-lint's logic first:
|
||||||
|
-- * checks if linters exist for the full filetype first
|
||||||
|
-- * otherwise will split filetype by "." and add all those linters
|
||||||
|
-- * this differs from conform.nvim which only uses the first filetype that has a formatter
|
||||||
|
local names = lint._resolve_linter_by_ft(vim.bo.filetype)
|
||||||
|
|
||||||
|
-- Add fallback linters.
|
||||||
|
if #names == 0 then
|
||||||
|
vim.list_extend(names, lint.linters_by_ft["_"] or {})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Add global linters.
|
||||||
|
vim.list_extend(names, lint.linters_by_ft["*"] or {})
|
||||||
|
|
||||||
|
-- Filter out linters that don't exist or don't match the condition.
|
||||||
|
local ctx = { filename = vim.api.nvim_buf_get_name(0) }
|
||||||
|
ctx.dirname = vim.fn.fnamemodify(ctx.filename, ":h")
|
||||||
|
names = vim.tbl_filter(function(name)
|
||||||
|
local linter = lint.linters[name]
|
||||||
|
if not linter then
|
||||||
|
Util.warn("Linter not found: " .. name, { title = "nvim-lint" })
|
||||||
|
end
|
||||||
|
return linter and not (type(linter) == "table" and linter.condition and not linter.condition(ctx))
|
||||||
|
end, names)
|
||||||
|
|
||||||
|
-- Run linters.
|
||||||
|
if #names > 0 then
|
||||||
|
lint.try_lint(names)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd(opts.events, {
|
||||||
|
group = vim.api.nvim_create_augroup("nvim-lint", { clear = true }),
|
||||||
|
callback = M.debounce(100, M.lint),
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
@ -1,152 +0,0 @@
|
||||||
local Util = require("lazy.core.util")
|
|
||||||
|
|
||||||
local M = {}
|
|
||||||
|
|
||||||
---@type PluginLspOpts
|
|
||||||
M.opts = nil
|
|
||||||
|
|
||||||
function M.enabled()
|
|
||||||
return M.opts.autoformat
|
|
||||||
end
|
|
||||||
|
|
||||||
function M.toggle()
|
|
||||||
if vim.b.autoformat == false then
|
|
||||||
vim.b.autoformat = nil
|
|
||||||
M.opts.autoformat = true
|
|
||||||
else
|
|
||||||
M.opts.autoformat = not M.opts.autoformat
|
|
||||||
end
|
|
||||||
if M.opts.autoformat then
|
|
||||||
Util.info("Enabled format on save", { title = "Format" })
|
|
||||||
else
|
|
||||||
Util.warn("Disabled format on save", { title = "Format" })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param opts? {force?:boolean}
|
|
||||||
function M.format(opts)
|
|
||||||
local buf = vim.api.nvim_get_current_buf()
|
|
||||||
if vim.b.autoformat == false and not (opts and opts.force) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local formatters = M.get_formatters(buf)
|
|
||||||
local client_ids = vim.tbl_map(function(client)
|
|
||||||
return client.id
|
|
||||||
end, formatters.active)
|
|
||||||
|
|
||||||
if #client_ids == 0 then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
if M.opts.format_notify then
|
|
||||||
M.notify(formatters)
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.lsp.buf.format(vim.tbl_deep_extend("force", {
|
|
||||||
bufnr = buf,
|
|
||||||
filter = function(client)
|
|
||||||
return vim.tbl_contains(client_ids, client.id)
|
|
||||||
end,
|
|
||||||
}, require("lazyvim.util").opts("nvim-lspconfig").format or {}))
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param formatters LazyVimFormatters
|
|
||||||
function M.notify(formatters)
|
|
||||||
local lines = { "# Active:" }
|
|
||||||
|
|
||||||
for _, client in ipairs(formatters.active) do
|
|
||||||
local line = "- **" .. client.name .. "**"
|
|
||||||
if client.name == "null-ls" then
|
|
||||||
line = line
|
|
||||||
.. " ("
|
|
||||||
.. table.concat(
|
|
||||||
vim.tbl_map(function(f)
|
|
||||||
return "`" .. f.name .. "`"
|
|
||||||
end, formatters.null_ls),
|
|
||||||
", "
|
|
||||||
)
|
|
||||||
.. ")"
|
|
||||||
end
|
|
||||||
table.insert(lines, line)
|
|
||||||
end
|
|
||||||
|
|
||||||
if #formatters.available > 0 then
|
|
||||||
table.insert(lines, "")
|
|
||||||
table.insert(lines, "# Disabled:")
|
|
||||||
for _, client in ipairs(formatters.available) do
|
|
||||||
table.insert(lines, "- **" .. client.name .. "**")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.notify(table.concat(lines, "\n"), vim.log.levels.INFO, {
|
|
||||||
title = "Formatting",
|
|
||||||
on_open = function(win)
|
|
||||||
vim.api.nvim_win_set_option(win, "conceallevel", 3)
|
|
||||||
vim.api.nvim_win_set_option(win, "spell", false)
|
|
||||||
local buf = vim.api.nvim_win_get_buf(win)
|
|
||||||
vim.treesitter.start(buf, "markdown")
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Gets all lsp clients that support formatting.
|
|
||||||
-- When a null-ls formatter is available for the current filetype,
|
|
||||||
-- only null-ls formatters are returned.
|
|
||||||
function M.get_formatters(bufnr)
|
|
||||||
local ft = vim.bo[bufnr].filetype
|
|
||||||
-- check if we have any null-ls formatters for the current filetype
|
|
||||||
local null_ls = package.loaded["null-ls"] and require("null-ls.sources").get_available(ft, "NULL_LS_FORMATTING") or {}
|
|
||||||
|
|
||||||
---@class LazyVimFormatters
|
|
||||||
local ret = {
|
|
||||||
---@type lsp.Client[]
|
|
||||||
active = {},
|
|
||||||
---@type lsp.Client[]
|
|
||||||
available = {},
|
|
||||||
null_ls = null_ls,
|
|
||||||
}
|
|
||||||
|
|
||||||
---@type lsp.Client[]
|
|
||||||
local clients = vim.lsp.get_active_clients({ bufnr = bufnr })
|
|
||||||
for _, client in ipairs(clients) do
|
|
||||||
if M.supports_format(client) then
|
|
||||||
if (#null_ls > 0 and client.name == "null-ls") or #null_ls == 0 then
|
|
||||||
table.insert(ret.active, client)
|
|
||||||
else
|
|
||||||
table.insert(ret.available, client)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Gets all lsp clients that support formatting
|
|
||||||
-- and have not disabled it in their client config
|
|
||||||
---@param client lsp.Client
|
|
||||||
function M.supports_format(client)
|
|
||||||
if
|
|
||||||
client.config
|
|
||||||
and client.config.capabilities
|
|
||||||
and client.config.capabilities.documentFormattingProvider == false
|
|
||||||
then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return client.supports_method("textDocument/formatting") or client.supports_method("textDocument/rangeFormatting")
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param opts PluginLspOpts
|
|
||||||
function M.setup(opts)
|
|
||||||
M.opts = opts
|
|
||||||
vim.api.nvim_create_autocmd("BufWritePre", {
|
|
||||||
group = vim.api.nvim_create_augroup("LazyVimFormat", {}),
|
|
||||||
callback = function()
|
|
||||||
if M.opts.autoformat then
|
|
||||||
M.format()
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
return M
|
|
||||||
|
|
@ -1,19 +1,15 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
-- lspconfig
|
-- lspconfig
|
||||||
{
|
{
|
||||||
"neovim/nvim-lspconfig",
|
"neovim/nvim-lspconfig",
|
||||||
event = { "BufReadPre", "BufNewFile" },
|
event = "LazyFile",
|
||||||
dependencies = {
|
dependencies = {
|
||||||
{ "folke/neoconf.nvim", cmd = "Neoconf", config = true },
|
{ "folke/neoconf.nvim", cmd = "Neoconf", config = false, dependencies = { "nvim-lspconfig" } },
|
||||||
{ "folke/neodev.nvim", opts = {} },
|
{ "folke/neodev.nvim", opts = {} },
|
||||||
"mason.nvim",
|
"mason.nvim",
|
||||||
"williamboman/mason-lspconfig.nvim",
|
"williamboman/mason-lspconfig.nvim",
|
||||||
{
|
|
||||||
"hrsh7th/cmp-nvim-lsp",
|
|
||||||
cond = function()
|
|
||||||
return require("lazyvim.util").has("nvim-cmp")
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
---@class PluginLspOpts
|
---@class PluginLspOpts
|
||||||
opts = {
|
opts = {
|
||||||
|
|
@ -39,11 +35,6 @@ return {
|
||||||
},
|
},
|
||||||
-- add any global capabilities here
|
-- add any global capabilities here
|
||||||
capabilities = {},
|
capabilities = {},
|
||||||
-- Automatically format on save
|
|
||||||
autoformat = true,
|
|
||||||
-- Enable this to show formatters used in a notification
|
|
||||||
-- Useful for debugging formatter issues
|
|
||||||
format_notify = false,
|
|
||||||
-- 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
|
||||||
|
|
@ -54,9 +45,12 @@ return {
|
||||||
-- LSP Server Settings
|
-- LSP Server Settings
|
||||||
---@type lspconfig.options
|
---@type lspconfig.options
|
||||||
servers = {
|
servers = {
|
||||||
jsonls = {},
|
|
||||||
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
|
||||||
|
-- Use this to add any additional keymaps
|
||||||
|
-- for specific lsp servers
|
||||||
|
---@type LazyKeysSpec[]
|
||||||
|
-- keys = {},
|
||||||
settings = {
|
settings = {
|
||||||
Lua = {
|
Lua = {
|
||||||
workspace = {
|
workspace = {
|
||||||
|
|
@ -84,24 +78,47 @@ return {
|
||||||
},
|
},
|
||||||
---@param opts PluginLspOpts
|
---@param opts PluginLspOpts
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
local Util = require("lazyvim.util")
|
if Util.has("neoconf.nvim") then
|
||||||
|
local plugin = require("lazy.core.config").spec.plugins["neoconf.nvim"]
|
||||||
|
require("neoconf").setup(require("lazy.core.plugin").values(plugin, "opts", false))
|
||||||
|
end
|
||||||
|
|
||||||
-- setup autoformat
|
-- setup autoformat
|
||||||
require("lazyvim.plugins.lsp.format").setup(opts)
|
Util.format.register(Util.lsp.formatter())
|
||||||
-- setup formatting and keymaps
|
|
||||||
Util.on_attach(function(client, buffer)
|
-- deprectaed options
|
||||||
|
if opts.autoformat ~= nil then
|
||||||
|
vim.g.autoformat = opts.autoformat
|
||||||
|
Util.deprecate("nvim-lspconfig.opts.autoformat", "vim.g.autoformat")
|
||||||
|
end
|
||||||
|
|
||||||
|
-- setup keymaps
|
||||||
|
Util.lsp.on_attach(function(client, buffer)
|
||||||
require("lazyvim.plugins.lsp.keymaps").on_attach(client, buffer)
|
require("lazyvim.plugins.lsp.keymaps").on_attach(client, buffer)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
local register_capability = vim.lsp.handlers["client/registerCapability"]
|
||||||
|
|
||||||
|
vim.lsp.handlers["client/registerCapability"] = function(err, res, ctx)
|
||||||
|
local ret = register_capability(err, res, ctx)
|
||||||
|
local client_id = ctx.client_id
|
||||||
|
---@type lsp.Client
|
||||||
|
local client = vim.lsp.get_client_by_id(client_id)
|
||||||
|
local buffer = vim.api.nvim_get_current_buf()
|
||||||
|
require("lazyvim.plugins.lsp.keymaps").on_attach(client, buffer)
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
-- diagnostics
|
-- diagnostics
|
||||||
for name, icon in pairs(require("lazyvim.config").icons.diagnostics) do
|
for name, icon in pairs(require("lazyvim.config").icons.diagnostics) do
|
||||||
name = "DiagnosticSign" .. name
|
name = "DiagnosticSign" .. name
|
||||||
vim.fn.sign_define(name, { text = icon, texthl = name, numhl = "" })
|
vim.fn.sign_define(name, { text = icon, texthl = name, numhl = "" })
|
||||||
end
|
end
|
||||||
|
|
||||||
if opts.inlay_hints.enabled and vim.lsp.buf.inlay_hint then
|
if opts.inlay_hints.enabled then
|
||||||
Util.on_attach(function(client, buffer)
|
Util.lsp.on_attach(function(client, buffer)
|
||||||
if client.server_capabilities.inlayHintProvider then
|
if client.supports_method("textDocument/inlayHint") then
|
||||||
vim.lsp.buf.inlay_hint(buffer, true)
|
Util.toggle.inlay_hints(buffer, true)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
@ -121,11 +138,12 @@ return {
|
||||||
vim.diagnostic.config(vim.deepcopy(opts.diagnostics))
|
vim.diagnostic.config(vim.deepcopy(opts.diagnostics))
|
||||||
|
|
||||||
local servers = opts.servers
|
local servers = opts.servers
|
||||||
|
local has_cmp, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
|
||||||
local capabilities = vim.tbl_deep_extend(
|
local capabilities = vim.tbl_deep_extend(
|
||||||
"force",
|
"force",
|
||||||
{},
|
{},
|
||||||
vim.lsp.protocol.make_client_capabilities(),
|
vim.lsp.protocol.make_client_capabilities(),
|
||||||
require("cmp_nvim_lsp").default_capabilities(),
|
has_cmp and cmp_nvim_lsp.default_capabilities() or {},
|
||||||
opts.capabilities or {}
|
opts.capabilities or {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -146,7 +164,7 @@ return {
|
||||||
require("lspconfig")[server].setup(server_opts)
|
require("lspconfig")[server].setup(server_opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- get all the servers that are available thourgh mason-lspconfig
|
-- get all the servers that are available through mason-lspconfig
|
||||||
local have_mason, mlsp = pcall(require, "mason-lspconfig")
|
local have_mason, mlsp = pcall(require, "mason-lspconfig")
|
||||||
local all_mslp_servers = {}
|
local all_mslp_servers = {}
|
||||||
if have_mason then
|
if have_mason then
|
||||||
|
|
@ -170,42 +188,23 @@ return {
|
||||||
mlsp.setup({ ensure_installed = ensure_installed, handlers = { setup } })
|
mlsp.setup({ ensure_installed = ensure_installed, handlers = { setup } })
|
||||||
end
|
end
|
||||||
|
|
||||||
if Util.lsp_get_config("denols") and Util.lsp_get_config("tsserver") then
|
if Util.lsp.get_config("denols") and Util.lsp.get_config("tsserver") then
|
||||||
local is_deno = require("lspconfig.util").root_pattern("deno.json", "deno.jsonc")
|
local is_deno = require("lspconfig.util").root_pattern("deno.json", "deno.jsonc")
|
||||||
Util.lsp_disable("tsserver", is_deno)
|
Util.lsp.disable("tsserver", is_deno)
|
||||||
Util.lsp_disable("denols", function(root_dir)
|
Util.lsp.disable("denols", function(root_dir)
|
||||||
return not is_deno(root_dir)
|
return not is_deno(root_dir)
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- formatters
|
|
||||||
{
|
|
||||||
"jose-elias-alvarez/null-ls.nvim",
|
|
||||||
event = { "BufReadPre", "BufNewFile" },
|
|
||||||
dependencies = { "mason.nvim" },
|
|
||||||
opts = function()
|
|
||||||
local nls = require("null-ls")
|
|
||||||
return {
|
|
||||||
root_dir = require("null-ls.utils").root_pattern(".null-ls-root", ".neoconf.json", "Makefile", ".git"),
|
|
||||||
sources = {
|
|
||||||
nls.builtins.formatting.fish_indent,
|
|
||||||
nls.builtins.diagnostics.fish,
|
|
||||||
nls.builtins.formatting.stylua,
|
|
||||||
nls.builtins.formatting.shfmt,
|
|
||||||
-- nls.builtins.diagnostics.flake8,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- cmdline tools and lsp servers
|
-- cmdline tools and lsp servers
|
||||||
{
|
{
|
||||||
|
|
||||||
"williamboman/mason.nvim",
|
"williamboman/mason.nvim",
|
||||||
cmd = "Mason",
|
cmd = "Mason",
|
||||||
keys = { { "<leader>cm", "<cmd>Mason<cr>", desc = "Mason" } },
|
keys = { { "<leader>cm", "<cmd>Mason<cr>", desc = "Mason" } },
|
||||||
|
build = ":MasonUpdate",
|
||||||
opts = {
|
opts = {
|
||||||
ensure_installed = {
|
ensure_installed = {
|
||||||
"stylua",
|
"stylua",
|
||||||
|
|
@ -217,6 +216,15 @@ return {
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
require("mason").setup(opts)
|
require("mason").setup(opts)
|
||||||
local mr = require("mason-registry")
|
local mr = require("mason-registry")
|
||||||
|
mr:on("package:install:success", function()
|
||||||
|
vim.defer_fn(function()
|
||||||
|
-- trigger FileType event to possibly load this newly installed LSP server
|
||||||
|
require("lazy.core.handler.event").trigger({
|
||||||
|
event = "FileType",
|
||||||
|
buf = vim.api.nvim_get_current_buf(),
|
||||||
|
})
|
||||||
|
end, 100)
|
||||||
|
end)
|
||||||
local function ensure_installed()
|
local function ensure_installed()
|
||||||
for _, tool in ipairs(opts.ensure_installed) do
|
for _, tool in ipairs(opts.ensure_installed) do
|
||||||
local p = mr.get_package(tool)
|
local p = mr.get_package(tool)
|
||||||
|
|
|
||||||
|
|
@ -1,35 +1,27 @@
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
---@type PluginLspKeys
|
---@type LazyKeysLspSpec[]|nil
|
||||||
M._keys = nil
|
M._keys = nil
|
||||||
|
|
||||||
---@return (LazyKeys|{has?:string})[]
|
---@alias LazyKeysLspSpec LazyKeysSpec|{has?:string}
|
||||||
|
---@alias LazyKeysLsp LazyKeys|{has?:string}
|
||||||
|
|
||||||
|
---@return LazyKeysLspSpec[]
|
||||||
function M.get()
|
function M.get()
|
||||||
local format = function()
|
if M._keys then
|
||||||
require("lazyvim.plugins.lsp.format").format({ force = true })
|
return M._keys
|
||||||
end
|
end
|
||||||
if not M._keys then
|
|
||||||
---@class PluginLspKeys
|
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
M._keys = {
|
M._keys = {
|
||||||
{ "<leader>cd", vim.diagnostic.open_float, desc = "Line Diagnostics" },
|
|
||||||
{ "<leader>cl", "<cmd>LspInfo<cr>", desc = "Lsp Info" },
|
{ "<leader>cl", "<cmd>LspInfo<cr>", desc = "Lsp Info" },
|
||||||
{ "gd", "<cmd>Telescope lsp_definitions<cr>", 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" },
|
{ "gr", "<cmd>Telescope lsp_references<cr>", desc = "References" },
|
||||||
{ "gD", vim.lsp.buf.declaration, desc = "Goto Declaration" },
|
{ "gD", vim.lsp.buf.declaration, desc = "Goto Declaration" },
|
||||||
{ "gI", "<cmd>Telescope lsp_implementations<cr>", desc = "Goto Implementation" },
|
{ "gI", function() require("telescope.builtin").lsp_implementations({ reuse_win = true }) end, desc = "Goto Implementation" },
|
||||||
{ "gy", "<cmd>Telescope lsp_type_definitions<cr>", desc = "Goto T[y]pe Definition" },
|
{ "gy", function() require("telescope.builtin").lsp_type_definitions({ reuse_win = true }) end, desc = "Goto T[y]pe Definition" },
|
||||||
{ "K", vim.lsp.buf.hover, desc = "Hover" },
|
{ "K", vim.lsp.buf.hover, desc = "Hover" },
|
||||||
{ "gK", vim.lsp.buf.signature_help, desc = "Signature Help", has = "signatureHelp" },
|
{ "gK", vim.lsp.buf.signature_help, desc = "Signature Help", has = "signatureHelp" },
|
||||||
{ "<c-k>", vim.lsp.buf.signature_help, mode = "i", desc = "Signature Help", has = "signatureHelp" },
|
{ "<c-k>", vim.lsp.buf.signature_help, mode = "i", desc = "Signature Help", has = "signatureHelp" },
|
||||||
{ "]d", M.diagnostic_goto(true), desc = "Next Diagnostic" },
|
|
||||||
{ "[d", M.diagnostic_goto(false), desc = "Prev Diagnostic" },
|
|
||||||
{ "]e", M.diagnostic_goto(true, "ERROR"), desc = "Next Error" },
|
|
||||||
{ "[e", M.diagnostic_goto(false, "ERROR"), desc = "Prev Error" },
|
|
||||||
{ "]w", M.diagnostic_goto(true, "WARN"), desc = "Next Warning" },
|
|
||||||
{ "[w", M.diagnostic_goto(false, "WARN"), desc = "Prev Warning" },
|
|
||||||
{ "<leader>cf", format, desc = "Format Document", has = "documentFormatting" },
|
|
||||||
{ "<leader>cf", format, desc = "Format Range", mode = "v", has = "documentRangeFormatting" },
|
|
||||||
{ "<leader>ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "v" }, has = "codeAction" },
|
{ "<leader>ca", vim.lsp.buf.code_action, desc = "Code Action", mode = { "n", "v" }, has = "codeAction" },
|
||||||
{
|
{
|
||||||
"<leader>cA",
|
"<leader>cA",
|
||||||
|
|
@ -47,55 +39,64 @@ function M.get()
|
||||||
has = "codeAction",
|
has = "codeAction",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if require("lazyvim.util").has("inc-rename.nvim") then
|
if require("lazyvim.util").has("inc-rename.nvim") then
|
||||||
M._keys[#M._keys + 1] = {
|
M._keys[#M._keys + 1] = {
|
||||||
"<leader>cr",
|
"<leader>cr",
|
||||||
function()
|
function()
|
||||||
local inc_rename = require("inc_rename")
|
local inc_rename = require("inc_rename")
|
||||||
return ":" .. inc_rename.config.cmd_name .. " " .. vim.fn.expand("<cword>")
|
return ":" .. inc_rename.config.cmd_name .. " " .. vim.fn.expand("<cword>")
|
||||||
end,
|
end,
|
||||||
expr = true,
|
expr = true,
|
||||||
desc = "Rename",
|
desc = "Rename",
|
||||||
has = "rename",
|
has = "rename",
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
M._keys[#M._keys + 1] = { "<leader>cr", vim.lsp.buf.rename, desc = "Rename", has = "rename" }
|
M._keys[#M._keys + 1] = { "<leader>cr", vim.lsp.buf.rename, desc = "Rename", has = "rename" }
|
||||||
end
|
|
||||||
end
|
end
|
||||||
return M._keys
|
return M._keys
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.on_attach(client, buffer)
|
---@param method string
|
||||||
local Keys = require("lazy.core.handler.keys")
|
function M.has(buffer, method)
|
||||||
local keymaps = {} ---@type table<string,LazyKeys|{has?:string}>
|
method = method:find("/") and method or "textDocument/" .. method
|
||||||
|
local clients = require("lazyvim.util").lsp.get_clients({ bufnr = buffer })
|
||||||
for _, value in ipairs(M.get()) do
|
for _, client in ipairs(clients) do
|
||||||
local keys = Keys.parse(value)
|
if client.supports_method(method) then
|
||||||
if keys[2] == vim.NIL or keys[2] == false then
|
return true
|
||||||
keymaps[keys.id] = nil
|
|
||||||
else
|
|
||||||
keymaps[keys.id] = keys
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
---@return (LazyKeys|{has?:string})[]
|
||||||
|
function M.resolve(buffer)
|
||||||
|
local Keys = require("lazy.core.handler.keys")
|
||||||
|
if not Keys.resolve then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
local spec = M.get()
|
||||||
|
local opts = require("lazyvim.util").opts("nvim-lspconfig")
|
||||||
|
local clients = require("lazyvim.util").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
|
for _, keys in pairs(keymaps) do
|
||||||
if not keys.has or client.server_capabilities[keys.has .. "Provider"] then
|
if not keys.has or M.has(buffer, keys.has) then
|
||||||
local opts = Keys.opts(keys)
|
local opts = Keys.opts(keys)
|
||||||
---@diagnostic disable-next-line: no-unknown
|
|
||||||
opts.has = nil
|
opts.has = nil
|
||||||
opts.silent = opts.silent ~= false
|
opts.silent = opts.silent ~= false
|
||||||
opts.buffer = buffer
|
opts.buffer = buffer
|
||||||
vim.keymap.set(keys.mode or "n", keys[1], keys[2], opts)
|
vim.keymap.set(keys.mode or "n", keys.lhs, keys.rhs, opts)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.diagnostic_goto(next, severity)
|
|
||||||
local go = next and vim.diagnostic.goto_next or vim.diagnostic.goto_prev
|
|
||||||
severity = severity and vim.diagnostic.severity[severity] or nil
|
|
||||||
return function()
|
|
||||||
go({ severity = severity })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
|
|
@ -1,37 +1,67 @@
|
||||||
local load_textobjects = false
|
|
||||||
return {
|
return {
|
||||||
|
-- Treesitter is a new parser generator tool that we can
|
||||||
|
-- use in Neovim to power faster and more accurate
|
||||||
|
-- syntax highlighting.
|
||||||
{
|
{
|
||||||
"nvim-treesitter/nvim-treesitter",
|
"nvim-treesitter/nvim-treesitter",
|
||||||
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 = ":TSUpdate",
|
build = ":TSUpdate",
|
||||||
event = { "BufReadPost", "BufNewFile" },
|
event = { "LazyFile", "VeryLazy" },
|
||||||
|
init = function(plugin)
|
||||||
|
-- PERF: add nvim-treesitter queries to the rtp and it's custom query predicates early
|
||||||
|
-- This is needed because a bunch of plugins no longer `require("nvim-treesitter")`, which
|
||||||
|
-- no longer trigger the **nvim-treeitter** module to be loaded in time.
|
||||||
|
-- Luckily, the only thins that those plugins need are the custom queries, which we make available
|
||||||
|
-- during startup.
|
||||||
|
require("lazy.core.loader").add_to_rtp(plugin)
|
||||||
|
require("nvim-treesitter.query_predicates")
|
||||||
|
end,
|
||||||
dependencies = {
|
dependencies = {
|
||||||
{
|
{
|
||||||
"nvim-treesitter/nvim-treesitter-textobjects",
|
"nvim-treesitter/nvim-treesitter-textobjects",
|
||||||
init = function()
|
config = function()
|
||||||
-- disable rtp plugin, as we only need its queries for mini.ai
|
-- When in diff mode, we want to use the default
|
||||||
-- In case other textobject modules are enabled, we will load them
|
-- vim text objects c & C instead of the treesitter ones.
|
||||||
-- once nvim-treesitter is loaded
|
local move = require("nvim-treesitter.textobjects.move") ---@type table<string,fun(...)>
|
||||||
require("lazy.core.loader").disable_rtp_plugin("nvim-treesitter-textobjects")
|
local configs = require("nvim-treesitter.configs")
|
||||||
load_textobjects = true
|
for name, fn in pairs(move) do
|
||||||
|
if name:find("goto") == 1 then
|
||||||
|
move[name] = function(q, ...)
|
||||||
|
if vim.wo.diff then
|
||||||
|
local config = configs.get_module("textobjects.move")[name] ---@type table<string,string>
|
||||||
|
for key, query in pairs(config or {}) do
|
||||||
|
if q == query and key:find("[%]%[][cC]") then
|
||||||
|
vim.cmd("normal! " .. key)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return fn(q, ...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
cmd = { "TSUpdateSync" },
|
cmd = { "TSUpdateSync", "TSUpdate", "TSInstall" },
|
||||||
keys = {
|
keys = {
|
||||||
{ "<c-space>", desc = "Increment selection" },
|
{ "<c-space>", desc = "Increment selection" },
|
||||||
{ "<bs>", desc = "Decrement selection", mode = "x" },
|
{ "<bs>", desc = "Decrement selection", mode = "x" },
|
||||||
},
|
},
|
||||||
---@type TSConfig
|
---@type TSConfig
|
||||||
|
---@diagnostic disable-next-line: missing-fields
|
||||||
opts = {
|
opts = {
|
||||||
highlight = { enable = true },
|
highlight = { enable = true },
|
||||||
indent = { enable = true },
|
indent = { enable = true },
|
||||||
ensure_installed = {
|
ensure_installed = {
|
||||||
"bash",
|
"bash",
|
||||||
"c",
|
"c",
|
||||||
|
"diff",
|
||||||
"html",
|
"html",
|
||||||
"javascript",
|
"javascript",
|
||||||
|
"jsdoc",
|
||||||
"json",
|
"json",
|
||||||
|
"jsonc",
|
||||||
"lua",
|
"lua",
|
||||||
"luadoc",
|
"luadoc",
|
||||||
"luap",
|
"luap",
|
||||||
|
|
@ -40,6 +70,7 @@ return {
|
||||||
"python",
|
"python",
|
||||||
"query",
|
"query",
|
||||||
"regex",
|
"regex",
|
||||||
|
"toml",
|
||||||
"tsx",
|
"tsx",
|
||||||
"typescript",
|
"typescript",
|
||||||
"vim",
|
"vim",
|
||||||
|
|
@ -55,6 +86,15 @@ return {
|
||||||
node_decremental = "<bs>",
|
node_decremental = "<bs>",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
textobjects = {
|
||||||
|
move = {
|
||||||
|
enable = true,
|
||||||
|
goto_next_start = { ["]f"] = "@function.outer", ["]c"] = "@class.outer" },
|
||||||
|
goto_next_end = { ["]F"] = "@function.outer", ["]C"] = "@class.outer" },
|
||||||
|
goto_previous_start = { ["[f"] = "@function.outer", ["[c"] = "@class.outer" },
|
||||||
|
goto_previous_end = { ["[F"] = "@function.outer", ["[C"] = "@class.outer" },
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
---@param opts TSConfig
|
---@param opts TSConfig
|
||||||
config = function(_, opts)
|
config = function(_, opts)
|
||||||
|
|
@ -70,21 +110,37 @@ return {
|
||||||
end, opts.ensure_installed)
|
end, opts.ensure_installed)
|
||||||
end
|
end
|
||||||
require("nvim-treesitter.configs").setup(opts)
|
require("nvim-treesitter.configs").setup(opts)
|
||||||
|
|
||||||
if load_textobjects then
|
|
||||||
-- PERF: no need to load the plugin, if we only need its queries for mini.ai
|
|
||||||
if opts.textobjects then
|
|
||||||
for _, mod in ipairs({ "move", "select", "swap", "lsp_interop" }) do
|
|
||||||
if opts.textobjects[mod] and opts.textobjects[mod].enable then
|
|
||||||
local Loader = require("lazy.core.loader")
|
|
||||||
Loader.disabled_rtp_plugins["nvim-treesitter-textobjects"] = nil
|
|
||||||
local plugin = require("lazy.core.config").plugins["nvim-treesitter-textobjects"]
|
|
||||||
require("lazy.core.loader").source_runtime(plugin.dir, "plugin")
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- Show context of the current function
|
||||||
|
{
|
||||||
|
"nvim-treesitter/nvim-treesitter-context",
|
||||||
|
event = "LazyFile",
|
||||||
|
enabled = true,
|
||||||
|
opts = { mode = "cursor", max_lines = 3 },
|
||||||
|
keys = {
|
||||||
|
{
|
||||||
|
"<leader>ut",
|
||||||
|
function()
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
local tsc = require("treesitter-context")
|
||||||
|
tsc.toggle()
|
||||||
|
if Util.inject.get_upvalue(tsc.toggle, "enabled") then
|
||||||
|
Util.info("Enabled Treesitter Context", { title = "Option" })
|
||||||
|
else
|
||||||
|
Util.warn("Disabled Treesitter Context", { title = "Option" })
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
desc = "Toggle Treesitter Context",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
-- Automatically add closing tags for HTML and JSX
|
||||||
|
{
|
||||||
|
"windwp/nvim-ts-autotag",
|
||||||
|
event = "LazyFile",
|
||||||
|
opts = {},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
-- Better `vim.notify()`
|
-- Better `vim.notify()`
|
||||||
{
|
{
|
||||||
|
|
@ -19,10 +21,12 @@ return {
|
||||||
max_width = function()
|
max_width = function()
|
||||||
return math.floor(vim.o.columns * 0.75)
|
return math.floor(vim.o.columns * 0.75)
|
||||||
end,
|
end,
|
||||||
|
on_open = function(win)
|
||||||
|
vim.api.nvim_win_set_config(win, { zindex = 100 })
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
init = function()
|
init = function()
|
||||||
-- when noice is not enabled, install notify on VeryLazy
|
-- when noice is not enabled, install notify on VeryLazy
|
||||||
local Util = require("lazyvim.util")
|
|
||||||
if not Util.has("noice.nvim") then
|
if not Util.has("noice.nvim") then
|
||||||
Util.on_very_lazy(function()
|
Util.on_very_lazy(function()
|
||||||
vim.notify = require("notify")
|
vim.notify = require("notify")
|
||||||
|
|
@ -49,13 +53,21 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- bufferline
|
-- This is what powers LazyVim's fancy-looking
|
||||||
|
-- tabs, which include filetype icons and close buttons.
|
||||||
{
|
{
|
||||||
"akinsho/bufferline.nvim",
|
"akinsho/bufferline.nvim",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle pin" },
|
{ "<leader>bp", "<Cmd>BufferLineTogglePin<CR>", desc = "Toggle pin" },
|
||||||
{ "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "Delete non-pinned buffers" },
|
{ "<leader>bP", "<Cmd>BufferLineGroupClose ungrouped<CR>", desc = "Delete non-pinned buffers" },
|
||||||
|
{ "<leader>bo", "<Cmd>BufferLineCloseOthers<CR>", desc = "Delete other buffers" },
|
||||||
|
{ "<leader>br", "<Cmd>BufferLineCloseRight<CR>", desc = "Delete buffers to the right" },
|
||||||
|
{ "<leader>bl", "<Cmd>BufferLineCloseLeft<CR>", desc = "Delete buffers to the left" },
|
||||||
|
{ "<S-h>", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev buffer" },
|
||||||
|
{ "<S-l>", "<cmd>BufferLineCycleNext<cr>", desc = "Next buffer" },
|
||||||
|
{ "[b", "<cmd>BufferLineCyclePrev<cr>", desc = "Prev buffer" },
|
||||||
|
{ "]b", "<cmd>BufferLineCycleNext<cr>", desc = "Next buffer" },
|
||||||
},
|
},
|
||||||
opts = {
|
opts = {
|
||||||
options = {
|
options = {
|
||||||
|
|
@ -81,26 +93,54 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
config = function(_, opts)
|
||||||
|
require("bufferline").setup(opts)
|
||||||
|
-- Fix bufferline when restoring a session
|
||||||
|
vim.api.nvim_create_autocmd("BufAdd", {
|
||||||
|
callback = function()
|
||||||
|
vim.schedule(function()
|
||||||
|
pcall(nvim_bufferline)
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- statusline
|
-- statusline
|
||||||
{
|
{
|
||||||
"nvim-lualine/lualine.nvim",
|
"nvim-lualine/lualine.nvim",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
|
init = function()
|
||||||
|
vim.g.lualine_laststatus = vim.o.laststatus
|
||||||
|
if vim.fn.argc(-1) > 0 then
|
||||||
|
-- set an empty statusline till lualine loads
|
||||||
|
vim.o.statusline = " "
|
||||||
|
else
|
||||||
|
-- hide the statusline on the starter page
|
||||||
|
vim.o.laststatus = 0
|
||||||
|
end
|
||||||
|
end,
|
||||||
opts = function()
|
opts = function()
|
||||||
|
-- PERF: we don't need this lualine require madness 🤷
|
||||||
|
local lualine_require = require("lualine_require")
|
||||||
|
lualine_require.require = require
|
||||||
|
|
||||||
local icons = require("lazyvim.config").icons
|
local icons = require("lazyvim.config").icons
|
||||||
local Util = require("lazyvim.util")
|
|
||||||
|
vim.o.laststatus = vim.g.lualine_laststatus
|
||||||
|
|
||||||
return {
|
return {
|
||||||
options = {
|
options = {
|
||||||
theme = "auto",
|
theme = "auto",
|
||||||
globalstatus = true,
|
globalstatus = true,
|
||||||
disabled_filetypes = { statusline = { "dashboard", "alpha" } },
|
disabled_filetypes = { statusline = { "dashboard", "alpha", "starter" } },
|
||||||
},
|
},
|
||||||
sections = {
|
sections = {
|
||||||
lualine_a = { "mode" },
|
lualine_a = { "mode" },
|
||||||
lualine_b = { "branch" },
|
lualine_b = { "branch" },
|
||||||
|
|
||||||
lualine_c = {
|
lualine_c = {
|
||||||
|
Util.lualine.root_dir(),
|
||||||
{
|
{
|
||||||
"diagnostics",
|
"diagnostics",
|
||||||
symbols = {
|
symbols = {
|
||||||
|
|
@ -111,33 +151,32 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{ "filetype", icon_only = true, separator = "", padding = { left = 1, right = 0 } },
|
{ "filetype", icon_only = true, separator = "", padding = { left = 1, right = 0 } },
|
||||||
{ "filename", path = 1, symbols = { modified = " ", readonly = "", unnamed = "" } },
|
{ Util.lualine.pretty_path() },
|
||||||
-- stylua: ignore
|
|
||||||
{
|
|
||||||
function() return require("nvim-navic").get_location() end,
|
|
||||||
cond = function() return package.loaded["nvim-navic"] and require("nvim-navic").is_available() end,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
lualine_x = {
|
lualine_x = {
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
{
|
{
|
||||||
function() return require("noice").api.status.command.get() end,
|
function() return require("noice").api.status.command.get() end,
|
||||||
cond = function() return package.loaded["noice"] and require("noice").api.status.command.has() end,
|
cond = function() return package.loaded["noice"] and require("noice").api.status.command.has() end,
|
||||||
color = Util.fg("Statement"),
|
color = Util.ui.fg("Statement"),
|
||||||
},
|
},
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
{
|
{
|
||||||
function() return require("noice").api.status.mode.get() end,
|
function() return require("noice").api.status.mode.get() end,
|
||||||
cond = function() return package.loaded["noice"] and require("noice").api.status.mode.has() end,
|
cond = function() return package.loaded["noice"] and require("noice").api.status.mode.has() end,
|
||||||
color = Util.fg("Constant"),
|
color = Util.ui.fg("Constant"),
|
||||||
},
|
},
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
{
|
{
|
||||||
function() return " " .. require("dap").status() end,
|
function() return " " .. require("dap").status() end,
|
||||||
cond = function () return package.loaded["dap"] and require("dap").status() ~= "" end,
|
cond = function () return package.loaded["dap"] and require("dap").status() ~= "" end,
|
||||||
color = Util.fg("Debug"),
|
color = Util.ui.fg("Debug"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
require("lazy.status").updates,
|
||||||
|
cond = require("lazy.status").has_updates,
|
||||||
|
color = Util.ui.fg("Special"),
|
||||||
},
|
},
|
||||||
{ require("lazy.status").updates, cond = require("lazy.status").has_updates, color = Util.fg("Special") },
|
|
||||||
{
|
{
|
||||||
"diff",
|
"diff",
|
||||||
symbols = {
|
symbols = {
|
||||||
|
|
@ -145,6 +184,16 @@ return {
|
||||||
modified = icons.git.modified,
|
modified = icons.git.modified,
|
||||||
removed = icons.git.removed,
|
removed = icons.git.removed,
|
||||||
},
|
},
|
||||||
|
source = function()
|
||||||
|
local gitsigns = vim.b.gitsigns_status_dict
|
||||||
|
if gitsigns then
|
||||||
|
return {
|
||||||
|
added = gitsigns.added,
|
||||||
|
modified = gitsigns.changed,
|
||||||
|
removed = gitsigns.removed,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
lualine_y = {
|
lualine_y = {
|
||||||
|
|
@ -165,32 +214,39 @@ return {
|
||||||
-- indent guides for Neovim
|
-- indent guides for Neovim
|
||||||
{
|
{
|
||||||
"lukas-reineke/indent-blankline.nvim",
|
"lukas-reineke/indent-blankline.nvim",
|
||||||
event = { "BufReadPost", "BufNewFile" },
|
event = "LazyFile",
|
||||||
opts = {
|
opts = {
|
||||||
-- char = "▏",
|
indent = {
|
||||||
char = "│",
|
char = "│",
|
||||||
filetype_exclude = {
|
tab_char = "│",
|
||||||
"help",
|
},
|
||||||
"alpha",
|
scope = { enabled = false },
|
||||||
"dashboard",
|
exclude = {
|
||||||
"neo-tree",
|
filetypes = {
|
||||||
"Trouble",
|
"help",
|
||||||
"lazy",
|
"alpha",
|
||||||
"mason",
|
"dashboard",
|
||||||
"notify",
|
"neo-tree",
|
||||||
"toggleterm",
|
"Trouble",
|
||||||
"lazyterm",
|
"trouble",
|
||||||
|
"lazy",
|
||||||
|
"mason",
|
||||||
|
"notify",
|
||||||
|
"toggleterm",
|
||||||
|
"lazyterm",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
show_trailing_blankline_indent = false,
|
|
||||||
show_current_context = false,
|
|
||||||
},
|
},
|
||||||
|
main = "ibl",
|
||||||
},
|
},
|
||||||
|
|
||||||
-- active indent guide and indent text objects
|
-- Active indent guide and indent text objects. When you're browsing
|
||||||
|
-- code, this highlights the current level of indentation, and animates
|
||||||
|
-- the highlighting.
|
||||||
{
|
{
|
||||||
"echasnovski/mini.indentscope",
|
"echasnovski/mini.indentscope",
|
||||||
version = false, -- wait till new 0.7.0 release to put it back on semver
|
version = false, -- wait till new 0.7.0 release to put it back on semver
|
||||||
event = { "BufReadPre", "BufNewFile" },
|
event = "LazyFile",
|
||||||
opts = {
|
opts = {
|
||||||
-- symbol = "▏",
|
-- symbol = "▏",
|
||||||
symbol = "│",
|
symbol = "│",
|
||||||
|
|
@ -204,6 +260,7 @@ return {
|
||||||
"dashboard",
|
"dashboard",
|
||||||
"neo-tree",
|
"neo-tree",
|
||||||
"Trouble",
|
"Trouble",
|
||||||
|
"trouble",
|
||||||
"lazy",
|
"lazy",
|
||||||
"mason",
|
"mason",
|
||||||
"notify",
|
"notify",
|
||||||
|
|
@ -217,7 +274,7 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- noicer ui
|
-- Displays a popup with possible key bindings of the command you started typing
|
||||||
{
|
{
|
||||||
"folke/which-key.nvim",
|
"folke/which-key.nvim",
|
||||||
opts = function(_, opts)
|
opts = function(_, opts)
|
||||||
|
|
@ -226,6 +283,8 @@ return {
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
-- Highly experimental plugin that completely replaces the UI for messages, cmdline and the popupmenu.
|
||||||
{
|
{
|
||||||
"folke/noice.nvim",
|
"folke/noice.nvim",
|
||||||
event = "VeryLazy",
|
event = "VeryLazy",
|
||||||
|
|
@ -269,93 +328,86 @@ return {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
-- dashboard
|
-- icons
|
||||||
|
{ "nvim-tree/nvim-web-devicons", lazy = true },
|
||||||
|
|
||||||
|
-- ui components
|
||||||
|
{ "MunifTanjim/nui.nvim", lazy = true },
|
||||||
|
|
||||||
{
|
{
|
||||||
"goolord/alpha-nvim",
|
"goolord/alpha-nvim",
|
||||||
|
optional = true,
|
||||||
|
enabled = function()
|
||||||
|
require("lazyvim.util").warn({
|
||||||
|
"`dashboard.nvim` is now the default LazyVim starter plugin.",
|
||||||
|
"",
|
||||||
|
"To keep using `alpha.nvim`, please enable the `lazyvim.plugins.extras.ui.alpha` extra.",
|
||||||
|
"Or to hide this message, remove the alpha spec from your config.",
|
||||||
|
})
|
||||||
|
return false
|
||||||
|
end,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nvimdev/dashboard-nvim",
|
||||||
event = "VimEnter",
|
event = "VimEnter",
|
||||||
opts = function()
|
opts = function()
|
||||||
local dashboard = require("alpha.themes.dashboard")
|
|
||||||
local logo = [[
|
local logo = [[
|
||||||
██╗ █████╗ ███████╗██╗ ██╗██╗ ██╗██╗███╗ ███╗ Z
|
██╗ █████╗ ███████╗██╗ ██╗██╗ ██╗██╗███╗ ███╗ Z
|
||||||
██║ ██╔══██╗╚══███╔╝╚██╗ ██╔╝██║ ██║██║████╗ ████║ Z
|
██║ ██╔══██╗╚══███╔╝╚██╗ ██╔╝██║ ██║██║████╗ ████║ Z
|
||||||
██║ ███████║ ███╔╝ ╚████╔╝ ██║ ██║██║██╔████╔██║ z
|
██║ ███████║ ███╔╝ ╚████╔╝ ██║ ██║██║██╔████╔██║ z
|
||||||
██║ ██╔══██║ ███╔╝ ╚██╔╝ ╚██╗ ██╔╝██║██║╚██╔╝██║ z
|
██║ ██╔══██║ ███╔╝ ╚██╔╝ ╚██╗ ██╔╝██║██║╚██╔╝██║ z
|
||||||
███████╗██║ ██║███████╗ ██║ ╚████╔╝ ██║██║ ╚═╝ ██║
|
███████╗██║ ██║███████╗ ██║ ╚████╔╝ ██║██║ ╚═╝ ██║
|
||||||
╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
|
╚══════╝╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═══╝ ╚═╝╚═╝ ╚═╝
|
||||||
]]
|
]]
|
||||||
|
|
||||||
dashboard.section.header.val = vim.split(logo, "\n")
|
logo = string.rep("\n", 8) .. logo .. "\n\n"
|
||||||
dashboard.section.buttons.val = {
|
|
||||||
dashboard.button("f", " " .. " Find file", ":Telescope find_files <CR>"),
|
local opts = {
|
||||||
dashboard.button("n", " " .. " New file", ":ene <BAR> startinsert <CR>"),
|
theme = "doom",
|
||||||
dashboard.button("r", " " .. " Recent files", ":Telescope oldfiles <CR>"),
|
hide = {
|
||||||
dashboard.button("g", " " .. " Find text", ":Telescope live_grep <CR>"),
|
-- this is taken care of by lualine
|
||||||
dashboard.button("c", " " .. " Config", ":e $MYVIMRC <CR>"),
|
-- enabling this messes up the actual laststatus setting after loading a file
|
||||||
dashboard.button("s", " " .. " Restore Session", [[:lua require("persistence").load() <cr>]]),
|
statusline = false,
|
||||||
dashboard.button("l", " " .. " Lazy", ":Lazy<CR>"),
|
},
|
||||||
dashboard.button("q", " " .. " Quit", ":qa<CR>"),
|
config = {
|
||||||
|
header = vim.split(logo, "\n"),
|
||||||
|
-- stylua: ignore
|
||||||
|
center = {
|
||||||
|
{ action = "Telescope find_files", desc = " Find file", icon = " ", key = "f" },
|
||||||
|
{ action = "ene | startinsert", desc = " New file", icon = " ", key = "n" },
|
||||||
|
{ action = "Telescope oldfiles", desc = " Recent files", icon = " ", key = "r" },
|
||||||
|
{ action = "Telescope live_grep", desc = " Find text", icon = " ", key = "g" },
|
||||||
|
{ action = [[lua require("lazyvim.util").telescope.config_files()()]], desc = " Config", icon = " ", key = "c" },
|
||||||
|
{ action = 'lua require("persistence").load()', desc = " Restore Session", icon = " ", key = "s" },
|
||||||
|
{ action = "LazyExtras", desc = " Lazy Extras", icon = " ", key = "x" },
|
||||||
|
{ action = "Lazy", desc = " Lazy", icon = " ", key = "l" },
|
||||||
|
{ action = "qa", desc = " Quit", icon = " ", key = "q" },
|
||||||
|
},
|
||||||
|
footer = function()
|
||||||
|
local stats = require("lazy").stats()
|
||||||
|
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
|
||||||
|
return { "⚡ Neovim loaded " .. stats.loaded .. "/" .. stats.count .. " plugins in " .. ms .. "ms" }
|
||||||
|
end,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, button in ipairs(dashboard.section.buttons.val) do
|
|
||||||
button.opts.hl = "AlphaButtons"
|
for _, button in ipairs(opts.config.center) do
|
||||||
button.opts.hl_shortcut = "AlphaShortcut"
|
button.desc = button.desc .. string.rep(" ", 43 - #button.desc)
|
||||||
|
button.key_format = " %s"
|
||||||
end
|
end
|
||||||
dashboard.section.header.opts.hl = "AlphaHeader"
|
|
||||||
dashboard.section.buttons.opts.hl = "AlphaButtons"
|
|
||||||
dashboard.section.footer.opts.hl = "AlphaFooter"
|
|
||||||
dashboard.opts.layout[1].val = 8
|
|
||||||
return dashboard
|
|
||||||
end,
|
|
||||||
config = function(_, dashboard)
|
|
||||||
-- close Lazy and re-open when the dashboard is ready
|
-- close Lazy and re-open when the dashboard is ready
|
||||||
if vim.o.filetype == "lazy" then
|
if vim.o.filetype == "lazy" then
|
||||||
vim.cmd.close()
|
vim.cmd.close()
|
||||||
vim.api.nvim_create_autocmd("User", {
|
vim.api.nvim_create_autocmd("User", {
|
||||||
pattern = "AlphaReady",
|
pattern = "DashboardLoaded",
|
||||||
callback = function()
|
callback = function()
|
||||||
require("lazy").show()
|
require("lazy").show()
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
require("alpha").setup(dashboard.opts)
|
return opts
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd("User", {
|
|
||||||
pattern = "LazyVimStarted",
|
|
||||||
callback = function()
|
|
||||||
local stats = require("lazy").stats()
|
|
||||||
local ms = (math.floor(stats.startuptime * 100 + 0.5) / 100)
|
|
||||||
dashboard.section.footer.val = "⚡ Neovim loaded " .. stats.count .. " plugins in " .. ms .. "ms"
|
|
||||||
pcall(vim.cmd.AlphaRedraw)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- lsp symbol navigation for lualine
|
|
||||||
{
|
|
||||||
"SmiteshP/nvim-navic",
|
|
||||||
lazy = true,
|
|
||||||
init = function()
|
|
||||||
vim.g.navic_silence = true
|
|
||||||
require("lazyvim.util").on_attach(function(client, buffer)
|
|
||||||
if client.server_capabilities.documentSymbolProvider then
|
|
||||||
require("nvim-navic").attach(client, buffer)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end,
|
|
||||||
opts = function()
|
|
||||||
return {
|
|
||||||
separator = " ",
|
|
||||||
highlight = true,
|
|
||||||
depth_limit = 5,
|
|
||||||
icons = require("lazyvim.config").icons.kinds,
|
|
||||||
}
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
|
|
||||||
-- icons
|
|
||||||
{ "nvim-tree/nvim-web-devicons", lazy = true },
|
|
||||||
|
|
||||||
-- ui components
|
|
||||||
{ "MunifTanjim/nui.nvim", lazy = true },
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,13 @@ return {
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
|
|
||||||
-- session management
|
-- Session management. This saves your session in the background,
|
||||||
|
-- keeping track of open buffers, window arrangement, and more.
|
||||||
|
-- You can restore sessions when returning through the dashboard.
|
||||||
{
|
{
|
||||||
"folke/persistence.nvim",
|
"folke/persistence.nvim",
|
||||||
event = "BufReadPre",
|
event = "BufReadPre",
|
||||||
opts = { options = { "buffers", "curdir", "tabpages", "winsize", "help", "globals", "skiprtp" } },
|
opts = { options = vim.opt.sessionoptions:get() },
|
||||||
-- stylua: ignore
|
-- stylua: ignore
|
||||||
keys = {
|
keys = {
|
||||||
{ "<leader>qs", function() require("persistence").load() end, desc = "Restore Session" },
|
{ "<leader>qs", function() require("persistence").load() end, desc = "Restore Session" },
|
||||||
|
|
@ -24,7 +26,4 @@ return {
|
||||||
|
|
||||||
-- library used by other plugins
|
-- library used by other plugins
|
||||||
{ "nvim-lua/plenary.nvim", lazy = true },
|
{ "nvim-lua/plenary.nvim", lazy = true },
|
||||||
|
|
||||||
-- makes some plugins dot-repeatable like leap
|
|
||||||
{ "tpope/vim-repeat", event = "VeryLazy" },
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
23
lua/lazyvim/plugins/xtras.lua
Normal file
23
lua/lazyvim/plugins/xtras.lua
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
|
||||||
|
-- Some extras need to be loaded before others
|
||||||
|
local prios = {
|
||||||
|
["lazyvim.plugins.extras.editor.aerial"] = 100,
|
||||||
|
["lazyvim.plugins.extras.editor.symbols-outline"] = 100,
|
||||||
|
["lazyvim.plugins.extras.test.core"] = 1,
|
||||||
|
["lazyvim.plugins.extras.dap.core"] = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
table.sort(Config.json.data.extras, function(a, b)
|
||||||
|
local pa = prios[a] or 10
|
||||||
|
local pb = prios[b] or 10
|
||||||
|
if pa == pb then
|
||||||
|
return a < b
|
||||||
|
end
|
||||||
|
return pa < pb
|
||||||
|
end)
|
||||||
|
|
||||||
|
---@param extra string
|
||||||
|
return vim.tbl_map(function(extra)
|
||||||
|
return { import = extra }
|
||||||
|
end, Config.json.data.extras)
|
||||||
243
lua/lazyvim/util/extras.lua
Normal file
243
lua/lazyvim/util/extras.lua
Normal file
|
|
@ -0,0 +1,243 @@
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
local Float = require("lazy.view.float")
|
||||||
|
local LazyConfig = require("lazy.core.config")
|
||||||
|
local Plugin = require("lazy.core.plugin")
|
||||||
|
local Text = require("lazy.view.text")
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class LazyExtraSource
|
||||||
|
---@field name string
|
||||||
|
---@field desc? string
|
||||||
|
---@field module string
|
||||||
|
|
||||||
|
---@class LazyExtra
|
||||||
|
---@field name string
|
||||||
|
---@field source LazyExtraSource
|
||||||
|
---@field module string
|
||||||
|
---@field desc? string
|
||||||
|
---@field enabled boolean
|
||||||
|
---@field managed boolean
|
||||||
|
---@field row? number
|
||||||
|
---@field plugins string[]
|
||||||
|
---@field optional string[]
|
||||||
|
|
||||||
|
---@class lazyvim.util.extras
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@type LazyExtraSource[]
|
||||||
|
M.sources = {
|
||||||
|
{ name = "LazyVim", desc = "LazyVim extras", module = "lazyvim.plugins.extras" },
|
||||||
|
{ name = "User", desc = "User extras", module = "plugins.extras" },
|
||||||
|
}
|
||||||
|
|
||||||
|
M.ns = vim.api.nvim_create_namespace("lazyvim.extras")
|
||||||
|
---@type string[]
|
||||||
|
M.state = nil
|
||||||
|
|
||||||
|
---@return LazyExtra[]
|
||||||
|
function M.get()
|
||||||
|
M.state = M.state or LazyConfig.spec.modules
|
||||||
|
local extras = {} ---@type LazyExtra[]
|
||||||
|
for _, source in ipairs(M.sources) do
|
||||||
|
local root = Util.find_root(source.module)
|
||||||
|
if root then
|
||||||
|
Util.walk(root, function(path, name, type)
|
||||||
|
if type == "file" and name:match("%.lua$") then
|
||||||
|
name = path:sub(#root + 2, -5):gsub("/", ".")
|
||||||
|
local ok, extra = pcall(M.get_extra, source, source.module .. "." .. name)
|
||||||
|
if ok then
|
||||||
|
extras[#extras + 1] = extra
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(extras, function(a, b)
|
||||||
|
return a.name < b.name
|
||||||
|
end)
|
||||||
|
return extras
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param modname string
|
||||||
|
---@param source LazyExtraSource
|
||||||
|
function M.get_extra(source, modname)
|
||||||
|
local enabled = vim.tbl_contains(M.state, modname)
|
||||||
|
local spec = Plugin.Spec.new({ import = modname }, { optional = true })
|
||||||
|
local plugins = {} ---@type string[]
|
||||||
|
local optional = {} ---@type string[]
|
||||||
|
for _, p in pairs(spec.plugins) do
|
||||||
|
if p.optional then
|
||||||
|
optional[#optional + 1] = p.name
|
||||||
|
else
|
||||||
|
plugins[#plugins + 1] = p.name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(plugins)
|
||||||
|
table.sort(optional)
|
||||||
|
|
||||||
|
---@type LazyExtra
|
||||||
|
return {
|
||||||
|
source = source,
|
||||||
|
name = modname:sub(#source.module + 2),
|
||||||
|
module = modname,
|
||||||
|
enabled = enabled,
|
||||||
|
desc = require(modname).desc,
|
||||||
|
managed = vim.tbl_contains(Config.json.data.extras, modname) or not enabled,
|
||||||
|
plugins = plugins,
|
||||||
|
optional = optional,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
---@class LazyExtraView
|
||||||
|
---@field float LazyFloat
|
||||||
|
---@field text Text
|
||||||
|
---@field extras LazyExtra[]
|
||||||
|
---@field diag LazyDiagnostic[]
|
||||||
|
local X = {}
|
||||||
|
|
||||||
|
---@return LazyExtraView
|
||||||
|
function X.new()
|
||||||
|
local self = setmetatable({}, { __index = X })
|
||||||
|
self.float = Float.new({ title = "LazyVim Extras" })
|
||||||
|
self.float:on_key("x", function()
|
||||||
|
self:toggle()
|
||||||
|
end, "Toggle extra")
|
||||||
|
self.diag = {}
|
||||||
|
self:update()
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param diag LazyDiagnostic
|
||||||
|
function X:diagnostic(diag)
|
||||||
|
diag.row = diag.row or self.text:row()
|
||||||
|
diag.severity = diag.severity or vim.diagnostic.severity.INFO
|
||||||
|
table.insert(self.diag, diag)
|
||||||
|
end
|
||||||
|
|
||||||
|
function X:toggle()
|
||||||
|
local pos = vim.api.nvim_win_get_cursor(self.float.win)
|
||||||
|
for _, extra in ipairs(self.extras) do
|
||||||
|
if extra.row == pos[1] then
|
||||||
|
if not extra.managed then
|
||||||
|
Util.error(
|
||||||
|
"Not managed by LazyExtras. Remove from your config to enable/disable here.",
|
||||||
|
{ title = "LazyExtras" }
|
||||||
|
)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
extra.enabled = not extra.enabled
|
||||||
|
Config.json.data.extras = vim.tbl_filter(function(name)
|
||||||
|
return name ~= extra.module
|
||||||
|
end, Config.json.data.extras)
|
||||||
|
M.state = vim.tbl_filter(function(name)
|
||||||
|
return name ~= extra.module
|
||||||
|
end, M.state)
|
||||||
|
if extra.enabled then
|
||||||
|
table.insert(Config.json.data.extras, extra.module)
|
||||||
|
M.state[#M.state + 1] = extra.module
|
||||||
|
end
|
||||||
|
table.sort(Config.json.data.extras)
|
||||||
|
Util.json.save()
|
||||||
|
Util.info(
|
||||||
|
"`"
|
||||||
|
.. extra.name
|
||||||
|
.. "`"
|
||||||
|
.. " "
|
||||||
|
.. (extra.enabled and "**enabled**" or "**disabled**")
|
||||||
|
.. "\nPlease restart LazyVim to apply the changes.",
|
||||||
|
{ title = "LazyExtras" }
|
||||||
|
)
|
||||||
|
self:update()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function X:update()
|
||||||
|
self.diag = {}
|
||||||
|
self.extras = M.get()
|
||||||
|
self.text = Text.new()
|
||||||
|
self.text.padding = 2
|
||||||
|
self:render()
|
||||||
|
self.text:trim()
|
||||||
|
vim.bo[self.float.buf].modifiable = true
|
||||||
|
self.text:render(self.float.buf)
|
||||||
|
vim.bo[self.float.buf].modifiable = false
|
||||||
|
vim.diagnostic.set(
|
||||||
|
M.ns,
|
||||||
|
self.float.buf,
|
||||||
|
---@param diag LazyDiagnostic
|
||||||
|
vim.tbl_map(function(diag)
|
||||||
|
diag.col = 0
|
||||||
|
diag.lnum = diag.row - 1
|
||||||
|
return diag
|
||||||
|
end, self.diag),
|
||||||
|
{ signs = false, virtual_text = true }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
function X:render()
|
||||||
|
self.text:nl():nl():append("LazyVim Extras", "LazyH1"):nl():nl()
|
||||||
|
self.text
|
||||||
|
:append("This is a list of all enabled/disabled LazyVim extras.", "LazyComment")
|
||||||
|
:nl()
|
||||||
|
:append("Each extra shows the required and optional plugins it may install.", "LazyComment")
|
||||||
|
:nl()
|
||||||
|
:append("Enable/disable extras with the ", "LazyComment")
|
||||||
|
:append("<x>", "LazySpecial")
|
||||||
|
:append(" key", "LazyComment")
|
||||||
|
:nl()
|
||||||
|
self:section({ enabled = true, title = "Enabled" })
|
||||||
|
self:section({ enabled = false, title = "Disabled" })
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param extra LazyExtra
|
||||||
|
function X:extra(extra)
|
||||||
|
if not extra.managed then
|
||||||
|
self:diagnostic({
|
||||||
|
message = "Not managed by LazyExtras (config)",
|
||||||
|
severity = vim.diagnostic.severity.WARN,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
extra.row = self.text:row()
|
||||||
|
local hl = extra.managed and "LazySpecial" or "LazyLocal"
|
||||||
|
if extra.enabled then
|
||||||
|
self.text:append(" " .. LazyConfig.options.ui.icons.loaded .. " ", hl)
|
||||||
|
else
|
||||||
|
self.text:append(" " .. LazyConfig.options.ui.icons.not_loaded .. " ", hl)
|
||||||
|
end
|
||||||
|
self.text:append(extra.name)
|
||||||
|
if extra.source.name ~= "LazyVim" then
|
||||||
|
self.text:append(" "):append(LazyConfig.options.ui.icons.event .. " " .. extra.source.name, "LazyReasonEvent")
|
||||||
|
end
|
||||||
|
for _, plugin in ipairs(extra.plugins) do
|
||||||
|
self.text:append(" "):append(LazyConfig.options.ui.icons.plugin .. "" .. plugin, "LazyReasonPlugin")
|
||||||
|
end
|
||||||
|
for _, plugin in ipairs(extra.optional) do
|
||||||
|
self.text:append(" "):append(LazyConfig.options.ui.icons.plugin .. "" .. plugin, "LazyReasonRequire")
|
||||||
|
end
|
||||||
|
if extra.desc then
|
||||||
|
self.text:nl():append(" " .. extra.desc, "LazyComment")
|
||||||
|
end
|
||||||
|
self.text:nl()
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts {enabled?:boolean, title?:string}
|
||||||
|
function X:section(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
---@type LazyExtra[]
|
||||||
|
local extras = vim.tbl_filter(function(extra)
|
||||||
|
return opts.enabled == nil or extra.enabled == opts.enabled
|
||||||
|
end, self.extras)
|
||||||
|
|
||||||
|
self.text:nl():append(opts.title .. ":", "LazyH2"):append(" (" .. #extras .. ")", "LazyComment"):nl()
|
||||||
|
for _, extra in ipairs(extras) do
|
||||||
|
self:extra(extra)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.show()
|
||||||
|
return X.new()
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
173
lua/lazyvim/util/format.lua
Normal file
173
lua/lazyvim/util/format.lua
Normal file
|
|
@ -0,0 +1,173 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.format
|
||||||
|
---@overload fun(opts?: {force?:boolean})
|
||||||
|
local M = setmetatable({}, {
|
||||||
|
__call = function(m, ...)
|
||||||
|
return m.format(...)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
---@class LazyFormatter
|
||||||
|
---@field name string
|
||||||
|
---@field primary? boolean
|
||||||
|
---@field format fun(bufnr:number)
|
||||||
|
---@field sources fun(bufnr:number):string[]
|
||||||
|
---@field priority number
|
||||||
|
|
||||||
|
M.formatters = {} ---@type LazyFormatter[]
|
||||||
|
|
||||||
|
---@param formatter LazyFormatter
|
||||||
|
function M.register(formatter)
|
||||||
|
M.formatters[#M.formatters + 1] = formatter
|
||||||
|
table.sort(M.formatters, function(a, b)
|
||||||
|
return a.priority > b.priority
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.formatexpr()
|
||||||
|
if Util.has("conform.nvim") then
|
||||||
|
return require("conform").formatexpr()
|
||||||
|
end
|
||||||
|
return vim.lsp.formatexpr({ timeout_ms = 3000 })
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf? number
|
||||||
|
---@return (LazyFormatter|{active:boolean,resolved:string[]})[]
|
||||||
|
function M.resolve(buf)
|
||||||
|
buf = buf or vim.api.nvim_get_current_buf()
|
||||||
|
local have_primary = false
|
||||||
|
---@param formatter LazyFormatter
|
||||||
|
return vim.tbl_map(function(formatter)
|
||||||
|
local sources = formatter.sources(buf)
|
||||||
|
local active = #sources > 0 and (not formatter.primary or not have_primary)
|
||||||
|
have_primary = have_primary or (active and formatter.primary) or false
|
||||||
|
return setmetatable({
|
||||||
|
active = active,
|
||||||
|
resolved = sources,
|
||||||
|
}, { __index = formatter })
|
||||||
|
end, M.formatters)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf? number
|
||||||
|
function M.info(buf)
|
||||||
|
buf = buf or vim.api.nvim_get_current_buf()
|
||||||
|
local gaf = vim.g.autoformat == nil or vim.g.autoformat
|
||||||
|
local baf = vim.b[buf].autoformat
|
||||||
|
local enabled = M.enabled(buf)
|
||||||
|
local lines = {
|
||||||
|
"# Status",
|
||||||
|
("- [%s] global **%s**"):format(gaf and "x" or " ", gaf and "enabled" or "disabled"),
|
||||||
|
("- [%s] buffer **%s**"):format(
|
||||||
|
enabled and "x" or " ",
|
||||||
|
baf == nil and "inherit" or baf and "enabled" or "disabled"
|
||||||
|
),
|
||||||
|
}
|
||||||
|
local have = false
|
||||||
|
for _, formatter in ipairs(M.resolve(buf)) do
|
||||||
|
if #formatter.resolved > 0 then
|
||||||
|
have = true
|
||||||
|
lines[#lines + 1] = "\n# " .. formatter.name .. (formatter.active and " ***(active)***" or "")
|
||||||
|
for _, line in ipairs(formatter.resolved) do
|
||||||
|
lines[#lines + 1] = ("- [%s] **%s**"):format(formatter.active and "x" or " ", line)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not have then
|
||||||
|
lines[#lines + 1] = "\n***No formatters available for this buffer.***"
|
||||||
|
end
|
||||||
|
Util[enabled and "info" or "warn"](
|
||||||
|
table.concat(lines, "\n"),
|
||||||
|
{ title = "LazyFormat (" .. (enabled and "enabled" or "disabled") .. ")" }
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf? number
|
||||||
|
function M.enabled(buf)
|
||||||
|
buf = (buf == nil or buf == 0) and vim.api.nvim_get_current_buf() or buf
|
||||||
|
local gaf = vim.g.autoformat
|
||||||
|
local baf = vim.b[buf].autoformat
|
||||||
|
|
||||||
|
-- If the buffer has a local value, use that
|
||||||
|
if baf ~= nil then
|
||||||
|
return baf
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Otherwise use the global value if set, or true by default
|
||||||
|
return gaf == nil or gaf
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf? boolean
|
||||||
|
function M.toggle(buf)
|
||||||
|
if buf then
|
||||||
|
vim.b.autoformat = not M.enabled()
|
||||||
|
else
|
||||||
|
vim.g.autoformat = not M.enabled()
|
||||||
|
vim.b.autoformat = nil
|
||||||
|
end
|
||||||
|
M.info()
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? {force?:boolean, buf?:number}
|
||||||
|
function M.format(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
local buf = opts.buf or vim.api.nvim_get_current_buf()
|
||||||
|
if not ((opts and opts.force) or M.enabled(buf)) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local done = false
|
||||||
|
for _, formatter in ipairs(M.resolve(buf)) do
|
||||||
|
if formatter.active then
|
||||||
|
done = true
|
||||||
|
Util.try(function()
|
||||||
|
return formatter.format(buf)
|
||||||
|
end, { msg = "Formatter `" .. formatter.name .. "` failed" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if not done and opts and opts.force then
|
||||||
|
Util.warn("No formatter available", { title = "LazyVim" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.health()
|
||||||
|
local Config = require("lazy.core.config")
|
||||||
|
local has_plugin = Config.spec.plugins["none-ls.nvim"]
|
||||||
|
local has_extra = vim.tbl_contains(Config.spec.modules, "lazyvim.plugins.extras.lsp.none-ls")
|
||||||
|
if has_plugin and not has_extra then
|
||||||
|
Util.warn({
|
||||||
|
"`conform.nvim` and `nvim-lint` are now the default formatters and linters in LazyVim.",
|
||||||
|
"",
|
||||||
|
"You can use those plugins together with `none-ls.nvim`,",
|
||||||
|
"but you need to enable the `lazyvim.plugins.extras.lsp.none-ls` extra,",
|
||||||
|
"for formatting to work correctly.",
|
||||||
|
"",
|
||||||
|
"In case you no longer want to use `none-ls.nvim`, just remove the spec from your config.",
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
M.health()
|
||||||
|
|
||||||
|
-- Autoformat autocmd
|
||||||
|
vim.api.nvim_create_autocmd("BufWritePre", {
|
||||||
|
group = vim.api.nvim_create_augroup("LazyFormat", {}),
|
||||||
|
callback = function(event)
|
||||||
|
M.format({ buf = event.buf })
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- Manual format
|
||||||
|
vim.api.nvim_create_user_command("LazyFormat", function()
|
||||||
|
M.format({ force = true })
|
||||||
|
end, { desc = "Format selection or buffer" })
|
||||||
|
|
||||||
|
-- Format info
|
||||||
|
vim.api.nvim_create_user_command("LazyFormatInfo", function()
|
||||||
|
M.info()
|
||||||
|
end, { desc = "Show info about the formatters for the current buffer" })
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
|
|
@ -1,30 +1,61 @@
|
||||||
local Util = require("lazy.core.util")
|
local LazyUtil = require("lazy.core.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util: LazyUtilCore
|
||||||
|
---@field ui lazyvim.util.ui
|
||||||
|
---@field lsp lazyvim.util.lsp
|
||||||
|
---@field root lazyvim.util.root
|
||||||
|
---@field telescope lazyvim.util.telescope
|
||||||
|
---@field terminal lazyvim.util.terminal
|
||||||
|
---@field toggle lazyvim.util.toggle
|
||||||
|
---@field format lazyvim.util.format
|
||||||
|
---@field plugin lazyvim.util.plugin
|
||||||
|
---@field extras lazyvim.util.extras
|
||||||
|
---@field inject lazyvim.util.inject
|
||||||
|
---@field news lazyvim.util.news
|
||||||
|
---@field json lazyvim.util.json
|
||||||
|
---@field lualine lazyvim.util.lualine
|
||||||
local M = {}
|
local M = {}
|
||||||
|
|
||||||
M.root_patterns = { ".git", "lua" }
|
---@type table<string, string|string[]>
|
||||||
|
local deprecated = {
|
||||||
|
get_clients = "lsp",
|
||||||
|
on_attach = "lsp",
|
||||||
|
on_rename = "lsp",
|
||||||
|
root_patterns = { "root", "patterns" },
|
||||||
|
get_root = { "root", "get" },
|
||||||
|
float_term = { "terminal", "open" },
|
||||||
|
toggle_diagnostics = { "toggle", "diagnostics" },
|
||||||
|
toggle_number = { "toggle", "number" },
|
||||||
|
fg = "ui",
|
||||||
|
}
|
||||||
|
|
||||||
---@param on_attach fun(client, buffer)
|
setmetatable(M, {
|
||||||
function M.on_attach(on_attach)
|
__index = function(t, k)
|
||||||
vim.api.nvim_create_autocmd("LspAttach", {
|
if LazyUtil[k] then
|
||||||
callback = function(args)
|
return LazyUtil[k]
|
||||||
local buffer = args.buf
|
end
|
||||||
local client = vim.lsp.get_client_by_id(args.data.client_id)
|
local dep = deprecated[k]
|
||||||
on_attach(client, buffer)
|
if dep then
|
||||||
end,
|
local mod = type(dep) == "table" and dep[1] or dep
|
||||||
})
|
local key = type(dep) == "table" and dep[2] or k
|
||||||
|
M.deprecate([[require("lazyvim.util").]] .. k, [[require("lazyvim.util").]] .. mod .. "." .. key)
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
t[mod] = require("lazyvim.util." .. mod) -- load here to prevent loops
|
||||||
|
return t[mod][key]
|
||||||
|
end
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
t[k] = require("lazyvim.util." .. k)
|
||||||
|
return t[k]
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
function M.is_win()
|
||||||
|
return vim.loop.os_uname().sysname:find("Windows") ~= nil
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param plugin string
|
---@param plugin string
|
||||||
function M.has(plugin)
|
function M.has(plugin)
|
||||||
return require("lazy.core.config").plugins[plugin] ~= nil
|
return require("lazy.core.config").spec.plugins[plugin] ~= nil
|
||||||
end
|
|
||||||
|
|
||||||
function M.fg(name)
|
|
||||||
---@type {foreground?:number}?
|
|
||||||
local hl = vim.api.nvim_get_hl and vim.api.nvim_get_hl(0, { name = name }) or vim.api.nvim_get_hl_by_name(name, true)
|
|
||||||
local fg = hl and hl.fg or hl.foreground
|
|
||||||
return fg and { fg = string.format("#%06x", fg) }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param fn fun()
|
---@param fn fun()
|
||||||
|
|
@ -47,159 +78,13 @@ function M.opts(name)
|
||||||
return Plugin.values(plugin, "opts", false)
|
return Plugin.values(plugin, "opts", false)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- returns the root directory based on:
|
|
||||||
-- * lsp workspace folders
|
|
||||||
-- * lsp root_dir
|
|
||||||
-- * root pattern of filename of the current buffer
|
|
||||||
-- * root pattern of cwd
|
|
||||||
---@return string
|
|
||||||
function M.get_root()
|
|
||||||
---@type string?
|
|
||||||
local path = vim.api.nvim_buf_get_name(0)
|
|
||||||
path = path ~= "" and vim.loop.fs_realpath(path) or nil
|
|
||||||
---@type string[]
|
|
||||||
local roots = {}
|
|
||||||
if path then
|
|
||||||
for _, client in pairs(vim.lsp.get_active_clients({ bufnr = 0 })) do
|
|
||||||
local workspace = client.config.workspace_folders
|
|
||||||
local paths = workspace and vim.tbl_map(function(ws)
|
|
||||||
return vim.uri_to_fname(ws.uri)
|
|
||||||
end, workspace) or client.config.root_dir and { client.config.root_dir } or {}
|
|
||||||
for _, p in ipairs(paths) do
|
|
||||||
local r = vim.loop.fs_realpath(p)
|
|
||||||
if path:find(r, 1, true) then
|
|
||||||
roots[#roots + 1] = r
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(roots, function(a, b)
|
|
||||||
return #a > #b
|
|
||||||
end)
|
|
||||||
---@type string?
|
|
||||||
local root = roots[1]
|
|
||||||
if not root then
|
|
||||||
path = path and vim.fs.dirname(path) or vim.loop.cwd()
|
|
||||||
---@type string?
|
|
||||||
root = vim.fs.find(M.root_patterns, { path = path, upward = true })[1]
|
|
||||||
root = root and vim.fs.dirname(root) or vim.loop.cwd()
|
|
||||||
end
|
|
||||||
---@cast root string
|
|
||||||
return root
|
|
||||||
end
|
|
||||||
|
|
||||||
-- this will return a function that calls telescope.
|
|
||||||
-- cwd will default to lazyvim.util.get_root
|
|
||||||
-- for `files`, git_files or find_files will be chosen depending on .git
|
|
||||||
function M.telescope(builtin, opts)
|
|
||||||
local params = { builtin = builtin, opts = opts }
|
|
||||||
return function()
|
|
||||||
builtin = params.builtin
|
|
||||||
opts = params.opts
|
|
||||||
opts = vim.tbl_deep_extend("force", { cwd = M.get_root() }, opts or {})
|
|
||||||
if builtin == "files" then
|
|
||||||
if vim.loop.fs_stat((opts.cwd or vim.loop.cwd()) .. "/.git") then
|
|
||||||
opts.show_untracked = true
|
|
||||||
builtin = "git_files"
|
|
||||||
else
|
|
||||||
builtin = "find_files"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if opts.cwd and opts.cwd ~= vim.loop.cwd() then
|
|
||||||
opts.attach_mappings = function(_, map)
|
|
||||||
map("i", "<a-c>", function()
|
|
||||||
local action_state = require("telescope.actions.state")
|
|
||||||
local line = action_state.get_current_line()
|
|
||||||
M.telescope(
|
|
||||||
params.builtin,
|
|
||||||
vim.tbl_deep_extend("force", {}, params.opts or {}, { cwd = false, default_text = line })
|
|
||||||
)()
|
|
||||||
end)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
require("telescope.builtin")[builtin](opts)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
---@type table<string,LazyFloat>
|
|
||||||
local terminals = {}
|
|
||||||
|
|
||||||
-- Opens a floating terminal (interactive by default)
|
|
||||||
---@param cmd? string[]|string
|
|
||||||
---@param opts? LazyCmdOptions|{interactive?:boolean, esc_esc?:false, ctrl_hjkl?:false}
|
|
||||||
function M.float_term(cmd, opts)
|
|
||||||
opts = vim.tbl_deep_extend("force", {
|
|
||||||
ft = "lazyterm",
|
|
||||||
size = { width = 0.9, height = 0.9 },
|
|
||||||
}, opts or {}, { persistent = true })
|
|
||||||
---@cast opts LazyCmdOptions|{interactive?:boolean, esc_esc?:false}
|
|
||||||
|
|
||||||
local termkey = vim.inspect({ cmd = cmd or "shell", cwd = opts.cwd, env = opts.env, count = vim.v.count1 })
|
|
||||||
|
|
||||||
if terminals[termkey] and terminals[termkey]:buf_valid() then
|
|
||||||
terminals[termkey]:toggle()
|
|
||||||
else
|
|
||||||
terminals[termkey] = require("lazy.util").float_term(cmd, opts)
|
|
||||||
local buf = terminals[termkey].buf
|
|
||||||
vim.b[buf].lazyterm_cmd = cmd
|
|
||||||
if opts.esc_esc == false then
|
|
||||||
vim.keymap.set("t", "<esc>", "<esc>", { buffer = buf, nowait = true })
|
|
||||||
end
|
|
||||||
if opts.ctrl_hjkl == false then
|
|
||||||
vim.keymap.set("t", "<c-h>", "<c-h>", { buffer = buf, nowait = true })
|
|
||||||
vim.keymap.set("t", "<c-j>", "<c-j>", { buffer = buf, nowait = true })
|
|
||||||
vim.keymap.set("t", "<c-k>", "<c-k>", { buffer = buf, nowait = true })
|
|
||||||
vim.keymap.set("t", "<c-l>", "<c-l>", { buffer = buf, nowait = true })
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd("BufEnter", {
|
|
||||||
buffer = buf,
|
|
||||||
callback = function()
|
|
||||||
vim.cmd.startinsert()
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
return terminals[termkey]
|
|
||||||
end
|
|
||||||
|
|
||||||
---@param silent boolean?
|
|
||||||
---@param values? {[1]:any, [2]:any}
|
|
||||||
function M.toggle(option, silent, values)
|
|
||||||
if values then
|
|
||||||
if vim.opt_local[option]:get() == values[1] then
|
|
||||||
vim.opt_local[option] = values[2]
|
|
||||||
else
|
|
||||||
vim.opt_local[option] = values[1]
|
|
||||||
end
|
|
||||||
return Util.info("Set " .. option .. " to " .. vim.opt_local[option]:get(), { title = "Option" })
|
|
||||||
end
|
|
||||||
vim.opt_local[option] = not vim.opt_local[option]:get()
|
|
||||||
if not silent then
|
|
||||||
if vim.opt_local[option]:get() then
|
|
||||||
Util.info("Enabled " .. option, { title = "Option" })
|
|
||||||
else
|
|
||||||
Util.warn("Disabled " .. option, { title = "Option" })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local enabled = true
|
|
||||||
function M.toggle_diagnostics()
|
|
||||||
enabled = not enabled
|
|
||||||
if enabled then
|
|
||||||
vim.diagnostic.enable()
|
|
||||||
Util.info("Enabled diagnostics", { title = "Diagnostics" })
|
|
||||||
else
|
|
||||||
vim.diagnostic.disable()
|
|
||||||
Util.warn("Disabled diagnostics", { title = "Diagnostics" })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function M.deprecate(old, new)
|
function M.deprecate(old, new)
|
||||||
Util.warn(("`%s` is deprecated. Please use `%s` instead"):format(old, new), { title = "LazyVim" })
|
M.warn(("`%s` is deprecated. Please use `%s` instead"):format(old, new), {
|
||||||
|
title = "LazyVim",
|
||||||
|
once = true,
|
||||||
|
stacktrace = true,
|
||||||
|
stacklevel = 6,
|
||||||
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
-- delay notifications till vim.notify was replaced or after 500ms
|
-- delay notifications till vim.notify was replaced or after 500ms
|
||||||
|
|
@ -213,7 +98,7 @@ function M.lazy_notify()
|
||||||
vim.notify = temp
|
vim.notify = temp
|
||||||
|
|
||||||
local timer = vim.loop.new_timer()
|
local timer = vim.loop.new_timer()
|
||||||
local check = vim.loop.new_check()
|
local check = assert(vim.loop.new_check())
|
||||||
|
|
||||||
local replay = function()
|
local replay = function()
|
||||||
timer:stop()
|
timer:stop()
|
||||||
|
|
@ -239,21 +124,48 @@ function M.lazy_notify()
|
||||||
timer:start(500, 0, replay)
|
timer:start(500, 0, replay)
|
||||||
end
|
end
|
||||||
|
|
||||||
function M.lsp_get_config(server)
|
---@param name string
|
||||||
local configs = require("lspconfig.configs")
|
---@param fn fun(name:string)
|
||||||
return rawget(configs, server)
|
function M.on_load(name, fn)
|
||||||
|
local Config = require("lazy.core.config")
|
||||||
|
if Config.plugins[name] and Config.plugins[name]._.loaded then
|
||||||
|
fn(name)
|
||||||
|
else
|
||||||
|
vim.api.nvim_create_autocmd("User", {
|
||||||
|
pattern = "LazyLoad",
|
||||||
|
callback = function(event)
|
||||||
|
if event.data == name then
|
||||||
|
fn(name)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param server string
|
-- Wrapper around vim.keymap.set that will
|
||||||
---@param cond fun( root_dir, config): boolean
|
-- not create a keymap if a lazy key handler exists.
|
||||||
function M.lsp_disable(server, cond)
|
-- It will also set `silent` to true by default.
|
||||||
local util = require("lspconfig.util")
|
function M.safe_keymap_set(mode, lhs, rhs, opts)
|
||||||
local def = M.lsp_get_config(server)
|
local keys = require("lazy.core.handler").handlers.keys
|
||||||
def.document_config.on_new_config = util.add_hook_before(def.document_config.on_new_config, function(config, root_dir)
|
---@cast keys LazyKeysHandler
|
||||||
if cond(root_dir, config) then
|
local modes = type(mode) == "string" and { mode } or mode
|
||||||
config.enabled = false
|
|
||||||
|
---@param m string
|
||||||
|
modes = vim.tbl_filter(function(m)
|
||||||
|
return not (keys.have and keys:have(lhs, m))
|
||||||
|
end, modes)
|
||||||
|
|
||||||
|
-- do not create the keymap if a lazy keys handler exists
|
||||||
|
if #modes > 0 then
|
||||||
|
opts = opts or {}
|
||||||
|
opts.silent = opts.silent ~= false
|
||||||
|
if opts.remap and not vim.g.vscode then
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
opts.remap = nil
|
||||||
end
|
end
|
||||||
end)
|
vim.keymap.set(modes, lhs, rhs, opts)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
|
|
||||||
34
lua/lazyvim/util/inject.lua
Normal file
34
lua/lazyvim/util/inject.lua
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
---@class lazyvim.util.inject
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@generic A: any
|
||||||
|
---@generic B: any
|
||||||
|
---@generic C: any
|
||||||
|
---@generic F: function
|
||||||
|
---@param fn F|fun(a:A, b:B, c:C)
|
||||||
|
---@param wrapper fun(a:A, b:B, c:C): boolean?
|
||||||
|
---@return F
|
||||||
|
function M.args(fn, wrapper)
|
||||||
|
return function(...)
|
||||||
|
if wrapper(...) == false then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return fn(...)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.get_upvalue(func, name)
|
||||||
|
local i = 1
|
||||||
|
while true do
|
||||||
|
local n, v = debug.getupvalue(func, i)
|
||||||
|
if not n then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
if n == name then
|
||||||
|
return v
|
||||||
|
end
|
||||||
|
i = i + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
82
lua/lazyvim/util/json.lua
Normal file
82
lua/lazyvim/util/json.lua
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.json
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@param value any
|
||||||
|
---@param indent string
|
||||||
|
local function encode(value, indent)
|
||||||
|
local t = type(value)
|
||||||
|
|
||||||
|
if t == "string" then
|
||||||
|
return string.format("%q", value)
|
||||||
|
elseif t == "number" or t == "boolean" then
|
||||||
|
return tostring(value)
|
||||||
|
elseif t == "table" then
|
||||||
|
local is_list = Util.is_list(value)
|
||||||
|
local parts = {}
|
||||||
|
local next_indent = indent .. " "
|
||||||
|
|
||||||
|
if is_list then
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
for _, v in ipairs(value) do
|
||||||
|
local e = encode(v, next_indent)
|
||||||
|
if e then
|
||||||
|
table.insert(parts, next_indent .. e)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return "[\n" .. table.concat(parts, ",\n") .. "\n" .. indent .. "]"
|
||||||
|
else
|
||||||
|
local keys = vim.tbl_keys(value)
|
||||||
|
table.sort(keys)
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
for _, k in ipairs(keys) do
|
||||||
|
local e = encode(value[k], next_indent)
|
||||||
|
if e then
|
||||||
|
table.insert(parts, next_indent .. string.format("%q", k) .. ": " .. e)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return "{\n" .. table.concat(parts, ",\n") .. "\n" .. indent .. "}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.encode(value)
|
||||||
|
return encode(value, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.save()
|
||||||
|
Config.json.data.version = Config.json.version
|
||||||
|
local path = vim.fn.stdpath("config") .. "/lazyvim.json"
|
||||||
|
local f = io.open(path, "w")
|
||||||
|
if f then
|
||||||
|
f:write(Util.json.encode(Config.json.data))
|
||||||
|
f:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.migrate()
|
||||||
|
Util.info("Migrating `lazyvim.json` to version `" .. Config.json.version .. "`")
|
||||||
|
local json = Config.json
|
||||||
|
|
||||||
|
-- v0
|
||||||
|
if not json.data.version then
|
||||||
|
if json.data.hashes then
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
json.data.hashes = nil
|
||||||
|
end
|
||||||
|
json.data.extras = vim.tbl_map(function(extra)
|
||||||
|
return "lazyvim.plugins.extras." .. extra
|
||||||
|
end, json.data.extras or {})
|
||||||
|
elseif json.data.version == 1 then
|
||||||
|
json.data.extras = vim.tbl_map(function(extra)
|
||||||
|
-- replace double extras module name
|
||||||
|
return extra:gsub("^lazyvim%.plugins%.extras%.lazyvim%.plugins%.extras%.", "lazyvim.plugins.extras.")
|
||||||
|
end, json.data.extras or {})
|
||||||
|
end
|
||||||
|
|
||||||
|
M.save()
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
125
lua/lazyvim/util/lsp.lua
Normal file
125
lua/lazyvim/util/lsp.lua
Normal file
|
|
@ -0,0 +1,125 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.lsp
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@alias lsp.Client.filter {id?: number, bufnr?: number, name?: string, method?: string, filter?:fun(client: lsp.Client):boolean}
|
||||||
|
|
||||||
|
---@param opts? lsp.Client.filter
|
||||||
|
function M.get_clients(opts)
|
||||||
|
local ret = {} ---@type lsp.Client[]
|
||||||
|
if vim.lsp.get_clients then
|
||||||
|
ret = vim.lsp.get_clients(opts)
|
||||||
|
else
|
||||||
|
---@diagnostic disable-next-line: deprecated
|
||||||
|
ret = vim.lsp.get_active_clients(opts)
|
||||||
|
if opts and opts.method then
|
||||||
|
---@param client lsp.Client
|
||||||
|
ret = vim.tbl_filter(function(client)
|
||||||
|
return client.supports_method(opts.method, { bufnr = opts.bufnr })
|
||||||
|
end, ret)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return opts and opts.filter and vim.tbl_filter(opts.filter, ret) or ret
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param on_attach fun(client, buffer)
|
||||||
|
function M.on_attach(on_attach)
|
||||||
|
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)
|
||||||
|
on_attach(client, buffer)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param from string
|
||||||
|
---@param to string
|
||||||
|
function M.on_rename(from, to)
|
||||||
|
local clients = M.get_clients()
|
||||||
|
for _, client in ipairs(clients) do
|
||||||
|
if client.supports_method("workspace/willRenameFiles") then
|
||||||
|
---@diagnostic disable-next-line: invisible
|
||||||
|
local resp = client.request_sync("workspace/willRenameFiles", {
|
||||||
|
files = {
|
||||||
|
{
|
||||||
|
oldUri = vim.uri_from_fname(from),
|
||||||
|
newUri = vim.uri_from_fname(to),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, 1000, 0)
|
||||||
|
if resp and resp.result ~= nil then
|
||||||
|
vim.lsp.util.apply_workspace_edit(resp.result, client.offset_encoding)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@return _.lspconfig.options
|
||||||
|
function M.get_config(server)
|
||||||
|
local configs = require("lspconfig.configs")
|
||||||
|
return rawget(configs, server)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param server string
|
||||||
|
---@param cond fun( root_dir, config): boolean
|
||||||
|
function M.disable(server, cond)
|
||||||
|
local util = require("lspconfig.util")
|
||||||
|
local def = M.get_config(server)
|
||||||
|
---@diagnostic disable-next-line: undefined-field
|
||||||
|
def.document_config.on_new_config = util.add_hook_before(def.document_config.on_new_config, function(config, root_dir)
|
||||||
|
if cond(root_dir, config) then
|
||||||
|
config.enabled = false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? LazyFormatter| {filter?: (string|lsp.Client.filter)}
|
||||||
|
function M.formatter(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
local filter = opts.filter or {}
|
||||||
|
filter = type(filter) == "string" and { name = filter } or filter
|
||||||
|
---@cast filter lsp.Client.filter
|
||||||
|
---@type LazyFormatter
|
||||||
|
local ret = {
|
||||||
|
name = "LSP",
|
||||||
|
primary = true,
|
||||||
|
priority = 1,
|
||||||
|
format = function(buf)
|
||||||
|
M.format(Util.merge(filter, { bufnr = buf }))
|
||||||
|
end,
|
||||||
|
sources = function(buf)
|
||||||
|
local clients = M.get_clients(Util.merge(filter, { bufnr = buf }))
|
||||||
|
---@param client lsp.Client
|
||||||
|
local ret = vim.tbl_filter(function(client)
|
||||||
|
return client.supports_method("textDocument/formatting")
|
||||||
|
or client.supports_method("textDocument/rangeFormatting")
|
||||||
|
end, clients)
|
||||||
|
---@param client lsp.Client
|
||||||
|
return vim.tbl_map(function(client)
|
||||||
|
return client.name
|
||||||
|
end, ret)
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
return Util.merge(ret, opts) --[[@as LazyFormatter]]
|
||||||
|
end
|
||||||
|
|
||||||
|
---@alias lsp.Client.format {timeout_ms?: number, format_options?: table} | lsp.Client.filter
|
||||||
|
|
||||||
|
---@param opts? lsp.Client.format
|
||||||
|
function M.format(opts)
|
||||||
|
opts = vim.tbl_deep_extend("force", {}, opts or {}, require("lazyvim.util").opts("nvim-lspconfig").format or {})
|
||||||
|
local ok, conform = pcall(require, "conform")
|
||||||
|
-- use conform for formatting with LSP when available,
|
||||||
|
-- since it has better format diffing
|
||||||
|
if ok then
|
||||||
|
opts.formatters = {}
|
||||||
|
opts.lsp_fallback = true
|
||||||
|
conform.format(opts)
|
||||||
|
else
|
||||||
|
vim.lsp.buf.format(opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
143
lua/lazyvim/util/lualine.lua
Normal file
143
lua/lazyvim/util/lualine.lua
Normal file
|
|
@ -0,0 +1,143 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.lualine
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M.cmp_source(name, icon)
|
||||||
|
local started = false
|
||||||
|
local function status()
|
||||||
|
if not package.loaded["cmp"] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
for _, s in ipairs(require("cmp").core.sources) do
|
||||||
|
if s.name == name then
|
||||||
|
if s.source:is_available() then
|
||||||
|
started = true
|
||||||
|
else
|
||||||
|
return started and "error" or nil
|
||||||
|
end
|
||||||
|
if s.status == s.SourceStatus.FETCHING then
|
||||||
|
return "pending"
|
||||||
|
end
|
||||||
|
return "ok"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local colors = {
|
||||||
|
ok = Util.ui.fg("Special"),
|
||||||
|
error = Util.ui.fg("DiagnosticError"),
|
||||||
|
pending = Util.ui.fg("DiagnosticWarn"),
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
function()
|
||||||
|
return icon or require("lazyvim.config").icons.kinds[name:sub(1, 1):upper() .. name:sub(2)]
|
||||||
|
end,
|
||||||
|
cond = function()
|
||||||
|
return status() ~= nil
|
||||||
|
end,
|
||||||
|
color = function()
|
||||||
|
return colors[status()] or colors.ok
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param component any
|
||||||
|
---@param text string
|
||||||
|
---@param hl_group? string
|
||||||
|
---@return string
|
||||||
|
function M.format(component, text, hl_group)
|
||||||
|
if not hl_group then
|
||||||
|
return text
|
||||||
|
end
|
||||||
|
---@type table<string, string>
|
||||||
|
component.hl_cache = component.hl_cache or {}
|
||||||
|
local lualine_hl_group = component.hl_cache[hl_group]
|
||||||
|
if not lualine_hl_group then
|
||||||
|
local utils = require("lualine.utils.utils")
|
||||||
|
lualine_hl_group = component:create_hl({ fg = utils.extract_highlight_colors(hl_group, "fg") }, "LV_" .. hl_group)
|
||||||
|
component.hl_cache[hl_group] = lualine_hl_group
|
||||||
|
end
|
||||||
|
return component:format_hl(lualine_hl_group) .. text .. component:get_default_hl()
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? {relative: "cwd"|"root", modified_hl: string?}
|
||||||
|
function M.pretty_path(opts)
|
||||||
|
opts = vim.tbl_extend("force", {
|
||||||
|
relative = "cwd",
|
||||||
|
modified_hl = "Constant",
|
||||||
|
}, opts or {})
|
||||||
|
|
||||||
|
return function(self)
|
||||||
|
local path = vim.fn.expand("%:p") --[[@as string]]
|
||||||
|
|
||||||
|
if path == "" then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
local root = Util.root.get({ normalize = true })
|
||||||
|
local cwd = Util.root.cwd()
|
||||||
|
|
||||||
|
if opts.relative == "cwd" and path:find(cwd, 1, true) == 1 then
|
||||||
|
path = path:sub(#cwd + 2)
|
||||||
|
else
|
||||||
|
path = path:sub(#root + 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
local sep = package.config:sub(1, 1)
|
||||||
|
local parts = vim.split(path, "[\\/]")
|
||||||
|
if #parts > 3 then
|
||||||
|
parts = { parts[1], "…", parts[#parts - 1], parts[#parts] }
|
||||||
|
end
|
||||||
|
|
||||||
|
if opts.modified_hl and vim.bo.modified then
|
||||||
|
parts[#parts] = M.format(self, parts[#parts], opts.modified_hl)
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(parts, sep)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? {cwd:false, subdirectory: true, parent: true, other: true, icon?:string}
|
||||||
|
function M.root_dir(opts)
|
||||||
|
opts = vim.tbl_extend("force", {
|
||||||
|
cwd = false,
|
||||||
|
subdirectory = true,
|
||||||
|
parent = true,
|
||||||
|
other = true,
|
||||||
|
icon = " ",
|
||||||
|
color = Util.ui.fg("Special"),
|
||||||
|
}, opts or {})
|
||||||
|
|
||||||
|
local function get()
|
||||||
|
local cwd = Util.root.cwd()
|
||||||
|
local root = Util.root.get({ normalize = true })
|
||||||
|
local name = vim.fs.basename(root)
|
||||||
|
|
||||||
|
if root == cwd then
|
||||||
|
-- root is cwd
|
||||||
|
return opts.cwd and name
|
||||||
|
elseif root:find(cwd, 1, true) == 1 then
|
||||||
|
-- root is subdirectory of cwd
|
||||||
|
return opts.subdirectory and name
|
||||||
|
elseif cwd:find(root, 1, true) == 1 then
|
||||||
|
-- root is parent directory of cwd
|
||||||
|
return opts.parent and name
|
||||||
|
else
|
||||||
|
-- root and cwd are not related
|
||||||
|
return opts.other and name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
function()
|
||||||
|
return (opts.icon and opts.icon .. " ") .. get()
|
||||||
|
end,
|
||||||
|
cond = function()
|
||||||
|
return type(get()) == "string"
|
||||||
|
end,
|
||||||
|
color = opts.color,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
90
lua/lazyvim/util/news.lua
Normal file
90
lua/lazyvim/util/news.lua
Normal file
|
|
@ -0,0 +1,90 @@
|
||||||
|
local Config = require("lazyvim.config")
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.news
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
function M.hash(file)
|
||||||
|
local stat = vim.loop.fs_stat(file)
|
||||||
|
if not stat then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return stat.size .. ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
vim.schedule(function()
|
||||||
|
if Config.news.lazyvim then
|
||||||
|
if not Config.json.data.news["NEWS.md"] then
|
||||||
|
M.welcome()
|
||||||
|
end
|
||||||
|
M.lazyvim(true)
|
||||||
|
end
|
||||||
|
if Config.news.neovim then
|
||||||
|
M.neovim(true)
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.welcome()
|
||||||
|
Util.info("Welcome to LazyVim!")
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.changelog()
|
||||||
|
M.open("CHANGELOG.md", { plugin = "LazyVim" })
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.lazyvim(when_changed)
|
||||||
|
M.open("NEWS.md", { plugin = "LazyVim", when_changed = when_changed })
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.neovim(when_changed)
|
||||||
|
M.open("doc/news.txt", { rtp = true, when_changed = when_changed })
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param file string
|
||||||
|
---@param opts? {plugin?:string, rtp?:boolean, when_changed?:boolean}
|
||||||
|
function M.open(file, opts)
|
||||||
|
local ref = file
|
||||||
|
opts = opts or {}
|
||||||
|
if opts.plugin then
|
||||||
|
local plugin = require("lazy.core.config").plugins[opts.plugin] --[[@as LazyPlugin?]]
|
||||||
|
if not plugin then
|
||||||
|
return Util.error("plugin not found: " .. opts.plugin)
|
||||||
|
end
|
||||||
|
file = plugin.dir .. "/" .. file
|
||||||
|
elseif opts.rtp then
|
||||||
|
file = vim.api.nvim_get_runtime_file(file, false)[1]
|
||||||
|
end
|
||||||
|
|
||||||
|
if not file then
|
||||||
|
return Util.error("File not found")
|
||||||
|
end
|
||||||
|
|
||||||
|
if opts.when_changed then
|
||||||
|
local is_new = not Config.json.data.news[ref]
|
||||||
|
local hash = M.hash(file)
|
||||||
|
if hash == Config.json.data.news[ref] then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
Config.json.data.news[ref] = hash
|
||||||
|
Util.json.save()
|
||||||
|
-- don't open if file has never been opened
|
||||||
|
if is_new then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local float = require("lazy.util").float({
|
||||||
|
file = file,
|
||||||
|
size = { width = 0.6, height = 0.6 },
|
||||||
|
})
|
||||||
|
vim.opt_local.spell = false
|
||||||
|
vim.opt_local.wrap = false
|
||||||
|
vim.opt_local.signcolumn = "yes"
|
||||||
|
vim.opt_local.statuscolumn = " "
|
||||||
|
vim.opt_local.conceallevel = 3
|
||||||
|
vim.diagnostic.disable(float.buf)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
156
lua/lazyvim/util/plugin.lua
Normal file
156
lua/lazyvim/util/plugin.lua
Normal file
|
|
@ -0,0 +1,156 @@
|
||||||
|
local Plugin = require("lazy.core.plugin")
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.plugin
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
M.use_lazy_file = true
|
||||||
|
M.lazy_file_events = { "BufReadPost", "BufNewFile", "BufWritePre" }
|
||||||
|
|
||||||
|
---@type table<string, string>
|
||||||
|
M.deprecated_extras = {
|
||||||
|
["lazyvim.plugins.extras.formatting.conform"] = "`conform.nvim` is now the default **LazyVim** formatter.",
|
||||||
|
["lazyvim.plugins.extras.linting.nvim-lint"] = "`nvim-lint` is now the default **LazyVim** linter.",
|
||||||
|
["lazyvim.plugins.extras.ui.dashboard"] = "`dashboard.nvim` is now the default **LazyVim** starter.",
|
||||||
|
}
|
||||||
|
|
||||||
|
M.deprecated_modules = {
|
||||||
|
["null-ls"] = "lsp.none-ls",
|
||||||
|
["nvim-navic.lib"] = "editor.navic",
|
||||||
|
["nvim-navic"] = "editor.navic",
|
||||||
|
}
|
||||||
|
|
||||||
|
---@type table<string, string>
|
||||||
|
M.renames = {
|
||||||
|
["windwp/nvim-spectre"] = "nvim-pack/nvim-spectre",
|
||||||
|
["jose-elias-alvarez/null-ls.nvim"] = "nvimtools/none-ls.nvim",
|
||||||
|
["null-ls.nvim"] = "none-ls.nvim",
|
||||||
|
["romgrk/nvim-treesitter-context"] = "nvim-treesitter/nvim-treesitter-context",
|
||||||
|
["glepnir/dashboard-nvim"] = "nvimdev/dashboard-nvim",
|
||||||
|
}
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
M.fix_imports()
|
||||||
|
M.fix_renames()
|
||||||
|
M.lazy_file()
|
||||||
|
table.insert(package.loaders, function(module)
|
||||||
|
if M.deprecated_modules[module] then
|
||||||
|
Util.warn(
|
||||||
|
("`%s` is no longer included by default in **LazyVim**.\nPlease install the `%s` extra if you still want to use it."):format(
|
||||||
|
module,
|
||||||
|
M.deprecated_modules[module]
|
||||||
|
),
|
||||||
|
{ title = "LazyVim" }
|
||||||
|
)
|
||||||
|
return function() end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.extra_idx(name)
|
||||||
|
local Config = require("lazy.core.config")
|
||||||
|
for i, extra in ipairs(Config.spec.modules) do
|
||||||
|
if extra == "lazyvim.plugins.extras." .. name then
|
||||||
|
return i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Properly load file based plugins without blocking the UI
|
||||||
|
function M.lazy_file()
|
||||||
|
M.use_lazy_file = M.use_lazy_file and vim.fn.argc(-1) > 0
|
||||||
|
|
||||||
|
-- Add support for the LazyFile event
|
||||||
|
local Event = require("lazy.core.handler.event")
|
||||||
|
|
||||||
|
if M.use_lazy_file then
|
||||||
|
-- We'll handle delayed execution of events ourselves
|
||||||
|
Event.mappings.LazyFile = { id = "LazyFile", event = "User", pattern = "LazyFile" }
|
||||||
|
Event.mappings["User LazyFile"] = Event.mappings.LazyFile
|
||||||
|
else
|
||||||
|
-- Don't delay execution of LazyFile events, but let lazy know about the mapping
|
||||||
|
Event.mappings.LazyFile = { id = "LazyFile", event = { "BufReadPost", "BufNewFile", "BufWritePre" } }
|
||||||
|
Event.mappings["User LazyFile"] = Event.mappings.LazyFile
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local events = {} ---@type {event: string, buf: number, data?: any}[]
|
||||||
|
|
||||||
|
local done = false
|
||||||
|
local function load()
|
||||||
|
if #events == 0 or done then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
done = true
|
||||||
|
vim.api.nvim_del_augroup_by_name("lazy_file")
|
||||||
|
|
||||||
|
---@type table<string,string[]>
|
||||||
|
local skips = {}
|
||||||
|
for _, event in ipairs(events) do
|
||||||
|
skips[event.event] = skips[event.event] or Event.get_augroups(event.event)
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_exec_autocmds("User", { pattern = "LazyFile", modeline = false })
|
||||||
|
for _, event in ipairs(events) do
|
||||||
|
if vim.api.nvim_buf_is_valid(event.buf) then
|
||||||
|
Event.trigger({
|
||||||
|
event = event.event,
|
||||||
|
exclude = skips[event.event],
|
||||||
|
data = event.data,
|
||||||
|
buf = event.buf,
|
||||||
|
})
|
||||||
|
if vim.bo[event.buf].filetype then
|
||||||
|
Event.trigger({
|
||||||
|
event = "FileType",
|
||||||
|
buf = event.buf,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
vim.api.nvim_exec_autocmds("CursorMoved", { modeline = false })
|
||||||
|
events = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- schedule wrap so that nested autocmds are executed
|
||||||
|
-- and the UI can continue rendering without blocking
|
||||||
|
load = vim.schedule_wrap(load)
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd(M.lazy_file_events, {
|
||||||
|
group = vim.api.nvim_create_augroup("lazy_file", { clear = true }),
|
||||||
|
callback = function(event)
|
||||||
|
table.insert(events, event)
|
||||||
|
load()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.fix_imports()
|
||||||
|
Plugin.Spec.import = Util.inject.args(Plugin.Spec.import, function(_, spec)
|
||||||
|
local dep = M.deprecated_extras[spec and spec.import]
|
||||||
|
if dep then
|
||||||
|
dep = dep .. "\n" .. "Please remove the extra to hide this warning."
|
||||||
|
Util.warn(dep, { title = "LazyVim", once = true, stacktrace = true, stacklevel = 6 })
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.fix_renames()
|
||||||
|
Plugin.Spec.add = Util.inject.args(Plugin.Spec.add, function(self, plugin)
|
||||||
|
if type(plugin) == "table" then
|
||||||
|
if M.renames[plugin[1]] then
|
||||||
|
Util.warn(
|
||||||
|
("Plugin `%s` was renamed to `%s`.\nPlease update your config for `%s`"):format(
|
||||||
|
plugin[1],
|
||||||
|
M.renames[plugin[1]],
|
||||||
|
self.importing or "LazyVim"
|
||||||
|
),
|
||||||
|
{ title = "LazyVim" }
|
||||||
|
)
|
||||||
|
plugin[1] = M.renames[plugin[1]]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
181
lua/lazyvim/util/root.lua
Normal file
181
lua/lazyvim/util/root.lua
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.root
|
||||||
|
---@overload fun(): string
|
||||||
|
local M = setmetatable({}, {
|
||||||
|
__call = function(m)
|
||||||
|
return m.get()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
---@class LazyRoot
|
||||||
|
---@field paths string[]
|
||||||
|
---@field spec LazyRootSpec
|
||||||
|
|
||||||
|
---@alias LazyRootFn fun(buf: number): (string|string[])
|
||||||
|
|
||||||
|
---@alias LazyRootSpec string|string[]|LazyRootFn
|
||||||
|
|
||||||
|
---@type LazyRootSpec[]
|
||||||
|
M.spec = { "lsp", { ".git", "lua" }, "cwd" }
|
||||||
|
|
||||||
|
M.detectors = {}
|
||||||
|
|
||||||
|
function M.detectors.cwd()
|
||||||
|
return { vim.loop.cwd() }
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.detectors.lsp(buf)
|
||||||
|
local bufpath = M.bufpath(buf)
|
||||||
|
if not bufpath then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
local roots = {} ---@type string[]
|
||||||
|
for _, client in pairs(Util.lsp.get_clients({ bufnr = buf })) do
|
||||||
|
-- only check workspace folders, since we're not interested in clients
|
||||||
|
-- running in single file mode
|
||||||
|
local workspace = client.config.workspace_folders
|
||||||
|
for _, ws in pairs(workspace or {}) do
|
||||||
|
roots[#roots + 1] = vim.uri_to_fname(ws.uri)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return vim.tbl_filter(function(path)
|
||||||
|
path = Util.norm(path)
|
||||||
|
return path and bufpath:find(path, 1, true) == 1
|
||||||
|
end, roots)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param patterns string[]|string
|
||||||
|
function M.detectors.pattern(buf, patterns)
|
||||||
|
patterns = type(patterns) == "string" and { patterns } or patterns
|
||||||
|
local path = M.bufpath(buf) or vim.loop.cwd()
|
||||||
|
local pattern = vim.fs.find(patterns, { path = path, upward = true })[1]
|
||||||
|
return pattern and { vim.fs.dirname(pattern) } or {}
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.bufpath(buf)
|
||||||
|
return M.realpath(vim.api.nvim_buf_get_name(assert(buf)))
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.cwd()
|
||||||
|
return M.realpath(vim.loop.cwd()) or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.realpath(path)
|
||||||
|
if path == "" or path == nil then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
path = vim.loop.fs_realpath(path) or path
|
||||||
|
return Util.norm(path)
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param spec LazyRootSpec
|
||||||
|
---@return LazyRootFn
|
||||||
|
function M.resolve(spec)
|
||||||
|
if M.detectors[spec] then
|
||||||
|
return M.detectors[spec]
|
||||||
|
elseif type(spec) == "function" then
|
||||||
|
return spec
|
||||||
|
end
|
||||||
|
return function(buf)
|
||||||
|
return M.detectors.pattern(buf, spec)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? { buf?: number, spec?: LazyRootSpec[], all?: boolean }
|
||||||
|
function M.detect(opts)
|
||||||
|
opts = opts or {}
|
||||||
|
opts.spec = opts.spec or type(vim.g.root_spec) == "table" and vim.g.root_spec or M.spec
|
||||||
|
opts.buf = (opts.buf == nil or opts.buf == 0) and vim.api.nvim_get_current_buf() or opts.buf
|
||||||
|
|
||||||
|
local ret = {} ---@type LazyRoot[]
|
||||||
|
for _, spec in ipairs(opts.spec) do
|
||||||
|
local paths = M.resolve(spec)(opts.buf)
|
||||||
|
paths = paths or {}
|
||||||
|
paths = type(paths) == "table" and paths or { paths }
|
||||||
|
local roots = {} ---@type string[]
|
||||||
|
for _, p in ipairs(paths) do
|
||||||
|
local pp = M.realpath(p)
|
||||||
|
if pp and not vim.tbl_contains(roots, pp) then
|
||||||
|
roots[#roots + 1] = pp
|
||||||
|
end
|
||||||
|
end
|
||||||
|
table.sort(roots, function(a, b)
|
||||||
|
return #a > #b
|
||||||
|
end)
|
||||||
|
if #roots > 0 then
|
||||||
|
ret[#ret + 1] = { spec = spec, paths = roots }
|
||||||
|
if opts.all == false then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.info()
|
||||||
|
local spec = type(vim.g.root_spec) == "table" and vim.g.root_spec or M.spec
|
||||||
|
|
||||||
|
local roots = M.detect({ all = true })
|
||||||
|
local lines = {} ---@type string[]
|
||||||
|
local first = true
|
||||||
|
for _, root in ipairs(roots) do
|
||||||
|
for _, path in ipairs(root.paths) do
|
||||||
|
lines[#lines + 1] = ("- [%s] `%s` **(%s)**"):format(
|
||||||
|
first and "x" or " ",
|
||||||
|
path,
|
||||||
|
type(root.spec) == "table" and table.concat(root.spec, ", ") or root.spec
|
||||||
|
)
|
||||||
|
first = false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
lines[#lines + 1] = "```lua"
|
||||||
|
lines[#lines + 1] = "vim.g.root_spec = " .. vim.inspect(spec)
|
||||||
|
lines[#lines + 1] = "```"
|
||||||
|
require("lazyvim.util").info(lines, { title = "LazyVim Roots" })
|
||||||
|
return roots[1] and roots[1].paths[1] or vim.loop.cwd()
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type table<number, string>
|
||||||
|
M.cache = {}
|
||||||
|
|
||||||
|
function M.setup()
|
||||||
|
vim.api.nvim_create_user_command("LazyRoot", function()
|
||||||
|
Util.root.info()
|
||||||
|
end, { desc = "LazyVim roots for the current buffer" })
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd({ "LspAttach", "BufWritePost" }, {
|
||||||
|
group = vim.api.nvim_create_augroup("lazyvim_root_cache", { clear = true }),
|
||||||
|
callback = function(event)
|
||||||
|
M.cache[event.buf] = nil
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
-- returns the root directory based on:
|
||||||
|
-- * lsp workspace folders
|
||||||
|
-- * lsp root_dir
|
||||||
|
-- * root pattern of filename of the current buffer
|
||||||
|
-- * root pattern of cwd
|
||||||
|
---@param opts? {normalize?:boolean}
|
||||||
|
---@return string
|
||||||
|
function M.get(opts)
|
||||||
|
local buf = vim.api.nvim_get_current_buf()
|
||||||
|
local ret = M.cache[buf]
|
||||||
|
if not ret then
|
||||||
|
local roots = M.detect({ all = false })
|
||||||
|
ret = roots[1] and roots[1].paths[1] or vim.loop.cwd()
|
||||||
|
M.cache[buf] = ret
|
||||||
|
end
|
||||||
|
if opts and opts.normalize then
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
return Util.is_win() and ret:gsub("/", "\\") or ret
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param opts? {hl_last?: string}
|
||||||
|
function M.pretty_path(opts)
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
57
lua/lazyvim/util/telescope.lua
Normal file
57
lua/lazyvim/util/telescope.lua
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.telescope.opts
|
||||||
|
---@field cwd? string|boolean
|
||||||
|
---@field show_untracked? boolean
|
||||||
|
|
||||||
|
---@class lazyvim.util.telescope
|
||||||
|
---@overload fun(builtin:string, opts?:lazyvim.util.telescope.opts)
|
||||||
|
local M = setmetatable({}, {
|
||||||
|
__call = function(m, ...)
|
||||||
|
return m.telescope(...)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
-- this will return a function that calls telescope.
|
||||||
|
-- cwd will default to lazyvim.util.get_root
|
||||||
|
-- for `files`, git_files or find_files will be chosen depending on .git
|
||||||
|
---@param builtin string
|
||||||
|
---@param opts? lazyvim.util.telescope.opts
|
||||||
|
function M.telescope(builtin, opts)
|
||||||
|
local params = { builtin = builtin, opts = opts }
|
||||||
|
return function()
|
||||||
|
builtin = params.builtin
|
||||||
|
opts = params.opts
|
||||||
|
opts = vim.tbl_deep_extend("force", { cwd = Util.root() }, opts or {}) --[[@as lazyvim.util.telescope.opts]]
|
||||||
|
if builtin == "files" then
|
||||||
|
if vim.loop.fs_stat((opts.cwd or vim.loop.cwd()) .. "/.git") then
|
||||||
|
opts.show_untracked = true
|
||||||
|
builtin = "git_files"
|
||||||
|
else
|
||||||
|
builtin = "find_files"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if opts.cwd and opts.cwd ~= vim.loop.cwd() then
|
||||||
|
---@diagnostic disable-next-line: inject-field
|
||||||
|
opts.attach_mappings = function(_, map)
|
||||||
|
map("i", "<a-c>", function()
|
||||||
|
local action_state = require("telescope.actions.state")
|
||||||
|
local line = action_state.get_current_line()
|
||||||
|
M.telescope(
|
||||||
|
params.builtin,
|
||||||
|
vim.tbl_deep_extend("force", {}, params.opts or {}, { cwd = false, default_text = line })
|
||||||
|
)()
|
||||||
|
end)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
require("telescope.builtin")[builtin](opts)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.config_files()
|
||||||
|
return Util.telescope("find_files", { cwd = vim.fn.stdpath("config") })
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
55
lua/lazyvim/util/terminal.lua
Normal file
55
lua/lazyvim/util/terminal.lua
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
---@class lazyvim.util.terminal
|
||||||
|
---@overload fun(cmd: string|string[], opts: LazyTermOpts): LazyFloat
|
||||||
|
local M = setmetatable({}, {
|
||||||
|
__call = function(m, ...)
|
||||||
|
return m.open(...)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
---@type table<string,LazyFloat>
|
||||||
|
local terminals = {}
|
||||||
|
|
||||||
|
---@class LazyTermOpts: LazyCmdOptions
|
||||||
|
---@field interactive? boolean
|
||||||
|
---@field esc_esc? boolean
|
||||||
|
---@field ctrl_hjkl? boolean
|
||||||
|
|
||||||
|
-- Opens a floating terminal (interactive by default)
|
||||||
|
---@param cmd? string[]|string
|
||||||
|
---@param opts? LazyTermOpts
|
||||||
|
function M.open(cmd, opts)
|
||||||
|
opts = vim.tbl_deep_extend("force", {
|
||||||
|
ft = "lazyterm",
|
||||||
|
size = { width = 0.9, height = 0.9 },
|
||||||
|
}, opts or {}, { persistent = true }) --[[@as LazyTermOpts]]
|
||||||
|
|
||||||
|
local termkey = vim.inspect({ cmd = cmd or "shell", cwd = opts.cwd, env = opts.env, count = vim.v.count1 })
|
||||||
|
|
||||||
|
if terminals[termkey] and terminals[termkey]:buf_valid() then
|
||||||
|
terminals[termkey]:toggle()
|
||||||
|
else
|
||||||
|
terminals[termkey] = require("lazy.util").float_term(cmd, opts)
|
||||||
|
local buf = terminals[termkey].buf
|
||||||
|
vim.b[buf].lazyterm_cmd = cmd
|
||||||
|
if opts.esc_esc == false then
|
||||||
|
vim.keymap.set("t", "<esc>", "<esc>", { buffer = buf, nowait = true })
|
||||||
|
end
|
||||||
|
if opts.ctrl_hjkl == false then
|
||||||
|
vim.keymap.set("t", "<c-h>", "<c-h>", { buffer = buf, nowait = true })
|
||||||
|
vim.keymap.set("t", "<c-j>", "<c-j>", { buffer = buf, nowait = true })
|
||||||
|
vim.keymap.set("t", "<c-k>", "<c-k>", { buffer = buf, nowait = true })
|
||||||
|
vim.keymap.set("t", "<c-l>", "<c-l>", { buffer = buf, nowait = true })
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.api.nvim_create_autocmd("BufEnter", {
|
||||||
|
buffer = buf,
|
||||||
|
callback = function()
|
||||||
|
vim.cmd.startinsert()
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
return terminals[termkey]
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
76
lua/lazyvim/util/toggle.lua
Normal file
76
lua/lazyvim/util/toggle.lua
Normal file
|
|
@ -0,0 +1,76 @@
|
||||||
|
local Util = require("lazyvim.util")
|
||||||
|
|
||||||
|
---@class lazyvim.util.toggle
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@param silent boolean?
|
||||||
|
---@param values? {[1]:any, [2]:any}
|
||||||
|
function M.option(option, silent, values)
|
||||||
|
if values then
|
||||||
|
if vim.opt_local[option]:get() == values[1] then
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
vim.opt_local[option] = values[2]
|
||||||
|
else
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
vim.opt_local[option] = values[1]
|
||||||
|
end
|
||||||
|
return Util.info("Set " .. option .. " to " .. vim.opt_local[option]:get(), { title = "Option" })
|
||||||
|
end
|
||||||
|
---@diagnostic disable-next-line: no-unknown
|
||||||
|
vim.opt_local[option] = not vim.opt_local[option]:get()
|
||||||
|
if not silent then
|
||||||
|
if vim.opt_local[option]:get() then
|
||||||
|
Util.info("Enabled " .. option, { title = "Option" })
|
||||||
|
else
|
||||||
|
Util.warn("Disabled " .. option, { title = "Option" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local nu = { number = true, relativenumber = true }
|
||||||
|
function M.number()
|
||||||
|
if vim.opt_local.number:get() or vim.opt_local.relativenumber:get() then
|
||||||
|
nu = { number = vim.opt_local.number:get(), relativenumber = vim.opt_local.relativenumber:get() }
|
||||||
|
vim.opt_local.number = false
|
||||||
|
vim.opt_local.relativenumber = false
|
||||||
|
Util.warn("Disabled line numbers", { title = "Option" })
|
||||||
|
else
|
||||||
|
vim.opt_local.number = nu.number
|
||||||
|
vim.opt_local.relativenumber = nu.relativenumber
|
||||||
|
Util.info("Enabled line numbers", { title = "Option" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local enabled = true
|
||||||
|
function M.diagnostics()
|
||||||
|
enabled = not enabled
|
||||||
|
if enabled then
|
||||||
|
vim.diagnostic.enable()
|
||||||
|
Util.info("Enabled diagnostics", { title = "Diagnostics" })
|
||||||
|
else
|
||||||
|
vim.diagnostic.disable()
|
||||||
|
Util.warn("Disabled diagnostics", { title = "Diagnostics" })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param buf? number
|
||||||
|
---@param value? boolean
|
||||||
|
function M.inlay_hints(buf, value)
|
||||||
|
local ih = vim.lsp.buf.inlay_hint or vim.lsp.inlay_hint
|
||||||
|
if type(ih) == "function" then
|
||||||
|
ih(buf, value)
|
||||||
|
elseif type(ih) == "table" and ih.enable then
|
||||||
|
if value == nil then
|
||||||
|
value = not ih.is_enabled(buf)
|
||||||
|
end
|
||||||
|
ih.enable(buf, value)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
setmetatable(M, {
|
||||||
|
__call = function(m, ...)
|
||||||
|
return m.option(...)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
return M
|
||||||
189
lua/lazyvim/util/ui.lua
Normal file
189
lua/lazyvim/util/ui.lua
Normal file
|
|
@ -0,0 +1,189 @@
|
||||||
|
---@class lazyvim.util.ui
|
||||||
|
local M = {}
|
||||||
|
|
||||||
|
---@alias Sign {name:string, text:string, texthl:string, priority:number}
|
||||||
|
|
||||||
|
-- Returns a list of regular and extmark signs sorted by priority (low to high)
|
||||||
|
---@return Sign[]
|
||||||
|
---@param buf number
|
||||||
|
---@param lnum number
|
||||||
|
function M.get_signs(buf, lnum)
|
||||||
|
-- Get regular signs
|
||||||
|
---@type Sign[]
|
||||||
|
local signs = {}
|
||||||
|
|
||||||
|
if vim.fn.has("nvim-0.10") == 0 then
|
||||||
|
-- Only needed for Neovim <0.10
|
||||||
|
-- Newer versions include legacy signs in nvim_buf_get_extmarks
|
||||||
|
for _, sign in ipairs(vim.fn.sign_getplaced(buf, { group = "*", lnum = lnum })[1].signs) do
|
||||||
|
local ret = vim.fn.sign_getdefined(sign.name)[1] --[[@as Sign]]
|
||||||
|
if ret then
|
||||||
|
ret.priority = sign.priority
|
||||||
|
signs[#signs + 1] = ret
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Get extmark signs
|
||||||
|
local extmarks = vim.api.nvim_buf_get_extmarks(
|
||||||
|
buf,
|
||||||
|
-1,
|
||||||
|
{ lnum - 1, 0 },
|
||||||
|
{ lnum - 1, -1 },
|
||||||
|
{ details = true, type = "sign" }
|
||||||
|
)
|
||||||
|
for _, extmark in pairs(extmarks) do
|
||||||
|
signs[#signs + 1] = {
|
||||||
|
name = extmark[4].sign_hl_group or "",
|
||||||
|
text = extmark[4].sign_text,
|
||||||
|
texthl = extmark[4].sign_hl_group,
|
||||||
|
priority = extmark[4].priority,
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Sort by priority
|
||||||
|
table.sort(signs, function(a, b)
|
||||||
|
return (a.priority or 0) < (b.priority or 0)
|
||||||
|
end)
|
||||||
|
|
||||||
|
return signs
|
||||||
|
end
|
||||||
|
|
||||||
|
---@return Sign?
|
||||||
|
---@param buf number
|
||||||
|
---@param lnum number
|
||||||
|
function M.get_mark(buf, lnum)
|
||||||
|
local marks = vim.fn.getmarklist(buf)
|
||||||
|
vim.list_extend(marks, vim.fn.getmarklist())
|
||||||
|
for _, mark in ipairs(marks) do
|
||||||
|
if mark.pos[1] == buf and mark.pos[2] == lnum and mark.mark:match("[a-zA-Z]") then
|
||||||
|
return { text = mark.mark:sub(2), texthl = "DiagnosticHint" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
---@param sign? Sign
|
||||||
|
---@param len? number
|
||||||
|
function M.icon(sign, len)
|
||||||
|
sign = sign or {}
|
||||||
|
len = len or 2
|
||||||
|
local text = vim.fn.strcharpart(sign.text or "", 0, len) ---@type string
|
||||||
|
text = text .. string.rep(" ", len - vim.fn.strchars(text))
|
||||||
|
return sign.texthl and ("%#" .. sign.texthl .. "#" .. text .. "%*") or text
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.foldtext()
|
||||||
|
local ok = pcall(vim.treesitter.get_parser, vim.api.nvim_get_current_buf())
|
||||||
|
local ret = ok and vim.treesitter.foldtext and vim.treesitter.foldtext()
|
||||||
|
if not ret or type(ret) == "string" then
|
||||||
|
ret = { { vim.api.nvim_buf_get_lines(0, vim.v.lnum - 1, vim.v.lnum, false)[1], {} } }
|
||||||
|
end
|
||||||
|
table.insert(ret, { " " .. require("lazyvim.config").icons.misc.dots })
|
||||||
|
|
||||||
|
if not vim.treesitter.foldtext then
|
||||||
|
return table.concat(
|
||||||
|
vim.tbl_map(function(line)
|
||||||
|
return line[1]
|
||||||
|
end, ret),
|
||||||
|
" "
|
||||||
|
)
|
||||||
|
end
|
||||||
|
return ret
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.statuscolumn()
|
||||||
|
local win = vim.g.statusline_winid
|
||||||
|
local buf = vim.api.nvim_win_get_buf(win)
|
||||||
|
local is_file = vim.bo[buf].buftype == ""
|
||||||
|
local show_signs = vim.wo[win].signcolumn ~= "no"
|
||||||
|
|
||||||
|
local components = { "", "", "" } -- left, middle, right
|
||||||
|
|
||||||
|
if show_signs then
|
||||||
|
---@type Sign?,Sign?,Sign?
|
||||||
|
local left, right, fold
|
||||||
|
for _, s in ipairs(M.get_signs(buf, vim.v.lnum)) do
|
||||||
|
if s.name and s.name:find("GitSign") then
|
||||||
|
right = s
|
||||||
|
else
|
||||||
|
left = s
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if vim.v.virtnum ~= 0 then
|
||||||
|
left = nil
|
||||||
|
end
|
||||||
|
vim.api.nvim_win_call(win, function()
|
||||||
|
if vim.fn.foldclosed(vim.v.lnum) >= 0 then
|
||||||
|
fold = { text = vim.opt.fillchars:get().foldclose or "", texthl = "Folded" }
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
-- Left: mark or non-git sign
|
||||||
|
components[1] = M.icon(M.get_mark(buf, vim.v.lnum) or left)
|
||||||
|
-- Right: fold icon or git sign (only if file)
|
||||||
|
components[3] = is_file and M.icon(fold or right) or ""
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Numbers in Neovim are weird
|
||||||
|
-- They show when either number or relativenumber is true
|
||||||
|
local is_num = vim.wo[win].number
|
||||||
|
local is_relnum = vim.wo[win].relativenumber
|
||||||
|
if (is_num or is_relnum) and vim.v.virtnum == 0 then
|
||||||
|
if vim.v.relnum == 0 then
|
||||||
|
components[2] = is_num and "%l" or "%r" -- the current line
|
||||||
|
else
|
||||||
|
components[2] = is_relnum and "%r" or "%l" -- other lines
|
||||||
|
end
|
||||||
|
components[2] = "%=" .. components[2] .. " " -- right align
|
||||||
|
end
|
||||||
|
|
||||||
|
return table.concat(components, "")
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.fg(name)
|
||||||
|
---@type {foreground?:number}?
|
||||||
|
---@diagnostic disable-next-line: deprecated
|
||||||
|
local hl = vim.api.nvim_get_hl and vim.api.nvim_get_hl(0, { name = name }) or vim.api.nvim_get_hl_by_name(name, true)
|
||||||
|
---@diagnostic disable-next-line: undefined-field
|
||||||
|
local fg = hl and (hl.fg or hl.foreground)
|
||||||
|
return fg and { fg = string.format("#%06x", fg) } or nil
|
||||||
|
end
|
||||||
|
|
||||||
|
M.skip_foldexpr = {} ---@type table<number,boolean>
|
||||||
|
local skip_check = assert(vim.loop.new_check())
|
||||||
|
|
||||||
|
function M.foldexpr()
|
||||||
|
local buf = vim.api.nvim_get_current_buf()
|
||||||
|
|
||||||
|
-- still in the same tick and no parser
|
||||||
|
if M.skip_foldexpr[buf] then
|
||||||
|
return "0"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- don't use treesitter folds for non-file buffers
|
||||||
|
if vim.bo[buf].buftype ~= "" then
|
||||||
|
return "0"
|
||||||
|
end
|
||||||
|
|
||||||
|
-- as long as we don't have a filetype, don't bother
|
||||||
|
-- checking if treesitter is available (it won't)
|
||||||
|
if vim.bo[buf].filetype == "" then
|
||||||
|
return "0"
|
||||||
|
end
|
||||||
|
|
||||||
|
local ok = pcall(vim.treesitter.get_parser, buf)
|
||||||
|
|
||||||
|
if ok then
|
||||||
|
return vim.treesitter.foldexpr()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- no parser available, so mark it as skip
|
||||||
|
-- in the next tick, all skip marks will be reset
|
||||||
|
M.skip_foldexpr[buf] = true
|
||||||
|
skip_check:start(function()
|
||||||
|
M.skip_foldexpr = {}
|
||||||
|
skip_check:stop()
|
||||||
|
end)
|
||||||
|
return "0"
|
||||||
|
end
|
||||||
|
|
||||||
|
return M
|
||||||
4
queries/lua/highlights.scm
Normal file
4
queries/lua/highlights.scm
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
;; extends
|
||||||
|
|
||||||
|
((identifier) @namespace.builtin
|
||||||
|
(#eq? @namespace.builtin "vim"))
|
||||||
|
|
@ -1,3 +1,6 @@
|
||||||
indent_type = "Spaces"
|
indent_type = "Spaces"
|
||||||
indent_width = 2
|
indent_width = 2
|
||||||
column_width = 120
|
column_width = 120
|
||||||
|
[sort_requires]
|
||||||
|
enabled = true
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue