Mars 6ddba3e722 Initial commit
feat: 完成 Zsh 插件配置脚本的优化和测试 - 修复 autojump 配置冲突 - 清理重复的插件安装 - 优化脚本结构和注释

feat: 优化shell脚本 - 1. 增强错误处理和恢复机制 2. 添加网络连接优化和镜像源支持 3. 改进进度显示和用户交互 4. 优化配置文件管理和备份 5. 改进插件管理机制 6. 增强依赖检查和安装 7. 添加完整的日志记录功能 8. 修复字体安装相关问题

docs: 完善shell、system和utils部分的README文档 - 1. 添加详细的脚本说明和使用方法 2. 补充依赖要求和注意事项 3. 添加常见问题解答 4. 更新版本日志

feat(editor): 优化 neovim 和 nvchad 安装脚本,添加性能优化配置和详细文档

feat: 优化Python开发环境安装脚本,分离基础包和机器学习包,修复virtualenvwrapper配置

feat: 优化开发工具安装脚本,统一使用common.sh中的函数,改进错误处理

fix: 修复DNMP安装脚本,跳过自动配置PHP开发环境

fix: 提交删除的 init.sh 和 mysql.sh 文件
2025-03-25 16:14:03 +08:00

502 lines
14 KiB
Bash
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.

#!/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("<afile>")) | 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