better code actions
This commit is contained in:
@@ -125,6 +125,8 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
|
|||||||
| `K` | Show hover documentation |
|
| `K` | Show hover documentation |
|
||||||
| `<leader>rn` | Rename symbol |
|
| `<leader>rn` | Rename symbol |
|
||||||
| `<leader>ca` | Code actions / quick fixes |
|
| `<leader>ca` | Code actions / quick fixes |
|
||||||
|
| `<leader>fx` | Fix diagnostic under cursor |
|
||||||
|
| `<leader>fA` | Fix all source-level diagnostics |
|
||||||
| `<leader>e` | Show diagnostic error |
|
| `<leader>e` | Show diagnostic error |
|
||||||
| `[d / ]d` | Previous/next diagnostic |
|
| `[d / ]d` | Previous/next diagnostic |
|
||||||
|
|
||||||
@@ -132,7 +134,7 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
|
|||||||
|
|
||||||
| Keymap | Action |
|
| Keymap | Action |
|
||||||
|--------|--------|
|
|--------|--------|
|
||||||
| `<leader>f` | Format file |
|
| `<leader>lf` | Format file |
|
||||||
|
|
||||||
### Git (Gitsigns)
|
### Git (Gitsigns)
|
||||||
|
|
||||||
@@ -181,7 +183,8 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
|
|||||||
## File Type Specifics
|
## File Type Specifics
|
||||||
|
|
||||||
### Python (.py)
|
### Python (.py)
|
||||||
- **LSP**: Full autocompletion, type checking, goto definition
|
- **LSP**: Full autocompletion, type checking, goto definition, Ruff diagnostics and quick fixes
|
||||||
|
- **Linting**: Ruff LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
|
||||||
- **Formatting**: ruff format (fast), black (backup)
|
- **Formatting**: ruff format (fast), black (backup)
|
||||||
- **Debugging**: Set breakpoints with `F9`, run with `F5`
|
- **Debugging**: Set breakpoints with `F9`, run with `F5`
|
||||||
- **Indentation**: 4 spaces (Python convention)
|
- **Indentation**: 4 spaces (Python convention)
|
||||||
@@ -192,6 +195,18 @@ A feature-rich Neovim setup optimized for Python, JSON, and CSV development.
|
|||||||
- **Indentation**: 2 spaces
|
- **Indentation**: 2 spaces
|
||||||
- **Folding**: JSON objects/arrays are foldable (`za` to toggle, `zM` to close all)
|
- **Folding**: JSON objects/arrays are foldable (`za` to toggle, `zM` to close all)
|
||||||
|
|
||||||
|
### Markdown (.md)
|
||||||
|
- **LSP**: Marksman for Markdown navigation and document features
|
||||||
|
- **Linting**: markdownlint diagnostics
|
||||||
|
- **Fixes**: `<leader>fx` or `<leader>ca` runs `markdownlint --fix` on the saved file
|
||||||
|
- **Formatting**: Prettier via `<leader>lf`
|
||||||
|
- **Note**: Only markdownlint rules that support automatic fixes can be changed automatically
|
||||||
|
|
||||||
|
### JavaScript/TypeScript/Vue
|
||||||
|
- **LSP**: TypeScript language features and ESLint diagnostics with quick fixes
|
||||||
|
- **Linting**: ESLint LSP (fix with `<leader>fx`, or use `<leader>fA` for fix-all actions)
|
||||||
|
- **Formatting**: Prettier via `<leader>lf`
|
||||||
|
|
||||||
### CSV (.csv)
|
### CSV (.csv)
|
||||||
- **Treesitter**: Syntax highlighting
|
- **Treesitter**: Syntax highlighting
|
||||||
- **No wrap**: Full row visibility
|
- **No wrap**: Full row visibility
|
||||||
|
|||||||
@@ -49,13 +49,78 @@ require("diff-base")
|
|||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
-- STEP 4: LSP KEYMAPS
|
-- STEP 4: LSP KEYMAPS
|
||||||
-- ============================================================================
|
-- ============================================================================
|
||||||
|
local function fix_markdownlint()
|
||||||
|
local bufnr = vim.api.nvim_get_current_buf()
|
||||||
|
local filename = vim.api.nvim_buf_get_name(bufnr)
|
||||||
|
local markdownlint = vim.fn.exepath("markdownlint")
|
||||||
|
if markdownlint == "" then
|
||||||
|
markdownlint = vim.fn.stdpath("data") .. "/mason/bin/markdownlint"
|
||||||
|
end
|
||||||
|
|
||||||
|
if vim.fn.executable(markdownlint) == 0 then
|
||||||
|
vim.notify("markdownlint is not installed", vim.log.levels.WARN)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if filename == "" then
|
||||||
|
vim.notify("Save the Markdown buffer before fixing it", vim.log.levels.WARN)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.cmd.write()
|
||||||
|
vim.fn.jobstart({ markdownlint, "--fix", filename }, {
|
||||||
|
buffer = bufnr,
|
||||||
|
on_exit = function(_, exit_code)
|
||||||
|
vim.schedule(function()
|
||||||
|
if exit_code ~= 0 then
|
||||||
|
vim.notify("markdownlint could not fix this file", vim.log.levels.WARN)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
vim.cmd.checktime()
|
||||||
|
vim.notify("markdownlint fixes applied", vim.log.levels.INFO)
|
||||||
|
vim.defer_fn(function()
|
||||||
|
require("lint").try_lint()
|
||||||
|
end, 100)
|
||||||
|
end)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" })
|
vim.keymap.set("n", "gd", vim.lsp.buf.definition, { desc = "Go to definition" })
|
||||||
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "Go to declaration" })
|
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, { desc = "Go to declaration" })
|
||||||
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "Go to implementation" })
|
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, { desc = "Go to implementation" })
|
||||||
vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "Show references" })
|
vim.keymap.set("n", "gr", vim.lsp.buf.references, { desc = "Show references" })
|
||||||
vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Show hover docs" })
|
vim.keymap.set("n", "K", vim.lsp.buf.hover, { desc = "Show hover docs" })
|
||||||
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, { desc = "Rename symbol" })
|
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, { desc = "Rename symbol" })
|
||||||
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, { desc = "Code actions" })
|
vim.keymap.set("n", "<leader>ca", function()
|
||||||
|
if vim.bo.filetype == "markdown" then
|
||||||
|
fix_markdownlint()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vim.lsp.buf.code_action()
|
||||||
|
end, { desc = "Code actions / Markdown fixes" })
|
||||||
|
vim.keymap.set("n", "<leader>fx", function()
|
||||||
|
if vim.bo.filetype == "markdown" then
|
||||||
|
fix_markdownlint()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
vim.lsp.buf.code_action({
|
||||||
|
context = {
|
||||||
|
diagnostics = vim.diagnostic.get(0, {
|
||||||
|
lnum = vim.fn.line(".") - 1,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end, { desc = "Fix diagnostic" })
|
||||||
|
vim.keymap.set("n", "<leader>fA", function()
|
||||||
|
vim.lsp.buf.code_action({
|
||||||
|
apply = true,
|
||||||
|
context = {
|
||||||
|
only = { "source.fixAll" },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end, { desc = "Fix all diagnostics" })
|
||||||
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, { desc = "Show diagnostic" })
|
vim.keymap.set("n", "<leader>e", vim.diagnostic.open_float, { desc = "Show diagnostic" })
|
||||||
|
|
||||||
vim.diagnostic.config({
|
vim.diagnostic.config({
|
||||||
@@ -138,4 +203,3 @@ vim.keymap.set("n", "<leader>ch", ":noh<CR>", { desc = "clear search highlightin
|
|||||||
|
|
||||||
-- toggle word wrap
|
-- toggle word wrap
|
||||||
vim.keymap.set("n", "<leader>tw", ":set wrap!<CR>", { desc = "toggle word wrap" })
|
vim.keymap.set("n", "<leader>tw", ":set wrap!<CR>", { desc = "toggle word wrap" })
|
||||||
|
|
||||||
|
|||||||
@@ -44,10 +44,13 @@ return {
|
|||||||
require("mason-lspconfig").setup({
|
require("mason-lspconfig").setup({
|
||||||
ensure_installed = {
|
ensure_installed = {
|
||||||
"pyright", -- Python
|
"pyright", -- Python
|
||||||
|
"ruff", -- Python linting and fixes
|
||||||
|
"eslint", -- JavaScript/TypeScript linting and fixes
|
||||||
"ts_ls", -- TypeScript/JavaScript
|
"ts_ls", -- TypeScript/JavaScript
|
||||||
"vue_ls", -- Vue (Volar)
|
"vue_ls", -- Vue (Volar)
|
||||||
"jsonls", -- JSON
|
"jsonls", -- JSON
|
||||||
"yamlls", -- YAML
|
"yamlls", -- YAML
|
||||||
|
"marksman", -- Markdown
|
||||||
"html", -- HTML
|
"html", -- HTML
|
||||||
"cssls", -- CSS
|
"cssls", -- CSS
|
||||||
"bashls", -- Bash
|
"bashls", -- Bash
|
||||||
@@ -97,6 +100,25 @@ return {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- Ruff provides Python lint diagnostics and quick fixes.
|
||||||
|
vim.lsp.config("ruff", {
|
||||||
|
filetypes = { "python" },
|
||||||
|
})
|
||||||
|
|
||||||
|
-- ESLint provides lint diagnostics and source-level fixes.
|
||||||
|
vim.lsp.config("eslint", {
|
||||||
|
filetypes = {
|
||||||
|
"javascript",
|
||||||
|
"javascriptreact",
|
||||||
|
"typescript",
|
||||||
|
"typescriptreact",
|
||||||
|
"vue",
|
||||||
|
},
|
||||||
|
settings = {
|
||||||
|
workingDirectory = { mode = "auto" },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
-- Type- and JavaScript
|
-- Type- and JavaScript
|
||||||
vim.lsp.config("ts_ls", {
|
vim.lsp.config("ts_ls", {
|
||||||
filetypes = {
|
filetypes = {
|
||||||
@@ -160,6 +182,7 @@ return {
|
|||||||
-- Other languages
|
-- Other languages
|
||||||
vim.lsp.config("jsonls", {})
|
vim.lsp.config("jsonls", {})
|
||||||
vim.lsp.config("yamlls", {})
|
vim.lsp.config("yamlls", {})
|
||||||
|
vim.lsp.config("marksman", {})
|
||||||
vim.lsp.config("html", {})
|
vim.lsp.config("html", {})
|
||||||
vim.lsp.config("cssls", {})
|
vim.lsp.config("cssls", {})
|
||||||
vim.lsp.config("bashls", {})
|
vim.lsp.config("bashls", {})
|
||||||
@@ -167,10 +190,13 @@ return {
|
|||||||
-- Enable servers
|
-- Enable servers
|
||||||
vim.lsp.enable("lua_ls")
|
vim.lsp.enable("lua_ls")
|
||||||
vim.lsp.enable("pyright")
|
vim.lsp.enable("pyright")
|
||||||
|
vim.lsp.enable("ruff")
|
||||||
|
vim.lsp.enable("eslint")
|
||||||
vim.lsp.enable("ts_ls")
|
vim.lsp.enable("ts_ls")
|
||||||
vim.lsp.enable("vue_ls")
|
vim.lsp.enable("vue_ls")
|
||||||
vim.lsp.enable("jsonls")
|
vim.lsp.enable("jsonls")
|
||||||
vim.lsp.enable("yamlls")
|
vim.lsp.enable("yamlls")
|
||||||
|
vim.lsp.enable("marksman")
|
||||||
vim.lsp.enable("html")
|
vim.lsp.enable("html")
|
||||||
vim.lsp.enable("cssls")
|
vim.lsp.enable("cssls")
|
||||||
vim.lsp.enable("bashls")
|
vim.lsp.enable("bashls")
|
||||||
|
|||||||
@@ -2,12 +2,6 @@ return {
|
|||||||
"mfussenegger/nvim-lint",
|
"mfussenegger/nvim-lint",
|
||||||
config = function()
|
config = function()
|
||||||
require("lint").linters_by_ft = {
|
require("lint").linters_by_ft = {
|
||||||
javascript = { "eslint_d" },
|
|
||||||
javascriptreact = { "eslint_d" },
|
|
||||||
typescript = { "eslint_d" },
|
|
||||||
typescriptreact = { "eslint_d" },
|
|
||||||
vue = { "eslint_d" },
|
|
||||||
python = { "ruff" },
|
|
||||||
-- lua = { "selene" }, -- Disabled: lua_ls provides diagnostics
|
-- lua = { "selene" }, -- Disabled: lua_ls provides diagnostics
|
||||||
sh = { "shellcheck" },
|
sh = { "shellcheck" },
|
||||||
bash = { "shellcheck" },
|
bash = { "shellcheck" },
|
||||||
@@ -17,7 +11,7 @@ return {
|
|||||||
rust = { "clippy" },
|
rust = { "clippy" },
|
||||||
}
|
}
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd({ "BufWritePost" }, {
|
vim.api.nvim_create_autocmd({ "BufWritePost", "BufEnter", "InsertLeave" }, {
|
||||||
callback = function()
|
callback = function()
|
||||||
require("lint").try_lint()
|
require("lint").try_lint()
|
||||||
end,
|
end,
|
||||||
|
|||||||
Reference in New Issue
Block a user