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 文件
502 lines
14 KiB
Bash
502 lines
14 KiB
Bash
#!/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 |