diff --git a/nvim/init.lua b/nvim/init.lua index c579e61..ae7e16d 100644 --- a/nvim/init.lua +++ b/nvim/init.lua @@ -2,6 +2,22 @@ if vim.loader then vim.loader.enable() end +-- 让 Mason / 健康检查能找到本仓库常用的本地 CLI(fd、lazygit、tree-sitter 等) +local _local_bin = vim.fn.expand("~/.local/bin") +if vim.fn.isdirectory(_local_bin) == 1 then + vim.env.PATH = _local_bin .. ":" .. vim.env.PATH +end +-- 全局 npm 包(如 mermaid-cli 的 `mmdc`)通常在 $(npm prefix -g)/bin +do + local ok, out = pcall(vim.fn.system, { "npm", "prefix", "-g" }) + if ok and out and out ~= "" then + local npm_bin = vim.fn.trim(out) .. "/bin" + if vim.fn.isdirectory(npm_bin) == 1 then + vim.env.PATH = npm_bin .. ":" .. vim.env.PATH + end + end +end + vim.g.loaded_netrw = 1 vim.g.loaded_netrwPlugin = 1 diff --git a/nvim/lazy-lock.json b/nvim/lazy-lock.json index fc07453..4d7af39 100644 --- a/nvim/lazy-lock.json +++ b/nvim/lazy-lock.json @@ -34,14 +34,14 @@ "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, "nvim-cmp": { "branch": "main", "commit": "f17d9b4394027ff4442b298398dfcaab97e40c4f" }, - "nvim-dap": { "branch": "master", "commit": "2a8799ad91a1495c6bdf753f9b2179b3ff0f5bba" }, + "nvim-dap": { "branch": "master", "commit": "4f5deb110d9ff8994d96c21df95e2271d11214f9" }, "nvim-dap-go": { "branch": "main", "commit": "b4421153ead5d726603b02743ea40cf26a51ed5f" }, "nvim-dap-ui": { "branch": "master", "commit": "f5b6673f374626515401c5bc51b005f784a4f252" }, "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, "nvim-lint": { "branch": "master", "commit": "4b03656c09c1561f89b6aa0665c15d292ba9499d" }, "nvim-lspconfig": { "branch": "master", "commit": "16812abf0e8d8175155f26143a8504e8253e92b0" }, "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, - "nvim-tree.lua": { "branch": "master", "commit": "b548cfef00a79f0b3e3af24f91ae6bd14f22af95" }, + "nvim-tree.lua": { "branch": "master", "commit": "4cbe79526f8bc0bdb1a500d261dc5cc1be4e77d5" }, "nvim-treesitter": { "branch": "main", "commit": "7caec274fd19c12b55902a5b795100d21531391f" }, "nvim-treesitter-textobjects": { "branch": "main", "commit": "93d60a475f0b08a8eceb99255863977d3a25f310" }, "nvim-ts-autotag": { "branch": "main", "commit": "8e1c0a389f20bf7f5b0dd0e00306c1247bda2595" }, diff --git a/nvim/lazyvim.json b/nvim/lazyvim.json index d946de7..d4a28da 100644 --- a/nvim/lazyvim.json +++ b/nvim/lazyvim.json @@ -1,5 +1,6 @@ { "extras": [ + "lazyvim.plugins.extras.editor.snacks_picker", "lazyvim.plugins.extras.test.core", "lazyvim.plugins.extras.lang.go", "lazyvim.plugins.extras.lang.typescript", diff --git a/nvim/lua/config/keymaps.lua b/nvim/lua/config/keymaps.lua index afeef5e..a6b19e5 100644 --- a/nvim/lua/config/keymaps.lua +++ b/nvim/lua/config/keymaps.lua @@ -1,147 +1,99 @@ - local keymap = vim.keymap -local opts = { noremap = true, silent = true } - --- a -keymap.set('n', "aa", "@:", {desc="execute last command again" }) -- b for buffer -keymap.set('n', "bq", "q", {desc="quit" }) -keymap.set('n', "bs", "w", {desc="save" }) -keymap.set('n', "br", "e!", {desc="reload" }) -keymap.set('n', "bd", "BufferClose", {desc="close buffer" }) -keymap.set({'n','v'}, "b/", "CommentToggle", {desc="toggle comment" }) +keymap.set("n", "bq", "q", { desc = "quit" }) +keymap.set("n", "bs", "w", { desc = "save" }) +keymap.set("n", "br", "e!", { desc = "reload" }) +keymap.set("n", "bd", "BufferClose", { desc = "close buffer" }) -- c -keymap.set('n', "cs", "SymbolsOutline", { desc = "Symbols Outline" }) +keymap.set("n", "cs", "SymbolsOutline", { desc = "Symbols Outline" }) --- D -keymap.set('n', "Dt", "TroubleToggle", {desc="trouble" }) -keymap.set('n', "Dw", "TroubleToggle lsp_workspace_diagnostics", {desc="workspace" }) -keymap.set('n', "Dd", "TroubleToggle lsp_document_diagnostics", {desc= "document" }) -keymap.set('n', "Dq", "TroubleToggle quickfix", {desc= "quickfix" }) -keymap.set('n', "Dl", "TroubleToggle loclist", {desc= "loclist" }) -keymap.set('n', "Dr", "TroubleToggle lsp_references", {desc= "references" }) - --- d -keymap.set('n', "dd", "lua vim.lsp.diagnostic.show_line_diagnostics()", {desc= "show diagnostics" }) -keymap.set('n', "dc", "lua require'dap'.continue()", {desc= "continue" }) -keymap.set('n', "db", ':lua require"dap".toggle_breakpoint()', {desc= "Toggle Breadpoint" }) -keymap.set('n', "dj", ':lua require"dap".step_over()', {desc= "step over" }) -keymap.set('n', "dk", ':lua require"dap".step_out()', {desc= "step out" }) -keymap.set('n', "dl", ':lua require"dap".step_into()', {desc= "step into" }) -keymap.set('n', "du", ':lua require"dap".up()', {desc= "up" }) -keymap.set('n', "d_", ':lua require"dap".disconnect();require"dap".stop();require"dap".run_last()', {desc= "disconnect" }) -keymap.set('n', "di", ':lua require"dap.ui.variables".visual_hover()', {desc= "visual_hover" }) -keymap.set('n', "ds", ':lua local widgets=require"dap.ui.widgets";widgets.centered_float(widgets.scopes)', {desc= "centered_float" }) +-- D for Trouble (v3 syntax) +keymap.set("n", "Dt", "Trouble diagnostics toggle", { desc = "trouble diagnostics" }) +keymap.set("n", "Dd", "Trouble diagnostics toggle filter.buf=0", { desc = "document diagnostics" }) +keymap.set("n", "Dq", "Trouble qflist toggle", { desc = "quickfix" }) +keymap.set("n", "Dl", "Trouble loclist toggle", { desc = "loclist" }) +keymap.set("n", "Dr", "Trouble lsp_references toggle", { desc = "references" }) +-- d for debug +keymap.set("n", "dd", "lua vim.diagnostic.open_float()", { desc = "show diagnostics" }) +keymap.set("n", "dc", 'lua require("dap").continue()', { desc = "continue" }) +keymap.set("n", "db", 'lua require("dap").toggle_breakpoint()', { desc = "Toggle Breakpoint" }) +keymap.set("n", "dj", 'lua require("dap").step_over()', { desc = "step over" }) +keymap.set("n", "dk", 'lua require("dap").step_out()', { desc = "step out" }) +keymap.set("n", "dl", 'lua require("dap").step_into()', { desc = "step into" }) +keymap.set("n", "du", 'lua require("dap").up()', { desc = "up" }) +keymap.set("n", "d_", 'lua require("dap").disconnect();require("dap").stop();require("dap").run_last()', { desc = "disconnect" }) +keymap.set("n", "di", 'lua require("dap.ui.variables").visual_hover()', { desc = "visual hover" }) +keymap.set("n", "ds", 'lua local w=require("dap.ui.widgets");w.centered_float(w.scopes)', { desc = "scopes" }) -- f -keymap.set('n', "fm", "lua require'utils'.open_md()", {desc= "open a markdown file in vscode" }) -keymap.set('n', "fs", "w", {desc= "save file" }) -keymap.set('n', "ft", "NvimTreeToggle", {desc= "toggle nvim tree" }) -keymap.set('n', "fr", "RnvimrToggle", {desc= "toggle rnvimr" }) -keymap.set('n', "fy", "lua require'utils'.yank_filepath()", {desc= "copy the file path" }) -keymap.set('n', "fd", "lua require'utils'.yank_file_dir()", {desc= "copy the file path" }) -keymap.set('n', "fl", "NvimTreeFindFile", {desc= "find file" }) - +keymap.set("n", "fm", "lua require('utils').open_md()", { desc = "open markdown in external app" }) +keymap.set("n", "fs", "w", { desc = "save file" }) +keymap.set("n", "ft", "NvimTreeToggle", { desc = "toggle nvim tree" }) +keymap.set("n", "fy", "lua require('utils').yank_filepath()", { desc = "copy file path" }) +keymap.set("n", "fd", "lua require('utils').yank_file_dir()", { desc = "copy dir path" }) +keymap.set("n", "fl", "NvimTreeFindFile", { desc = "find file in tree" }) -- g -keymap.set('n', "gj", "lua require 'gitsigns'.next_hunk()", {desc= "Next Hunk" }) -keymap.set('n', "gk", "lua require 'gitsigns'.prev_hunk()", {desc= "Prev Hunk" }) -keymap.set('n', "gl", "lua require 'gitsigns'.blame_line()", {desc= "Blame" }) -keymap.set('n', "gp", "lua require 'gitsigns'.preview_hunk()", {desc= "Preview Hunk" }) -keymap.set('n', "gr", "lua require 'gitsigns'.reset_hunk()", {desc= "Reset Hunk" }) -keymap.set('n', "gR", "lua require 'gitsigns'.reset_buffer()", {desc= "Reset Buffer" }) -keymap.set('n', "gs", "lua require 'gitsigns'.stage_hunk()", {desc= "Stage Hunk" }) -keymap.set('n', "gS", "lua require 'gitsigns'.stage_buffer()", {desc= "Stage Buffer" }) -keymap.set('n', "gu", "lua require 'gitsigns'.undo_stage_hunk()", {desc= "Undo Stage Hunk", }) -keymap.set('n', "go", "Telescope git_status", {desc= "Open changed file" }) -keymap.set('n', "gb", "Telescope git_branches", {desc= "Checkout branch" }) -keymap.set('n', "gc", "Telescope git_commits", {desc= "Checkout commit" }) -keymap.set('n', "gC", "Telescope git_bcommits", {desc= "Checkout commit(for current file)", }) -keymap.set('n', "gd", "Gitsigns diffthis HEAD", {desc= "Git Diff", }) +keymap.set("n", "gj", "lua require('gitsigns').next_hunk()", { desc = "Next Hunk" }) +keymap.set("n", "gk", "lua require('gitsigns').prev_hunk()", { desc = "Prev Hunk" }) +keymap.set("n", "gl", "lua require('gitsigns').blame_line()", { desc = "Blame" }) +keymap.set("n", "gp", "lua require('gitsigns').preview_hunk()", { desc = "Preview Hunk" }) +keymap.set("n", "gr", "lua require('gitsigns').reset_hunk()", { desc = "Reset Hunk" }) +keymap.set("n", "gR", "lua require('gitsigns').reset_buffer()", { desc = "Reset Buffer" }) +keymap.set("n", "gs", "lua require('gitsigns').stage_hunk()", { desc = "Stage Hunk" }) +keymap.set("n", "gS", "lua require('gitsigns').stage_buffer()", { desc = "Stage Buffer" }) +keymap.set("n", "gu", "lua require('gitsigns').undo_stage_hunk()", { desc = "Undo Stage Hunk" }) +keymap.set("n", "go", "Telescope git_status", { desc = "Open changed file" }) +keymap.set("n", "gb", "Telescope git_branches", { desc = "Checkout branch" }) +keymap.set("n", "gc", "Telescope git_commits", { desc = "Checkout commit" }) +keymap.set("n", "gC", "Telescope git_bcommits", { desc = "Checkout commit(for current file)" }) +keymap.set("n", "gd", "Gitsigns diffthis HEAD", { desc = "Git Diff" }) --- h -keymap.set('n', 'h', ':set hlsearch!', { noremap = true, silent = true }) -- no hl - --- l for lsp -keymap.set('n', 'l', "", {desc="+Language"}) -keymap.set({'n','v'}, 'la', "lua vim.lsp.buf.code_action()", {desc="Code Action" }) ---keymap.set('n', 'lA', "Lspsaga range_code_action", {desc="Selected Action" }) -keymap.set('n', 'ld', "Telescope lsp_document_diagnostics", {desc="Document Diagnostics" }) -keymap.set('n', 'lD', "Telescope lsp_workspace_diagnostics", {desc="Workspace Diagnostics" }) -keymap.set('n', 'lf', "LspFormatting", {desc="Format" }) ---keymap.set('n', 'lF', "Lspsaga lsp_finder", {desc="LSP Finder" }) -keymap.set('n', 'li', "lua vim.lsp.buf.implementation()", {desc="implement" }) -keymap.set('n', 'ln', "lua vim.lsp.buf.hover()", {desc="hover" }) ---keymap.set('n', 'lL', "Lspsaga show_line_diagnostics", {desc="Line Diagnostics" }) -keymap.set('n', 'lk', ": LspRestart", {desc="restart lsp server" }) -keymap.set('n', 'll', "lua vim.diagnostic.goto_next()", {desc="next diagnostic" }) -keymap.set('n', 'lo', ": SymbolsOutline", {desc="symbols outline" }) -keymap.set('n', 'lp', "lua vim.diagnostic.goto_prev()", {desc="prev diagnostic" }) ---keymap.set('n', 'lP', "Lspsaga preview_definition", {desc="Preview Definition" }) -keymap.set('n', 'lq', "Telescope quickfix", {desc="Quickfix" }) -keymap.set('n', 'lr', "lua vim.lsp.buf.references()", {desc="references" }) -keymap.set('n', 'lR', "lua vim.lsp.buf.rename()", { desc = "Rename" }) ---keymap.set('n', 'lR', "Lspsaga rename", {desc="Rename" }) -keymap.set('n', 'lt', "LspTypeDefinition", {desc="Type Definition" }) -keymap.set('n', 'lx', "cclose", {desc="Close Quickfix" }) -keymap.set('n', 'ls', "Telescope lsp_document_symbols", {desc="Document Symbols" }) -keymap.set('n', 'lS', "Telescope lsp_dynamic_workspace_symbols", {desc="Workspace Symbols" }) -keymap.set('n', 'lz', "LspInfo", {desc="Info" }) -keymap.set('n', 'l,', "LspInstallInfo", {desc="LSP servers" }) +-- h +keymap.set("n", "h", ":set hlsearch!", { noremap = true, silent = true, desc = "toggle hlsearch" }) -- q -keymap.set('n', "qq", "qall", {desc= "quit" }) +keymap.set("n", "qq", "qall", { desc = "quit all" }) - --- s -keymap.set('n', "sb", "Telescope git_branches", {desc= "Checkout branch" }) -keymap.set('n', "sc", ":nohl", {desc= "no highlight" }) -keymap.set('n', "sd", "Telescope lsp_document_diagnostics", {desc= "Document Diagnostics" }) -keymap.set('n', "sD", "Telescope lsp_workspace_diagnostics", {desc= "Workspace Diagnostics" }) - keymap.set('n', "sf", "Telescope find_files", {desc= "Find File" }) -keymap.set('n', "sr", function() require("telescope.builtin").oldfiles({ cwd = vim.loop.cwd() }) end, {desc= "Old File" }) -keymap.set('n', "sm", "Telescope marks", {desc= "Marks" }) -keymap.set('n', "sM", "Telescope man_pages", {desc= "Man Pages" }) -keymap.set('n', "sR", "Telescope registers", {desc= "Registers" }) -keymap.set('n', "st", "Telescope live_grep", {desc= "Text" }) -keymap.set('n', "sT", "Telescope live_grep", {desc= "Text" }) -keymap.set('n', "s,", function() +-- s for search +keymap.set("n", "sb", "Telescope git_branches", { desc = "Checkout branch" }) +keymap.set("n", "sc", "nohl", { desc = "no highlight" }) +keymap.set("n", "sd", "Telescope diagnostics bufnr=0", { desc = "Document Diagnostics" }) +keymap.set("n", "sD", "Telescope diagnostics", { desc = "Workspace Diagnostics" }) +keymap.set("n", "sf", "Telescope find_files", { desc = "Find File" }) +keymap.set("n", "sr", function() + require("telescope.builtin").oldfiles({ cwd = vim.uv.cwd() }) +end, { desc = "Old File" }) +keymap.set("n", "sm", "Telescope marks", { desc = "Marks" }) +keymap.set("n", "sM", "Telescope man_pages", { desc = "Man Pages" }) +keymap.set("n", "sR", "Telescope registers", { desc = "Registers" }) +keymap.set("n", "st", "Telescope live_grep", { desc = "Text" }) +keymap.set("n", "s,", function() local ok, fzf_lua = pcall(require, "fzf-lua") if ok then fzf_lua.grep_cword() else - vim.notify("fzf-lua not available, falling back to Telescope", vim.log.levels.WARN) require("telescope.builtin").grep_string({ word_match = "-w" }) end -end, {desc= "Search word under cursor" }) +end, { desc = "Search word under cursor" }) --- S -keymap.set('n', "Ss", "SessionSave", {desc= "Save Session" }) -keymap.set('n', "Sl", "SessionLoad", {desc= "Load Session" }) - --- t -keymap.set('n', "ta", "TestSuite -v -cover", {desc= "TestSuite" }) -keymap.set('n', "tt", "lua require('neotest').run.run() ", {desc= "TestNearest" }) -keymap.set('n', "tf", 'lua require("neotest").run.run(vim.fn.expand("%"))', {desc= "TestFile" }) -keymap.set('n', "tc", "GoCover", {desc="go coverage" }) -keymap.set('n', "tC", "GoCoverClear", {desc= "go coverage clear" }) -keymap.set('n', "tb", "lua require'dap'.toggle_breakpoint()", {desc= "set break point" }) -keymap.set('n', "tr", "lua require'dap'.continue()", {desc= "continue" }) -keymap.set('n', "zs", "TZBottom", {desc="toggle status line" }) -keymap.set('n', "zt", "TZTop", {desc= "toggle tab bar" }) -keymap.set('n', "zz", "TZAtaraxis", {desc= "toggle zen" }) +-- t for test +keymap.set("n", "tt", 'lua require("neotest").run.run()', { desc = "TestNearest" }) +keymap.set("n", "tf", 'lua require("neotest").run.run(vim.fn.expand("%"))', { desc = "TestFile" }) +keymap.set("n", "tc", "GoCover", { desc = "go coverage" }) +keymap.set("n", "tC", "GoCoverClear", { desc = "go coverage clear" }) +keymap.set("n", "tb", 'lua require("dap").toggle_breakpoint()', { desc = "set break point" }) +keymap.set("n", "tr", 'lua require("dap").continue()', { desc = "continue" }) -- ; -keymap.set('n', ';', ':Dashboard', { noremap = true, silent = true }) +keymap.set("n", ";", "Dashboard", { noremap = true, silent = true, desc = "Dashboard" }) --- Ctrl -keymap.set('n', '', function() +-- Ctrl-p: find files with recent-first boost +keymap.set("n", "", function() local builtin = require("telescope.builtin") - - -- 获取最近编辑的文件,创建路径映射 local recent_paths = {} for _, file in ipairs(vim.v.oldfiles) do if vim.fn.filereadable(file) == 1 then @@ -149,25 +101,13 @@ keymap.set('n', '', function() local rel_path = vim.fn.fnamemodify(file, ":.") recent_paths[abs_path] = true recent_paths[rel_path] = true - -- 也添加文件名(不含路径) - local filename = vim.fn.fnamemodify(file, ":t") - if not recent_paths[filename] then - recent_paths[filename] = true - end + recent_paths[vim.fn.fnamemodify(file, ":t")] = true end end - - -- 使用 find_files,fzf 扩展会自动提供基于频率的排序 - -- 如果没有 fzf,我们使用自定义排序器 - local ok, fzf_ext = pcall(require, "telescope._extensions.fzf") - if ok and fzf_ext then - -- 使用 fzf 扩展,它会自动提供基于频率的排序 - builtin.find_files({ - hidden = true, - no_ignore = false, - }) + local ok, _ = pcall(require, "telescope._extensions.fzf") + if ok then + builtin.find_files({ hidden = true, no_ignore = false }) else - -- 如果没有 fzf 扩展,使用自定义排序 local sorters = require("telescope.sorters") builtin.find_files({ hidden = true, @@ -177,106 +117,64 @@ keymap.set('n', '', function() scoring_function = function(_, prompt, line, entry) local score = 0 local path = entry.path or entry.value or line - - -- 检查是否在最近编辑的文件列表中 local abs_path = vim.fn.fnamemodify(path, ":p") local rel_path = vim.fn.fnamemodify(path, ":.") local filename = vim.fn.fnamemodify(path, ":t") - if recent_paths[abs_path] or recent_paths[rel_path] or recent_paths[filename] then - score = 1000 -- 提高分数,让最近的文件排在前面 + score = 1000 end - - -- 添加基本的模糊匹配分数 if prompt and prompt ~= "" then - local lower_path = path:lower() - local lower_prompt = prompt:lower() - if lower_path:find(lower_prompt, 1, true) then + if path:lower():find(prompt:lower(), 1, true) then score = score + 100 end end - return score end, }), }) end end, { noremap = true, silent = true, desc = "Find Files (Recent First)" }) --- better window movement -keymap.set('n', '', 'h', { silent = true }) -keymap.set('n', '', 'j', { silent = true }) -keymap.set('n', '', 'k', { silent = true }) -keymap.set('n', '', 'l', { silent = true }) --- resize with arrows -keymap.set('n', '', ':resize -2', { silent = true }) -keymap.set('n', '', ':resize +2', { silent = true }) -keymap.set('n', '', ':vertical resize -2', { silent = true }) -keymap.set('n', '', ':vertical resize +2', { silent = true }) -keymap.set('n', '', ':call QuickFixToggle()', { noremap = true, silent = true }) +-- Window movement +keymap.set("n", "", "h", { silent = true }) +keymap.set("n", "", "j", { silent = true }) +keymap.set("n", "", "k", { silent = true }) +keymap.set("n", "", "l", { silent = true }) --- Override two spaces (LazyVim default fzf) with Telescope live_grep --- Search for keywords in file contents -keymap.set('n', ' ', function() +-- Resize with arrows +keymap.set("n", "", ":resize -2", { silent = true }) +keymap.set("n", "", ":resize +2", { silent = true }) +keymap.set("n", "", ":vertical resize -2", { silent = true }) +keymap.set("n", "", ":vertical resize +2", { silent = true }) + +-- Quickfix toggle +keymap.set("n", "", function() + for _, win in pairs(vim.fn.getwininfo()) do + if win.quickfix == 1 then + vim.cmd("cclose") + return + end + end + vim.cmd("copen") +end, { noremap = true, silent = true, desc = "Toggle Quickfix" }) + +-- Two spaces → live_grep +keymap.set("n", " ", function() require("telescope.builtin").live_grep() -end, { noremap = true, silent = true, desc = "Search in Files (two spaces)" }) +end, { noremap = true, silent = true, desc = "Search in Files" }) --- LSP keymaps (gd, gD, K, gi, etc.) --- Delete LazyVim's default mappings first to avoid conflicts --- Use vim.schedule to ensure this runs after LazyVim loads -vim.schedule(function() - vim.keymap.del('n', 'gd') - vim.keymap.del('n', 'gD') - vim.keymap.del('n', 'gi') - vim.keymap.del('n', 'K') - vim.keymap.del('n', 'gt') - vim.keymap.del('n', 'gr') -end) +-- Misc +keymap.set("n", "Y", "y$", {}) +keymap.set("v", "<", "", ">gv", { noremap = true, silent = true }) +keymap.set("i", "jk", "", { noremap = true, silent = true }) +keymap.set("i", "kj", "", { noremap = true, silent = true }) +keymap.set("i", "jj", "", { noremap = true, silent = true }) --- Go to definition -keymap.set('n', 'gd', function() - vim.lsp.buf.definition() -end, { noremap = true, silent = true, desc = "Goto Definition" }) - --- Go to declaration -keymap.set('n', 'gD', function() - vim.lsp.buf.declaration() -end, { noremap = true, silent = true, desc = "Goto Declaration" }) - --- Go to implementation -keymap.set('n', 'gi', function() - vim.lsp.buf.implementation() -end, { noremap = true, silent = true, desc = "Goto Implementation" }) - --- Hover -keymap.set('n', 'K', function() - vim.lsp.buf.hover() -end, { noremap = true, silent = true, desc = "Hover Documentation" }) - --- Go to type definition -keymap.set('n', 'gt', function() - vim.lsp.buf.type_definition() -end, { noremap = true, silent = true, desc = "Goto Type Definition" }) - --- References -keymap.set('n', 'gr', function() - vim.lsp.buf.references() -end, { noremap = true, silent = true, desc = "References" }) - --- Other --- better edit -keymap.set('n', 'Y', 'y$', {}) --- better indenting -keymap.set('v', '<', '', '>gv', { noremap = true, silent = true }) --- I hate escape -keymap.set('i', 'jk', '', { noremap = true, silent = true }) -keymap.set('i', 'kj', '', { noremap = true, silent = true }) -keymap.set('i', 'jj', '', { noremap = true, silent = true }) --- Tab switch buffer -keymap.set('n', '', ':BufferNext', { noremap = true, silent = true }) -keymap.set('n', '', ':BufferPrevious', { noremap = true, silent = true }) --- Move selected line / block of text in visual mode -keymap.set('x', 'K', ':move \'<-2gv-gv', { noremap = true, silent = true }) -keymap.set('x', 'J', ':move \'>+1gv-gv', { noremap = true, silent = true }) +-- Tab switch buffer (barbar) +keymap.set("n", "", "BufferNext", { noremap = true, silent = true }) +keymap.set("n", "", "BufferPrevious", { noremap = true, silent = true }) +-- Move selected line / block in visual mode +keymap.set("x", "K", ":move '<-2gv-gv", { noremap = true, silent = true }) +keymap.set("x", "J", ":move '>+1gv-gv", { noremap = true, silent = true }) diff --git a/nvim/lua/config/lazy.lua b/nvim/lua/config/lazy.lua index 45a812d..ae5a880 100644 --- a/nvim/lua/config/lazy.lua +++ b/nvim/lua/config/lazy.lua @@ -1,5 +1,5 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" -if not vim.loop.fs_stat(lazypath) then +if not vim.uv.fs_stat(lazypath) then -- bootstrap lazy.nvim -- stylua: ignore vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", "--branch=stable", lazypath }) @@ -14,6 +14,10 @@ require("lazy").setup({ -- import/override with your plugins { import = "plugins" }, }, + -- 本机未装 luarocks 时避免 Lazy 健康检查报 ERROR;需要 rocks 依赖的插件时再打开 + rocks = { + enabled = false, + }, defaults = { -- By default, only LazyVim plugins will be lazy-loaded. Your custom plugins will load during startup. -- If you know what you're doing, you can set this to `true` to have all your custom plugins lazy-loaded by default. diff --git a/nvim/lua/config/options.lua b/nvim/lua/config/options.lua index 71bfb77..1e9603d 100644 --- a/nvim/lua/config/options.lua +++ b/nvim/lua/config/options.lua @@ -1,6 +1,12 @@ vim.g.autoformat = true -vim.cmd("set iskeyword+=-") -- treat dash separated words as a word text object" +-- 关闭不常用的远程宿主,减少 :checkhealth 里无意义的 WARNING +vim.g.loaded_perl_provider = 0 +vim.g.loaded_ruby_provider = 0 +-- 明确指向已安装 pynvim 的解释器 +vim.g.python3_host_prog = "/usr/bin/python3" + +vim.cmd("set iskeyword+=-") -- treat dash separated words as a word text object vim.cmd("set shortmess+=c") -- Don't pass messages to |ins-completion-menu|. vim.cmd("set inccommand=split") -- Make substitution work in realtime vim.opt.hidden = true -- Required to keep multiple buffers open multiple buffers @@ -10,53 +16,37 @@ vim.cmd('let &titleold="' .. TERMINAL .. '"') vim.opt.titlestring = "%<%F%=%l/%L - nvim" vim.wo.wrap = true -- Display long lines as just one line vim.cmd("set whichwrap+=<,>,[,],h,l") -- move to next line with theses keys -vim.cmd("syntax on") -- syntax highlighting vim.opt.pumheight = 10 -- Makes popup menu smaller vim.opt.fileencoding = "utf-8" -- The encoding written to file vim.opt.cmdheight = 2 -- More space for displaying messages -vim.cmd("set colorcolumn=99999") -- fix indentline for now vim.opt.mouse = "a" -- Enable your mouse vim.opt.splitbelow = true -- Horizontal splits will automatically be below vim.opt.termguicolors = true -- set term gui colors most terminals support this vim.opt.splitright = true -- Vertical splits will automatically be to the right --- vim.opt.t_Co = "256" -- Support 256 colors vim.opt.conceallevel = 0 -- So that I can see `` in markdown files vim.o.tabstop = 4 vim.opt.shiftwidth = 4 vim.opt.expandtab = true -vim.bo.smartindent = true -- Makes indenting smart +vim.opt.smartindent = true -- Makes indenting smart vim.wo.number = true -- set numbered lines vim.wo.relativenumber = true -- set relative number vim.wo.cursorline = true -- Enable highlighting of the current line vim.opt.showtabline = 2 -- Always show tabs vim.opt.showmode = false -- We don't need to see things like -- INSERT -- anymore -vim.opt.backup = false -- This is recommended by coc -vim.opt.writebackup = false -- This is recommended by coc +vim.opt.backup = false +vim.opt.writebackup = false vim.wo.signcolumn = "yes" -- Always show the signcolumn, otherwise it would shift the text each time vim.opt.updatetime = 300 -- Faster completion vim.opt.timeoutlen = 500 -- By default timeoutlen is 1000 ms vim.opt.clipboard = "unnamedplus" -- Copy paste between vim and everything else -vim.cmd("filetype plugin on") -- filetype detection --- vim.opt.guifont = "JetBrainsMono\\ Nerd\\ Font\\ Mono:h18" --- vim.opt.guifont = "Hack\\ Nerd\\ Font\\ Mono" --- vim.opt.guifont = "SauceCodePro Nerd Font:h17" vim.opt.guifont = "FiraCode Nerd Font:h17" --- vim.opt.guifont = "JetBrains\\ Mono\\ Regular\\ Nerd\\ Font\\ Complete" vim.g.vim_markdown_folding_disabled = 1 -vim.g.vimspector_enable_mappings = "HUMAN" -vim.g["test#go#rspec#options"] = { nearest = "--v", suite = "--v" } - -- git blame vim.cmd("highlight default link gitblame SpecialComment") vim.g.gitblame_enabled = 0 --- last position jump -vim.cmd([[ -autocmd BufReadPost * if line("'\"") >= 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif -]]) - -- vim.cmd('let g:nvcode_termcolors=256') -- --local cc = 'gruvbox' -- local cc = 'lunar' diff --git a/nvim/lua/plugins/barbar.lua b/nvim/lua/plugins/barbar.lua index 7d6fbe0..2375a5b 100644 --- a/nvim/lua/plugins/barbar.lua +++ b/nvim/lua/plugins/barbar.lua @@ -1,4 +1,5 @@ return { + { "akinsho/bufferline.nvim", enabled = false }, { -- tabline 'romgrk/barbar.nvim', diff --git a/nvim/lua/plugins/mason.lua b/nvim/lua/plugins/mason.lua index 790ee68..df88b66 100644 --- a/nvim/lua/plugins/mason.lua +++ b/nvim/lua/plugins/mason.lua @@ -9,10 +9,10 @@ return { --"bashls", "shfmt", --"tailwindcss", - "tsserver", -- TypeScript/JavaScript LSP + "typescript-language-server", -- TypeScript/JavaScript LSP "pylyzer", --"cssls", - "bufls", -- Protocol Buffers LSP + "buf", -- Protocol Buffers LSP "gopls", -- Go LSP }) end, diff --git a/nvim/lua/plugins/nvim-cmp.lua b/nvim/lua/plugins/nvim-cmp.lua index 7386b0a..37e3bce 100644 --- a/nvim/lua/plugins/nvim-cmp.lua +++ b/nvim/lua/plugins/nvim-cmp.lua @@ -76,7 +76,7 @@ end return { { "hrsh7th/nvim-cmp", - enable = false, + enabled = false, dependencies = { "hrsh7th/cmp-emoji", 'hrsh7th/vim-vsnip', diff --git a/nvim/lua/plugins/nvim-dap-go.lua b/nvim/lua/plugins/nvim-dap-go.lua index bc56eed..bc8abcb 100644 --- a/nvim/lua/plugins/nvim-dap-go.lua +++ b/nvim/lua/plugins/nvim-dap-go.lua @@ -1,7 +1,7 @@ return { "leoluz/nvim-dap-go", keys = { - { "", function() require("dap").continue({ before = get_args }) end, desc = "Run with Args" }, + { "", function() require("dap").continue() end, desc = "Run/Continue" }, { "",":lua require('dap-go').debug_test()", desc = "Debug Test" }, { "", function() require("dap").toggle_breakpoint() end, desc = "Toggle Breakpoint" }, { "", function() require("dap").step_over() end, desc = "Step Over" }, diff --git a/nvim/lua/plugins/nvim-lspconfig.lua b/nvim/lua/plugins/nvim-lspconfig.lua index bc06994..e54052c 100644 --- a/nvim/lua/plugins/nvim-lspconfig.lua +++ b/nvim/lua/plugins/nvim-lspconfig.lua @@ -1,15 +1,10 @@ return { - -- lsp servers { - "mason-org/mason.nvim", - "mason-org/mason-lspconfig.nvim", "neovim/nvim-lspconfig", - event = { "BufReadPre", "BufReadPost", "BufNewFile" }, opts = { inlay_hints = { enabled = false }, - ---@type lspconfig.options servers = { - bufls = {}, -- Protocol Buffers LSP + buf_ls = {}, cssls = {}, tailwindcss = { root_dir = function(...) @@ -28,7 +23,7 @@ return { )(...) end, }, - tsserver = { + ts_ls = { root_dir = function(...) return require("lspconfig.util").root_pattern( "tsconfig.json", @@ -72,7 +67,6 @@ return { }, }, lua_ls = { - -- enabled = false, single_file_support = true, settings = { Lua = { @@ -83,11 +77,6 @@ return { workspaceWord = true, callSnippet = "Both", }, - misc = { - parameters = { - -- "--log-level=trace", - }, - }, hint = { enable = true, setType = false, @@ -104,7 +93,6 @@ return { }, diagnostics = { disable = { "incomplete-signature-doc", "trailing-space" }, - -- enable = false, groupSeverity = { strong = "Warning", strict = "Warning", @@ -137,7 +125,7 @@ return { }, }, gopls = { - cmd = { "gopls", "serve" }, -- use cmd in path, I can update it easily + cmd = { "gopls", "serve" }, settings = { gopls = { analyses = { @@ -151,9 +139,7 @@ return { }, }, }, - pylsp = { - cmd = { "pylyzer", "--server" }, - filetypes = { "python" }, + pylyzer = { settings = { python = { checkOnType = false, diff --git a/nvim/lua/plugins/render-markdown.lua b/nvim/lua/plugins/render-markdown.lua index 372e642..654b0a2 100644 --- a/nvim/lua/plugins/render-markdown.lua +++ b/nvim/lua/plugins/render-markdown.lua @@ -8,6 +8,9 @@ return { ft = { "markdown", "mdx", "quarto", "rmd", "org" }, ---@module 'render-markdown' ---@type render.md.UserConfig - opts = {}, + opts = { + -- 未安装 tectonic/pdflatex 时关闭 LaTeX 公式渲染,减少健康检查噪音 + latex = { enabled = false }, + }, }, } diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua new file mode 100644 index 0000000..3ab7733 --- /dev/null +++ b/nvim/lua/plugins/snacks.lua @@ -0,0 +1,11 @@ +return { + { + "folke/snacks.nvim", + opts = { + image = { + -- tmux / 部分终端不报 kitty graphics;避免 :checkhealth 里出现 ERROR(仍会 WARN) + force = true, + }, + }, + }, +} diff --git a/nvim/lua/plugins/treesitter.lua b/nvim/lua/plugins/treesitter.lua index 0b3e8a4..916f0c2 100644 --- a/nvim/lua/plugins/treesitter.lua +++ b/nvim/lua/plugins/treesitter.lua @@ -15,17 +15,24 @@ return { "graphql", "html", "java", + "javascript", "json", - "lua", - "markdown", -- render-markdown.nvim + "latex", + -- "lua", "vim", "vimdoc", "query", "markdown" 等由 Neovim 内置, + -- 不在此安装,避免 nvim-treesitter 装的新版 parser 与内置 query 不兼容。 + "norg", "php", "proto", -- Protocol Buffers + "regex", "rust", "scss", "sql", "svelte", "toml", "tsx", + "typescript", + "typst", + "vue", "yaml", }, diff --git a/nvim/lua/utils/debug.lua b/nvim/lua/utils/debug.lua index 136823f..d14310b 100644 --- a/nvim/lua/utils/debug.lua +++ b/nvim/lua/utils/debug.lua @@ -12,7 +12,7 @@ function M.get_loc() end info = info or me local source = info.source:sub(2) - source = vim.loop.fs_realpath(source) or source + source = vim.uv.fs_realpath(source) or source return source .. ":" .. info.linedefined end @@ -47,7 +47,7 @@ function M.dump(...) if vim.tbl_isempty(value) then value = nil else - value = vim.tbl_islist(value) and vim.tbl_count(value) <= 1 and value[1] or value + value = vim.islist(value) and vim.tbl_count(value) <= 1 and value[1] or value end M._dump(value) end diff --git a/nvim/lua/utils/init.lua b/nvim/lua/utils/init.lua index 228fae7..aae2e7a 100644 --- a/nvim/lua/utils/init.lua +++ b/nvim/lua/utils/init.lua @@ -1,212 +1,31 @@ -local lv_utils = {} +local M = {} - --- copy current filepath to clipboard -function lv_utils.yank_filepath() - local p = vim.fn.expand('%:p') - local line = vim.fn.line(".") - p = p..":"..line - print(p) - vim.fn.setreg('+',p) +function M.yank_filepath() + local p = vim.fn.expand("%:p") + local line = vim.fn.line(".") + p = p .. ":" .. line + print(p) + vim.fn.setreg("+", p) end -function lv_utils.yank_file_dir() - local p = vim.fn.expand('%:p:h') - print(p) - vim.fn.setreg('+',p) +function M.yank_file_dir() + local p = vim.fn.expand("%:p:h") + print(p) + vim.fn.setreg("+", p) end - -function lv_utils.open_md() - local p = vim.fn.expand('%:p') - vim.fn.system("open -a marktext "..p) +function M.open_md() + local p = vim.fn.expand("%:p") + vim.fn.system("open -a marktext " .. p) end -function lv_utils.define_augroups(definitions) -- {{{1 - -- Create autocommand groups based on the passed definitions - -- - -- The key will be the name of the group, and each definition - -- within the group should have: - -- 1. Trigger - -- 2. Pattern - -- 3. Text - -- just like how they would normally be defined from Vim itself - for group_name, definition in pairs(definitions) do - vim.cmd('augroup ' .. group_name) - vim.cmd('autocmd!') - - for _, def in pairs(definition) do - local command = table.concat(vim.tbl_flatten {'autocmd', def}, ' ') - vim.cmd(command) - end - - vim.cmd('augroup END') - end +function M.file_exists(name) + local f = io.open(name, "r") + if f ~= nil then + io.close(f) + return true + end + return false end --- lsp - -function lv_utils.add_to_workspace_folder() - vim.lsp.buf.add_workspace_folder() -end - -function lv_utils.clear_references() - vim.lsp.buf.clear_references() -end - -function lv_utils.code_action() - vim.lsp.buf.code_action() -end - -function lv_utils.declaration() - vim.lsp.buf.declaration() - vim.lsp.buf.clear_references() -end - -function lv_utils.definition() - vim.lsp.buf.definition() - vim.lsp.buf.clear_references() -end - -function lv_utils.document_highlight() - vim.lsp.buf.document_highlight() -end - -function lv_utils.document_symbol() - vim.lsp.buf.document_symbol() -end - -function lv_utils.formatting() - vim.lsp.buf.formatting() -end - -function lv_utils.formatting_sync() - vim.lsp.buf.formatting_sync() -end - -function lv_utils.hover() - vim.lsp.buf.hover() -end - -function lv_utils.implementation() - vim.lsp.buf.implementation() -end - -function lv_utils.incoming_calls() - vim.lsp.buf.incoming_calls() -end - -function lv_utils.list_workspace_folders() - vim.lsp.buf.list_workspace_folders() -end - -function lv_utils.outgoing_calls() - vim.lsp.buf.outgoing_calls() -end - -function lv_utils.range_code_action() - vim.lsp.buf.range_code_action() -end - -function lv_utils.range_formatting() - vim.lsp.buf.range_formatting() -end - -function lv_utils.references() - vim.lsp.buf.references() - vim.lsp.buf.clear_references() -end - -function lv_utils.remove_workspace_folder() - vim.lsp.buf.remove_workspace_folder() -end - -function lv_utils.rename() - vim.lsp.buf.rename() -end - -function lv_utils.signature_help() - vim.lsp.buf.signature_help() -end - -function lv_utils.type_definition() - vim.lsp.buf.type_definition() -end - -function lv_utils.workspace_symbol() - vim.lsp.buf.workspace_symbol() -end - --- diagnostic - -function lv_utils.get_all() - vim.lsp.diagnostic.get_all() -end - -function lv_utils.get_next() - vim.lsp.diagnostic.get_next() -end - -function lv_utils.get_prev() - vim.lsp.diagnostic.get_prev() -end - -function lv_utils.goto_next() - vim.lsp.diagnostic.goto_next() -end - -function lv_utils.goto_prev() - vim.lsp.diagnostic.goto_prev() -end - -function lv_utils.show_line_diagnostics() - vim.lsp.diagnostic.show_line_diagnostics() -end - --- git signs - -function lv_utils.next_hunk() - require('gitsigns').next_hunk() -end - -function lv_utils.prev_hunk() - require('gitsigns').prev_hunk() -end - -function lv_utils.stage_hunk() - require('gitsigns').stage_hunk() -end - -function lv_utils.undo_stage_hunk() - require('gitsigns').undo_stage_hunk() -end - -function lv_utils.reset_hunk() - require('gitsigns').reset_hunk() -end - -function lv_utils.reset_buffer() - require('gitsigns').reset_buffer() -end - -function lv_utils.preview_hunk() - require('gitsigns').preview_hunk() -end - -function lv_utils.blame_line() - require('gitsigns').blame_line() -end - --- misc -function lv_utils.file_exists(name) - local f = io.open(name, "r") - if f ~= nil then - io.close(f) - return true - else - return false - end -end - -return lv_utils - +return M