#!/bin/bash # 导入公共函数 source "$(dirname "$0")/../utils/common.sh" # 设置错误时立即退出 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" } # 检查命令是否存在 check_command() { if ! command -v "$1" &> /dev/null; then log_error "命令 '$1' 未找到,请先安装" exit 1 fi } # 检查是否为root用户 if [ "$EUID" -ne 0 ]; then log_error "请使用root权限运行此脚本" exit 1 fi # 获取当前用户名 CURRENT_USER=$SUDO_USER if [ -z "$CURRENT_USER" ]; then CURRENT_USER=$(who | awk '{print $1}' | head -n1) fi # 设置用户主目录 USER_HOME="/home/$CURRENT_USER" # 检查 Oh My Zsh 是否已安装 if [ ! -d "${USER_HOME}/.oh-my-zsh" ]; then log_error "Oh My Zsh 未安装,请先运行 zsh.sh" exit 1 fi # 安装基础依赖 install_base_dependencies() { log_info "安装基础依赖..." apt-get update apt-get install -y \ ninja-build \ gettext \ cmake \ unzip \ curl \ git \ python3-pip \ python3-venv \ build-essential # 检查基础命令是否安装成功 check_command git check_command cmake check_command python3 check_command pip3 } # 安装Node.js install_nodejs() { log_info "安装Node.js..." # 检查是否已安装 if command -v node &> /dev/null; then local current_version=$(node --version) log_info "Node.js已安装,版本: $current_version" return fi # 安装Node.js mkdir -p /etc/apt/keyrings rm -f /etc/apt/keyrings/nodesource.gpg curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list apt-get update apt-get install -y nodejs # 验证安装 check_command node check_command npm log_info "Node.js 版本: $(node --version)" log_info "npm 版本: $(npm --version)" } # 检查neovim版本 check_neovim() { log_info "检查Neovim是否已安装..." if ! command -v nvim &> /dev/null; then return 1 fi # 检查版本是否 >= 0.10.0 local nvim_version=$(nvim --version | head -n1 | cut -d ' ' -f2) if [ "$(echo -e "${nvim_version}\n0.10.0" | sort -V | head -n1)" != "0.10.0" ]; then log_warn "Neovim版本必须 >= 0.10.0,当前版本: ${nvim_version}" return 1 fi return 0 } # 编译安装neovim install_neovim() { log_info "开始编译安装Neovim..." # 安装编译依赖 apt-get install -y \ ninja-build \ gettext \ cmake \ unzip \ git # 克隆neovim仓库 cd /tmp if [ -d "neovim" ]; then rm -rf neovim fi git clone https://github.com/neovim/neovim cd neovim # 切换到最新版本 git checkout master # 编译安装 make CMAKE_BUILD_TYPE=RelWithDebInfo make install # 清理 cd .. rm -rf neovim } # 安装Python包 install_python_packages() { log_info "安装Python包..." # 创建虚拟环境 su - $CURRENT_USER -c "python3 -m venv ${USER_HOME}/.local/share/nvim/venv" # 激活虚拟环境并安装包 su - $CURRENT_USER -c "source ${USER_HOME}/.local/share/nvim/venv/bin/activate && \ pip install --upgrade pip && \ pip install pynvim black isort flake8 mypy jedi && \ deactivate" } # 安装Node.js包 install_node_packages() { log_info "安装Node.js包..." # 设置npm全局包安装目录 su - $CURRENT_USER -c "mkdir -p ${USER_HOME}/.npm-global" su - $CURRENT_USER -c "npm config set prefix '${USER_HOME}/.npm-global'" # 添加PATH到.zshrc if ! grep -q "HOME/.npm-global/bin" "${USER_HOME}/.zshrc"; then echo 'export PATH=~/.npm-global/bin:$PATH' >> "${USER_HOME}/.zshrc" fi # 设置环境变量以便立即使用 export PATH="${USER_HOME}/.npm-global/bin:$PATH" # 安装全局npm包 su - $CURRENT_USER -c "export PATH=${USER_HOME}/.npm-global/bin:\$PATH && \ npm install -g neovim typescript ts-node prettier eslint" } # 配置Neovim configure_neovim() { log_info "配置Neovim..." # 创建配置目录 mkdir -p ${USER_HOME}/.config/nvim # 创建基本配置 cat > ${USER_HOME}/.config/nvim/init.vim << EOF " 性能优化设置 set nobackup " 禁用备份文件 set nowritebackup " 禁用写入时的备份 set noswapfile " 禁用交换文件 set hidden " 允许在未保存的情况下切换缓冲区 set noshowmode " 不显示当前模式(由状态栏插件显示) set lazyredraw " 延迟重绘以提高性能 set updatetime=300 " 更新时间间隔(默认4000ms太慢) set timeoutlen=500 " 键盘序列等待时间 set synmaxcol=200 " 限制语法高亮的列数以提高性能 set regexpengine=1 " 使用老的正则引擎(更快) set ttyfast " 指示快速终端连接以优化重绘 " 基本UI设置 set number " 显示行号 set relativenumber " 显示相对行号 set signcolumn=yes " 总是显示标记列 set termguicolors " 启用真彩色 set scrolloff=8 " 光标上下保持8行距离 set sidescrolloff=8 " 水平滚动时保持8列距离 set cmdheight=1 " 命令行高度 set shortmess+=c " 不显示补全相关的消息 " 缩进和制表符设置 set expandtab " 使用空格代替制表符 set tabstop=4 " 制表符等于4个空格 set shiftwidth=4 " 缩进等于4个空格 set softtabstop=4 " 退格键一次删除4个空格 set smartindent " 智能缩进 " 搜索设置 set ignorecase " 搜索忽略大小写 set smartcase " 智能大小写搜索 set incsearch " 增量搜索 set nohlsearch " 不高亮搜索结果 " 编码设置 set encoding=utf-8 set fileencoding=utf-8 set termencoding=utf-8 " 系统剪贴板集成 set clipboard=unnamedplus " 文件类型设置 filetype plugin indent on syntax enable " 设置leader键 let mapleader = " " " 创建必要的目录 if !isdirectory(expand('~/.local/share/nvim/backup')) silent! call mkdir(expand('~/.local/share/nvim/backup'), 'p') endif " 性能相关的全局变量 let g:loaded_matchparen = 1 " 禁用括号匹配(提高性能) let g:loaded_matchit = 1 " 禁用扩展的%匹配 let g:loaded_logiPat = 1 " 禁用逻辑模式插件 let g:loaded_rrhelper = 1 " 禁用远程插件帮助 let g:loaded_tarPlugin = 1 " 禁用tar文件插件 let g:loaded_gzip = 1 " 禁用gzip插件 let g:loaded_zipPlugin = 1 " 禁用zip插件 let g:loaded_2html_plugin = 1 " 禁用2html插件 let g:loaded_shada_plugin = 1 " 禁用shada插件 let g:loaded_spellfile_plugin = 1 " 禁用拼写文件插件 let g:loaded_netrw = 1 " 禁用netrw let g:loaded_netrwPlugin = 1 " 禁用netrw插件 let g:loaded_tutor_mode_plugin = 1 " 禁用教程插件 let g:loaded_remote_plugins = 1 " 禁用远程插件 " 文件类型特定的性能优化 augroup performance_optimizations autocmd! " 大文件打开时禁用某些功能 autocmd BufReadPre * let f=getfsize(expand("")) | if f > 100000 || f == -2 | set eventignore+=FileType | setlocal noswapfile bufhidden=unload buftype=nowrite undolevels=-1 | else | set eventignore-=FileType | endif augroup END EOF # 设置权限 chown -R $CURRENT_USER:$CURRENT_USER ${USER_HOME}/.config/nvim } # 安装语言服务器 install_language_servers() { log_info "安装语言服务器..." # 安装各种语言的LSP服务器 su - $CURRENT_USER -c "export PATH=${USER_HOME}/.npm-global/bin:\$PATH && \ npm install -g \ typescript-language-server \ vscode-langservers-extracted \ eslint \ prettier \ bash-language-server" } # 删除旧版本vi remove_old_vi() { log_info "检查并删除旧版本vi..." # 检查是否安装了vim或vi if dpkg -l | grep -qw "vim\|vi"; then log_info "发现旧版本编辑器,正在删除..." apt-get remove -y vim vim-runtime vim-tiny vim-common vim-gui-common apt-get autoremove -y # 删除vim配置 if [ -d "${USER_HOME}/.vim" ]; then mv "${USER_HOME}/.vim" "${USER_HOME}/.vim.bak.$(date +%Y%m%d_%H%M%S)" fi if [ -f "${USER_HOME}/.vimrc" ]; then mv "${USER_HOME}/.vimrc" "${USER_HOME}/.vimrc.bak.$(date +%Y%m%d_%H%M%S)" fi else log_info "未发现旧版本编辑器" fi } # 安装额外的开发工具 install_dev_tools() { log_info "安装开发工具..." # 安装通用开发工具 apt-get install -y \ ripgrep \ fd-find \ universal-ctags \ shellcheck \ yamllint # 创建fd-find软链接 ln -sf $(which fdfind) /usr/local/bin/fd } # 配置Python环境 setup_python_env() { log_info "配置Python环境..." # 安装Python开发工具 apt-get install -y \ python3-dev \ python3-pip \ python3-venv # 创建虚拟环境 su - $CURRENT_USER -c "python3 -m venv ${USER_HOME}/.local/share/nvim/venv" # 安装Python包 su - $CURRENT_USER -c "source ${USER_HOME}/.local/share/nvim/venv/bin/activate && \ pip install --upgrade pip && \ pip install \ pynvim \ black \ isort \ flake8 \ mypy \ jedi \ pylint \ rope \ debugpy && \ deactivate" } # 卸载并清理neovim uninstall_neovim() { log_info "卸载并清理Neovim..." # 停止所有neovim进程 if pgrep -f nvim > /dev/null; then log_info "停止所有Neovim进程..." pkill -f nvim fi # 卸载neovim包 if dpkg -l | grep -q neovim; then log_info "卸载Neovim包..." apt-get remove --purge -y neovim apt-get autoremove -y fi # 删除neovim相关目录和文件 log_info "清理Neovim相关文件..." # 系统级文件 if [ -d "/opt/nvim" ]; then rm -rf /opt/nvim fi if [ -f "/usr/local/bin/nvim" ]; then rm -f /usr/local/bin/nvim fi if [ -d "/usr/local/share/nvim" ]; then rm -rf /usr/local/share/nvim fi if [ -d "/usr/local/lib/nvim" ]; then rm -rf /usr/local/lib/nvim fi if [ -d "/usr/local/lib/lua/5.1/nvim" ]; then rm -rf /usr/local/lib/lua/5.1/nvim fi if [ -d "/usr/local/lib/lua/5.4/nvim" ]; then rm -rf /usr/local/lib/lua/5.4/nvim fi # 用户级文件 if [ -d "${USER_HOME}/.config/nvim" ]; then rm -rf "${USER_HOME}/.config/nvim" fi if [ -d "${USER_HOME}/.local/share/nvim" ]; then rm -rf "${USER_HOME}/.local/share/nvim" fi if [ -d "${USER_HOME}/.local/share/lazy" ]; then rm -rf "${USER_HOME}/.local/share/lazy" fi if [ -d "${USER_HOME}/.local/state/nvim" ]; then rm -rf "${USER_HOME}/.local/state/nvim" fi if [ -d "${USER_HOME}/.cache/nvim" ]; then rm -rf "${USER_HOME}/.cache/nvim" fi # 确保目录权限正确 log_info "修复目录权限..." if [ -d "${USER_HOME}/.config" ]; then chown -R ${CURRENT_USER}:${CURRENT_USER} "${USER_HOME}/.config" fi if [ -d "${USER_HOME}/.local" ]; then chown -R ${CURRENT_USER}:${CURRENT_USER} "${USER_HOME}/.local" fi if [ -d "${USER_HOME}/.cache" ]; then chown -R ${CURRENT_USER}:${CURRENT_USER} "${USER_HOME}/.cache" fi log_success "Neovim已完全卸载并清理" } # 更新主函数 main() { # 检查root权限 check_root # 获取用户信息 get_user_info # 卸载并清理旧版本neovim uninstall_neovim # 删除旧版本vi remove_old_vi # 安装基础依赖 install_base_dependencies # 检查neovim版本 if ! check_neovim; then log_info "Neovim未安装或版本不符合要求,开始编译安装..." if ! install_neovim; then log_error "Neovim安装失败" exit 1 fi else log_success "Neovim已安装且版本符合要求" fi # 安装开发工具 install_dev_tools # 安装Node.js install_nodejs # 配置Python环境 setup_python_env # 安装Node.js包 install_node_packages # 配置Neovim configure_neovim # 安装语言服务器 install_language_servers log_success "Neovim安装完成!" log_info "请运行以下命令使环境变量生效:" log_info "source ~/.zshrc" log_info "然后运行 nvim 来启动编辑器。" # 显示安装的工具版本 log_info "已安装的工具版本:" nvim --version | head -n1 node --version npm --version python3 --version if command -v rg &> /dev/null; then rg --version | head -n1 fi if command -v fd &> /dev/null; then fd --version fi } # 执行主函数 main