792 lines
18 KiB
Bash
792 lines
18 KiB
Bash
#!/bin/bash
|
||
|
||
# 设置错误时立即退出
|
||
set -e
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# 日志函数
|
||
log_info() {
|
||
echo -e "${GREEN}[INFO]${NC} $1"
|
||
}
|
||
|
||
log_warn() {
|
||
echo -e "${YELLOW}[WARN]${NC} $1"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}[ERROR]${NC} $1"
|
||
}
|
||
|
||
# 备份现有配置
|
||
backup_config() {
|
||
log_info "备份现有配置..."
|
||
if [ -d ~/.config/nvim ]; then
|
||
mv ~/.config/nvim ~/.config/nvim.backup
|
||
fi
|
||
}
|
||
|
||
# 安装NvChad
|
||
install_nvchad() {
|
||
log_info "安装NvChad..."
|
||
|
||
# 克隆NvChad仓库
|
||
git clone https://github.com/NvChad/NvChad ~/.config/nvim --depth 1
|
||
|
||
# 创建自定义配置目录
|
||
mkdir -p ~/.config/nvim/lua/custom
|
||
}
|
||
|
||
# 配置NvChad
|
||
configure_nvchad() {
|
||
log_info "配置NvChad..."
|
||
|
||
# 创建自定义配置
|
||
cat > ~/.config/nvim/lua/custom/init.lua << EOF
|
||
local M = {}
|
||
|
||
-- 自定义配置
|
||
M.config = {
|
||
-- 设置主题
|
||
theme = "catppuccin",
|
||
|
||
-- 设置字体
|
||
font = "MesloLGS NF",
|
||
|
||
-- 设置终端
|
||
terminal = "kitty",
|
||
|
||
-- 设置透明度
|
||
transparency = false,
|
||
|
||
-- 设置行号
|
||
line_numbers = true,
|
||
|
||
-- 设置相对行号
|
||
relative_line_numbers = true,
|
||
|
||
-- 设置状态栏
|
||
statusline = {
|
||
theme = "minimal",
|
||
separator_style = "block",
|
||
},
|
||
|
||
-- 设置标签栏
|
||
tabline = {
|
||
theme = "minimal",
|
||
separator_style = "block",
|
||
},
|
||
|
||
-- 设置文件树
|
||
nvimtree = {
|
||
side = "left",
|
||
width = 30,
|
||
},
|
||
|
||
-- 设置窗口
|
||
window = {
|
||
border = "rounded",
|
||
padding = 1,
|
||
},
|
||
|
||
-- 设置补全
|
||
completion = {
|
||
border = "rounded",
|
||
padding = 1,
|
||
},
|
||
|
||
-- 设置诊断
|
||
diagnostics = {
|
||
virtual_text = true,
|
||
signs = true,
|
||
underline = true,
|
||
},
|
||
|
||
-- 设置LSP
|
||
lsp = {
|
||
signature = true,
|
||
virtual_text = true,
|
||
signs = true,
|
||
underline = true,
|
||
},
|
||
|
||
-- 设置格式化
|
||
formatting = {
|
||
timeout_ms = 500,
|
||
async = true,
|
||
quiet = false,
|
||
},
|
||
|
||
-- 设置快捷键
|
||
keymaps = {
|
||
-- 窗口管理
|
||
["<C-h>"] = "<C-w>h",
|
||
["<C-j>"] = "<C-w>j",
|
||
["<C-k>"] = "<C-w>k",
|
||
["<C-l>"] = "<C-w>l",
|
||
["<C-Up>"] = ":resize -2<CR>",
|
||
["<C-Down>"] = ":resize +2<CR>",
|
||
["<C-Left>"] = ":vertical resize -2<CR>",
|
||
["<C-Right>"] = ":vertical resize +2<CR>",
|
||
|
||
-- 标签页管理
|
||
["<S-h>"] = ":bprevious<CR>",
|
||
["<S-l>"] = ":bnext<CR>",
|
||
["<S-q>"] = ":bdelete<CR>",
|
||
|
||
-- 文件树
|
||
["<C-n>"] = ":NvimTreeToggle<CR>",
|
||
|
||
-- 终端
|
||
["<C-t>"] = ":ToggleTerm<CR>",
|
||
|
||
-- 查找
|
||
["<C-p>"] = ":Telescope find_files<CR>",
|
||
["<C-g>"] = ":Telescope live_grep<CR>",
|
||
["<C-b>"] = ":Telescope buffers<CR>",
|
||
["<C-h>"] = ":Telescope help_tags<CR>",
|
||
|
||
-- LSP
|
||
["gd"] = ":lua vim.lsp.buf.definition()<CR>",
|
||
["gr"] = ":lua vim.lsp.buf.references()<CR>",
|
||
["K"] = ":lua vim.lsp.buf.hover()<CR>",
|
||
["<C-k>"] = ":lua vim.lsp.buf.signature_help()<CR>",
|
||
["<leader>rn"] = ":lua vim.lsp.buf.rename()<CR>",
|
||
["<leader>ca"] = ":lua vim.lsp.buf.code_action()<CR>",
|
||
["<leader>d"] = ":lua vim.diagnostic.open_float()<CR>",
|
||
["<leader>f"] = ":lua vim.lsp.buf.formatting()<CR>",
|
||
|
||
-- Git
|
||
["<leader>gs"] = ":Git<CR>",
|
||
["<leader>gc"] = ":Git commit<CR>",
|
||
["<leader>gp"] = ":Git push<CR>",
|
||
["<leader>gl"] = ":Git pull<CR>",
|
||
["<leader>gd"] = ":Git diff<CR>",
|
||
["<leader>gb"] = ":Git blame<CR>",
|
||
},
|
||
}
|
||
|
||
-- 自定义插件
|
||
M.plugins = {
|
||
-- 主题
|
||
{
|
||
"catppuccin/nvim",
|
||
name = "catppuccin",
|
||
priority = 1000,
|
||
config = function()
|
||
vim.cmd.colorscheme "catppuccin"
|
||
end,
|
||
},
|
||
|
||
-- 状态栏
|
||
{
|
||
"nvim-lualine/lualine.nvim",
|
||
config = function()
|
||
require("custom.plugins.lualine")
|
||
end,
|
||
},
|
||
|
||
-- 标签栏
|
||
{
|
||
"akinsho/bufferline.nvim",
|
||
config = function()
|
||
require("custom.plugins.bufferline")
|
||
end,
|
||
},
|
||
|
||
-- 文件树
|
||
{
|
||
"nvim-tree/nvim-tree.lua",
|
||
config = function()
|
||
require("custom.plugins.nvimtree")
|
||
end,
|
||
},
|
||
|
||
-- 终端
|
||
{
|
||
"akinsho/toggleterm.nvim",
|
||
config = function()
|
||
require("custom.plugins.toggleterm")
|
||
end,
|
||
},
|
||
|
||
-- 查找
|
||
{
|
||
"nvim-telescope/telescope.nvim",
|
||
config = function()
|
||
require("custom.plugins.telescope")
|
||
end,
|
||
},
|
||
|
||
-- LSP
|
||
{
|
||
"neovim/nvim-lspconfig",
|
||
config = function()
|
||
require("custom.plugins.lspconfig")
|
||
end,
|
||
},
|
||
|
||
-- 补全
|
||
{
|
||
"hrsh7th/nvim-cmp",
|
||
config = function()
|
||
require("custom.plugins.cmp")
|
||
end,
|
||
},
|
||
|
||
-- 语法高亮
|
||
{
|
||
"nvim-treesitter/nvim-treesitter",
|
||
config = function()
|
||
require("custom.plugins.treesitter")
|
||
end,
|
||
},
|
||
|
||
-- Git
|
||
{
|
||
"lewis6991/gitsigns.nvim",
|
||
config = function()
|
||
require("custom.plugins.gitsigns")
|
||
end,
|
||
},
|
||
{
|
||
"tpope/vim-fugitive",
|
||
},
|
||
|
||
-- 注释
|
||
{
|
||
"numToStr/Comment.nvim",
|
||
config = function()
|
||
require("custom.plugins.comment")
|
||
end,
|
||
},
|
||
|
||
-- 自动配对
|
||
{
|
||
"windwp/nvim-autopairs",
|
||
config = function()
|
||
require("custom.plugins.autopairs")
|
||
end,
|
||
},
|
||
|
||
-- 代码片段
|
||
{
|
||
"L3MON4D3/LuaSnip",
|
||
config = function()
|
||
require("custom.plugins.luasnip")
|
||
end,
|
||
},
|
||
|
||
-- 格式化
|
||
{
|
||
"jose-elias-alvarez/null-ls.nvim",
|
||
config = function()
|
||
require("custom.plugins.null-ls")
|
||
end,
|
||
},
|
||
}
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 创建插件配置目录
|
||
mkdir -p ~/.config/nvim/lua/custom/plugins
|
||
|
||
# 配置状态栏
|
||
cat > ~/.config/nvim/lua/custom/plugins/lualine.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("lualine").setup({
|
||
options = {
|
||
theme = "catppuccin",
|
||
component_separators = { left = "", right = "" },
|
||
section_separators = { left = "", right = "" },
|
||
globalstatus = true,
|
||
},
|
||
sections = {
|
||
lualine_a = {
|
||
{ "mode", separator = { left = "" }, right_padding = 2 },
|
||
},
|
||
lualine_b = {
|
||
"filename",
|
||
"branch",
|
||
"diff",
|
||
"diagnostics",
|
||
},
|
||
lualine_c = {
|
||
"filetype",
|
||
"progress",
|
||
"location",
|
||
},
|
||
lualine_x = {
|
||
"encoding",
|
||
"fileformat",
|
||
"hostname",
|
||
},
|
||
lualine_y = {
|
||
"filesize",
|
||
"filetype",
|
||
},
|
||
lualine_z = {
|
||
{ "datetime", style = "%H:%M" },
|
||
},
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置标签栏
|
||
cat > ~/.config/nvim/lua/custom/plugins/bufferline.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("bufferline").setup({
|
||
options = {
|
||
theme = "catppuccin",
|
||
separator_style = "block",
|
||
always_show_bufferline = true,
|
||
show_buffer_close_icons = true,
|
||
show_close_icon = true,
|
||
show_tab_indicators = true,
|
||
show_duplicate_prefix = true,
|
||
enforce_regular_tabs = true,
|
||
view = "multiwindow",
|
||
show_buffer_icons = true,
|
||
show_tab_indicators = true,
|
||
persist_buffer_sort = true,
|
||
always_show_bufferline = true,
|
||
sort_by = "extension",
|
||
},
|
||
highlights = require("catppuccin.groups.integrations.bufferline").get(),
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置文件树
|
||
cat > ~/.config/nvim/lua/custom/plugins/nvimtree.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("nvim-tree").setup({
|
||
sort_by = "case_sensitive",
|
||
view = {
|
||
width = 30,
|
||
},
|
||
renderer = {
|
||
group_empty = true,
|
||
},
|
||
filters = {
|
||
dotfiles = false,
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置终端
|
||
cat > ~/.config/nvim/lua/custom/plugins/toggleterm.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("toggleterm").setup({
|
||
size = function(term)
|
||
if term.direction == "horizontal" then
|
||
return 15
|
||
elseif term.direction == "vertical" then
|
||
return vim.o.columns * 0.4
|
||
end
|
||
end,
|
||
open_mapping = [[<c-t>]],
|
||
hide_numbers = true,
|
||
shade_filetypes = {},
|
||
shade_terminals = true,
|
||
shading_factor = 2,
|
||
start_in_insert = true,
|
||
insert_mappings = true,
|
||
persist_size = true,
|
||
direction = "float",
|
||
close_on_exit = true,
|
||
shell = vim.o.shell,
|
||
float_opts = {
|
||
border = "curved",
|
||
winblend = 0,
|
||
highlights = {
|
||
border = "Normal",
|
||
background = "Normal",
|
||
},
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置查找
|
||
cat > ~/.config/nvim/lua/custom/plugins/telescope.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("telescope").setup({
|
||
defaults = {
|
||
prompt_prefix = "🔍 ",
|
||
selection_caret = "➜ ",
|
||
path_display = { "smart" },
|
||
file_ignore_patterns = {
|
||
".git/",
|
||
"node_modules/",
|
||
"venv/",
|
||
"__pycache__/",
|
||
".pytest_cache/",
|
||
".mypy_cache/",
|
||
},
|
||
},
|
||
pickers = {
|
||
find_files = {
|
||
theme = "dropdown",
|
||
previewer = false,
|
||
},
|
||
live_grep = {
|
||
theme = "dropdown",
|
||
previewer = false,
|
||
},
|
||
buffers = {
|
||
theme = "dropdown",
|
||
previewer = false,
|
||
},
|
||
help_tags = {
|
||
theme = "dropdown",
|
||
previewer = false,
|
||
},
|
||
},
|
||
extensions = {
|
||
fzf = {
|
||
fuzzy = true,
|
||
override_generic_sorter = true,
|
||
override_file_sorter = true,
|
||
case_mode = "smart_case",
|
||
},
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置LSP
|
||
cat > ~/.config/nvim/lua/custom/plugins/lspconfig.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
local lspconfig = require("lspconfig")
|
||
local capabilities = require("cmp_nvim_lsp").default_capabilities()
|
||
local on_attach = function(client, bufnr)
|
||
local opts = { noremap = true, silent = true, buffer = bufnr }
|
||
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
|
||
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts)
|
||
vim.keymap.set("n", "K", vim.lsp.buf.hover, opts)
|
||
vim.keymap.set("n", "<C-k>", vim.lsp.buf.signature_help, opts)
|
||
vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
|
||
vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)
|
||
vim.keymap.set("n", "<leader>d", vim.diagnostic.open_float, opts)
|
||
vim.keymap.set("n", "<leader>f", vim.lsp.buf.formatting, opts)
|
||
end
|
||
|
||
-- 配置各种语言的LSP服务器
|
||
local servers = {
|
||
"tsserver",
|
||
"html",
|
||
"cssls",
|
||
"jsonls",
|
||
"eslint",
|
||
"tailwindcss",
|
||
"prismals",
|
||
"graphql",
|
||
"yamlls",
|
||
"dockerls",
|
||
"bashls",
|
||
"pyright",
|
||
"gopls",
|
||
"rust_analyzer",
|
||
"lua_ls",
|
||
}
|
||
|
||
for _, lsp in ipairs(servers) do
|
||
lspconfig[lsp].setup({
|
||
capabilities = capabilities,
|
||
on_attach = on_attach,
|
||
})
|
||
end
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置补全
|
||
cat > ~/.config/nvim/lua/custom/plugins/cmp.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
local cmp = require("cmp")
|
||
local luasnip = require("luasnip")
|
||
|
||
cmp.setup({
|
||
snippet = {
|
||
expand = function(args)
|
||
luasnip.lsp_expand(args.body)
|
||
end,
|
||
},
|
||
mapping = {
|
||
["<C-p>"] = cmp.mapping.select_prev_item(),
|
||
["<C-n>"] = cmp.mapping.select_next_item(),
|
||
["<C-d>"] = cmp.mapping.scroll_docs(-4),
|
||
["<C-f>"] = cmp.mapping.scroll_docs(4),
|
||
["<C-Space>"] = cmp.mapping.complete(),
|
||
["<C-e>"] = cmp.mapping.close(),
|
||
["<CR>"] = cmp.mapping.confirm({
|
||
behavior = cmp.ConfirmBehavior.Replace,
|
||
select = true,
|
||
}),
|
||
},
|
||
sources = {
|
||
{ name = "nvim_lsp" },
|
||
{ name = "luasnip" },
|
||
{ name = "buffer" },
|
||
{ name = "path" },
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置语法高亮
|
||
cat > ~/.config/nvim/lua/custom/plugins/treesitter.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("nvim-treesitter.configs").setup({
|
||
ensure_installed = {
|
||
"lua",
|
||
"vim",
|
||
"vimdoc",
|
||
"javascript",
|
||
"typescript",
|
||
"html",
|
||
"css",
|
||
"json",
|
||
"yaml",
|
||
"toml",
|
||
"markdown",
|
||
"bash",
|
||
"python",
|
||
"go",
|
||
"rust",
|
||
},
|
||
highlight = {
|
||
enable = true,
|
||
use_languagetree = true,
|
||
},
|
||
indent = {
|
||
enable = true,
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置Git
|
||
cat > ~/.config/nvim/lua/custom/plugins/gitsigns.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("gitsigns").setup({
|
||
signs = {
|
||
add = { text = "│" },
|
||
change = { text = "│" },
|
||
delete = { text = "_" },
|
||
topdelete = { text = "‾" },
|
||
changedelete = { text = "~" },
|
||
untracked = { text = "┆" },
|
||
},
|
||
signcolumn = true,
|
||
numhl = true,
|
||
linehl = false,
|
||
word_diff = false,
|
||
watch_gitdir = {
|
||
interval = 1000,
|
||
follow_files = true,
|
||
},
|
||
attach_to_untracked = true,
|
||
current_line_blame = false,
|
||
current_line_blame_opts = {
|
||
virt_text = true,
|
||
virt_text_pos = "eol",
|
||
hl_mode = "blend",
|
||
},
|
||
current_line_blame_formatter_opts = {
|
||
relative_time = false,
|
||
},
|
||
sign_priority = 6,
|
||
update_debounce = 100,
|
||
status_formatter = nil,
|
||
preview_config = {
|
||
border = "rounded",
|
||
style = "minimal",
|
||
relative = "cursor",
|
||
row = 0,
|
||
col = 1,
|
||
},
|
||
yadm = {
|
||
enable = false,
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置注释
|
||
cat > ~/.config/nvim/lua/custom/plugins/comment.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("Comment").setup({
|
||
padding = true,
|
||
sticky = true,
|
||
ignore = nil,
|
||
toggler = {
|
||
line = "gcc",
|
||
block = "gbc",
|
||
},
|
||
opleader = {
|
||
line = "gc",
|
||
block = "gb",
|
||
},
|
||
extra = {
|
||
above = "gcO",
|
||
below = "gco",
|
||
eol = "gcA",
|
||
},
|
||
mappings = {
|
||
basic = true,
|
||
extra = true,
|
||
extended = false,
|
||
},
|
||
pre_hook = nil,
|
||
post_hook = nil,
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置自动配对
|
||
cat > ~/.config/nvim/lua/custom/plugins/autopairs.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("nvim-autopairs").setup({
|
||
check_ts = true,
|
||
disable_filetype = { "TelescopePrompt", "spectre_panel" },
|
||
fast_wrap = {
|
||
map = "<M-e>",
|
||
chars = { "{", "[", "(", '"', "'" },
|
||
pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]]], "%s+", ""),
|
||
offset = 0,
|
||
end_key = "$",
|
||
keys = "qwertyuiopzxcvbnmasdfghjkl",
|
||
check_comma = true,
|
||
highlight = "PmenuSel",
|
||
highlight_grey = "LineNr",
|
||
},
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置代码片段
|
||
cat > ~/.config/nvim/lua/custom/plugins/luasnip.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
require("luasnip").setup({
|
||
region_check_events = "CursorMoved,InsertEnter",
|
||
delete_check_events = "TextChanged,InsertLeave",
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
|
||
# 配置格式化
|
||
cat > ~/.config/nvim/lua/custom/plugins/null-ls.lua << EOF
|
||
local M = {}
|
||
|
||
function M.setup()
|
||
local null_ls = require("null-ls")
|
||
|
||
null_ls.setup({
|
||
sources = {
|
||
null_ls.builtins.formatting.prettier,
|
||
null_ls.builtins.formatting.stylua,
|
||
null_ls.builtins.formatting.black,
|
||
null_ls.builtins.formatting.isort,
|
||
null_ls.builtins.formatting.gofmt,
|
||
null_ls.builtins.formatting.rustfmt,
|
||
null_ls.builtins.diagnostics.eslint_d,
|
||
null_ls.builtins.diagnostics.flake8,
|
||
null_ls.builtins.diagnostics.mypy,
|
||
null_ls.builtins.diagnostics.golangci_lint,
|
||
null_ls.builtins.diagnostics.rustc,
|
||
},
|
||
on_attach = function(client, bufnr)
|
||
if client.supports_method("textDocument/formatting") then
|
||
vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr })
|
||
vim.api.nvim_create_autocmd("BufWritePre", {
|
||
group = augroup,
|
||
buffer = bufnr,
|
||
callback = function()
|
||
vim.lsp.buf.format({ bufnr = bufnr })
|
||
end,
|
||
})
|
||
end
|
||
end,
|
||
})
|
||
end
|
||
|
||
return M
|
||
EOF
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
log_info "开始配置NvChad..."
|
||
|
||
# 备份现有配置
|
||
backup_config
|
||
|
||
# 安装NvChad
|
||
install_nvchad
|
||
|
||
# 配置NvChad
|
||
configure_nvchad
|
||
|
||
log_info "NvChad配置完成!"
|
||
log_info "请运行 nvim 来启动编辑器。"
|
||
log_info "首次启动时会自动安装插件。"
|
||
}
|
||
|
||
# 执行主函数
|
||
main |