Files
nvim-dotfile/init.lua
2026-01-04 09:14:52 +08:00

364 lines
10 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ~/.config/nvim/init.lua
vim.g.mapleader = " "
-- 基础体验
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.signcolumn = "yes"
vim.opt.termguicolors = true
vim.opt.mouse = "a"
vim.opt.clipboard = "unnamedplus"
vim.opt.updatetime = 250
vim.opt.timeoutlen = 400
-- 缩进(先给一个通用默认)
vim.opt.tabstop = 2
vim.opt.shiftwidth = 2
vim.opt.expandtab = true
vim.opt.smartindent = true
vim.opt.scrolloff = 12
-- 搜索
vim.opt.ignorecase = true
vim.opt.smartcase = true
vim.opt.hlsearch = true
vim.opt.incsearch = true
-- 基本按键
vim.keymap.set("n", "<leader>w", "<cmd>w<cr>", { desc = "save" })
vim.keymap.set("n", "<leader>q", "<cmd>q<cr>", { desc = "quit" })
vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<cr>")
vim.keymap.set("n", "<leader>vs", "<cmd>vsplit<cr>", { desc = "Vertical split" })
vim.keymap.set("n", "<leader>hs", "<cmd>split<cr>", { desc = "Horizontal split" })
vim.keymap.set("n", "<leader>sx", "<cmd>close<cr>", { desc = "Close split" })
vim.keymap.set("n", "<leader>so", "<cmd>only<cr>", { desc = "Only this split" })
vim.keymap.set("i", "jj", "<Esc>", { noremap = true, silent = true})
vim.keymap.set("i", "<M-h>", "<Left>", { noremap = true, silent = true })
vim.keymap.set("i", "<M-j>", "<Down>", { noremap = true, silent = true })
vim.keymap.set("i", "<M-k>", "<Up>", { noremap = true, silent = true })
vim.keymap.set("i", "<M-l>", "<Right>", { noremap = true, silent = true })
vim.keymap.set("n", "<M-j>", ":m .+1<CR>==", { noremap = true, silent = true })
vim.keymap.set("n", "<M-k>", ":m .-2<CR>==", { noremap = true, silent = true })
vim.keymap.set("v", "<M-j>", ":m '>+1<CR>gv=gv", { noremap = true, silent = true })
vim.keymap.set("v", "<M-k>", ":m '<-2<CR>gv=gv", { noremap = true, silent = true })
-- edit vim config --
vim.keymap.set("n", "<leader>ev", function()
vim.cmd("edit " .. vim.fn.stdpath("config") .. "/init.lua")
end, { desc = "Edit init.lua" })
-- source vim config --
vim.keymap.set("n", "<leader>sv", function()
vim.cmd("source" .. vim.fn.stdpath("config") .. "/init.lua")
vim.notify("init.lua reloaded")
end, { desc = "Reload init.lua" })
-- 当前lsp
vim.keymap.set("n", "<leader>lc", function()
print(vim.inspect(vim.lsp.get_clients({ bufnr = 0 })))
end, { desc = "LSP: clients (current buffer)"})
-- 超有用的排错开关:显示报错来源
vim.opt.shortmess:remove("F")
vim.diagnostic.config({
virtual_text = false,
signs = true,
underline = true,
update_in_insert = false,
severity_sort = true,
float = { border = "rounded", source = "if_many"},
})
-- clangd 配置
local caps = vim.lsp.protocol.make_client_capabilities()
local ok, cmp_lsp = pcall(require, "cmp_nvim_lsp")
if ok then
caps = cmp_lsp.default_capabilities(caps)
end
-- clangd
vim.lsp.config("clangd", {
capabilities = caps,
cmd = {
"clangd",
"--background-index",
"--clang-tidy",
"--completion-style=detailed",
"--header-insertion=never",
"--suggest-missing-includes=false",
},
filetypes = { "c", "cpp", "objc", "objcpp", "cuda" },
root_markers = { "compile_commands.json", "compile_flags.txt", ".git", "CMakeLists.txt" },
})
-- Rust
vim.lsp.config("rust_analyzer", {
capabilities = caps,
root_markers = { "Cargo.toml", ".git" },
})
-- Zig
vim.lsp.config("zls", {
capabilities = caps,
root_markers = { "build.zig", "build.zig.zon", ".git"},
})
-- Json
vim.lsp.config("jsonls", {
capabilities = caps,
root_markers = { "package.json", ".git"},
})
-- CMake LSP
vim.lsp.config("cmake", {
capabilities = caps,
cmd = { "cmake-language-server" },
root_markers = { "CMakeLists.txt", ".git" },
filetypes = { "cmake" },
init_options = {
buildDirectory = "build",
},
})
-- GLSL
vim.lsp.config("glslls", {
cmd = { vim.fn.expand("glslls"), "--stdin", "--target-env", "opengl4.5" },
filetypes = {"glsl"},
root_markers = { ".git", "." },
})
vim.filetype.add({
extension = {
vert = "glsl",
frag = "glsl",
comp = "glsl",
geom = "glsl",
tesc = "glsl",
tese = "glsl",
glsl = "glsl",
},
})
-- enable lsp --
vim.lsp.enable({ "clangd", "rust_analyzer", "zls", "jsonls", "glslls", "build"})
-- ===== Auto save on leave =====
vim.api.nvim_create_autocmd({
"BufLeave",
"WinLeave",
"TabLeave",
"InsertLeave",
},{
callback = function()
if vim.bo.modified
and vim.bo.buftype == ""
and vim.fn.expand("%") ~= ""
then
vim.cmd("silent write")
end
end,
})
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(args)
local buf = args.buf
local map = function(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { buffer = buf, desc = desc })
end
map("n", "gd", vim.lsp.buf.definition, "Go to definition")
map("n", "gr", vim.lsp.buf.references, "References")
map("n", "K", vim.lsp.buf.hover, "Hover")
map("n", "<leaner>rn", vim.lsp.buf.rename, "Rename")
map("n", "<leader>ca", vim.lsp.buf.code_action, "Code Action")
map("n", "[d", vim.diagnostic.goto_prev, "Prev diagnostic")
map("n", "]d", vim.diagnostic.goto_next, "Next diagnostic")
map("n", "<leader>e", vim.diagnostic.open_float, "Line diagnostic")
end,
})
-- === lazy.nvim bootstrap ===
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git", "clone", "--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable",
lazypath
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy_bootstrap")
-- === plugins ===
require("lazy").setup({
{ "tpope/vim-sleuth" },
{
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
config = function()
vim.api.nvim_create_autocmd("FileType", {
callback = function(args)
local ft = vim.bo[args.buf].filetype
if ft == "lazy" then
return
end
local lang = vim.treesitter.language.get_lang(ft)
if not lang then
return
end
local ok = pcall(vim.treesitter.get_parser, args.buf, lang)
if ok then
pcall(vim.treesitter.start, args.buf, lang)
end
end,
})
end,
},
{
"hrsh7th/nvim-cmp",
dependencies = {
"hrsh7th/cmp-nvim-lsp",
"hrsh7th/cmp-buffer",
"hrsh7th/cmp-path",
"L3MON4D3/LuaSnip",
"saadparwaiz1/cmp_luasnip",
"rafamadriz/friendly-snippets",
},
config = function()
local cmp = require("cmp")
local luasnip = require("luasnip")
require("luasnip.loaders.from_vscode").lazy_load()
cmp.setup({
snippet = {
expand = function(args) luasnip.lsp_expand(args.body) end,
},
mapping = cmp.mapping.preset.insert({
["<C-Space>"] = cmp.mapping.complete(),
["<CR>"] = cmp.mapping.confirm({ select = true }),
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
else
fallback()
end
end, { "i", "s" }),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, { "i", "s" }),
}),
sources = {
{ name = "nvim_lsp"},
{ name = "luasnip" },
{ name = "path" },
{ name = "buffer" },
},
})
end,
},
{
"stevearc/conform.nvim",
opts = {
formatters_by_ft = {
cpp = { "clang-format" },
c = { "clang-format" },
},
},
config = function(_, opts)
require("conform").setup(opts)
vim.keymap.set({ "n", "v"}, "<leader>f", function()
require("conform").format({ lsp_fallback = true })
end, { desc = "Format" })
end,
},
{
"lewis6991/gitsigns.nvim",
config = function()
require("gitsigns").setup()
end,
},
{
"nvim-telescope/telescope.nvim",
dependencies = { "nvim-lua/plenary.nvim" },
config = function()
local telescope = require("telescope")
telescope.setup({
defaults = {
-- 体验相关
prompt_prefix = "",
selection_caret = " ",
sorting_strategy = "ascending",
layout_config = {
prompt_position = "top",
},
},
})
local builtin = require("telescope.builtin")
-- 常用快捷键
vim.keymap.set("n", "<leader>ff", builtin.find_files, { desc = "Find files" })
vim.keymap.set("n", "<leader>fg", builtin.live_grep, { desc = "Live grep" })
vim.keymap.set("n", "<leader>fb", builtin.buffers, { desc = "Buffers" })
vim.keymap.set("n", "<leader>fh", builtin.help_tags, { desc = "Help tags" })
vim.keymap.set("n", "<leader>fd", builtin.diagnostics,{ desc = "Diagnostics" })
vim.keymap.set("n", "<leader>fs", builtin.lsp_document_symbols, { desc = "Symbols (buffer)" })
vim.keymap.set("n", "<leader>fS", builtin.lsp_workspace_symbols,{ desc = "Symbols (workspace)" })
end,
},
{
"stevearc/oil.nvim",
config = function()
require("oil").setup()
vim.keymap.set("n", "-", "<cmd>Oil<cr>", { desc = "Open parent directory (Oil)" })
vim.api.nvim_create_autocmd("FileType", {
pattern = "oil",
callback = function()
vim.keymap.set("n", "q", "<cmd>bd<cr>", { buffer = true })
end,
})
end
},
{
"echasnovski/mini.pairs",
version = false,
config = function()
require("mini.pairs").setup({
})
end,
},
{
"folke/tokyonight.nvim",
priority = 1000,
config = function()
vim.cmd.colorscheme("tokyonight")
end,
},
{
"stevearc/dressing.nvim",
event = "VeryLazy",
config = function()
require("dressing").setup({
input = {
border = "rounded",
},
select = {
backend = { "builtin" },
},
})
end,
},
})