#!/usr/bin/zsh export PATH=/usr/sbin:$PATH # 让apt包管理器处于非交互模式运行 export DEBIAN_FRONTEND=noninteractive # 加载系统配置 source /etc/os-release # 脚本在执行过程中遇到任何非零返回码的命令时立即退出 # set -e readonly 言灵一版本="v1.0.0" ############################################################################### # 全局变量 # ############################################################################### typeset -a 通用一包列表=('wget' 'curl' 'git' 'vim' 'ctag' 'sudo') typeset -a 架构一包列表=() typeset -a 系统一包列表=() readonly CPU一架构="$(uname -m)" readonly 系统一类型="$(uname -s)" readonly 系统一版本="$(uname -r)" # ID_LIKE不为空,则输出ID_LIKE的值,否则输出ID的值 readonly 系统一发行版=$( ([ -n "${ID_LIKE}" ] && echo "${ID_LIKE}") || ([ -n "${ID}" ] && echo "${ID}")) readonly 系统一发行版一名称=$(echo "${NAME}") 系统一发行版一标识="" # 龙架构区分新旧世界的标志位 世界一类型="旧世界" ############################################################################### # 函数/方法 # ############################################################################### # 调用包管理器批量安装 批量安装(){ typeset -a 包列表=($@) 输出 2 "计划安装列表: ${包列表}" for 包 in "${包列表[@]}";do 输出 2 "正在安装 -> ${包} <-" 色彩一灰色 包管一安装 ${包} 色彩一清除 done } # 从git镜像仓库获取依赖 # *-* -> 位置参数 1 <- 拉去`作者/仓库名`, 比如: ohmyzsh/ohmyzsh # *-* -> 位置参数 2 <- 保存地址, 保存到本地的哪个路径 获取一git(){ git镜像="https://gitcode.com/mirrors" 色彩一灰色 输出 2 "正在拉去 $1 ..." git clone --depth 1 -q ${git镜像}/$1.git $2 色彩一清除 } 检查一架构() { case ${CPU一架构} in *x86_64*) 主机一架构="amd64" ;; *loong*) 主机一架构="龙" # 6之前除了5.19以外的所有内核都是旧世界 #if [[ ${系统_版本} =~ ^[3,4,5].+ && !${系统_版本} =~ ^5.19.0-.+ ]]; then # 世界_类型="旧世界" #fi # 使用更高级的方法判断新旧世界 # 龙架构二进制 第四行是43开头是新世界, 03开头是旧世界 世界一类型一标志位=$(hexdump -s 48 -C /usr/bin/sh | head -n 1 | awk '{print $2}') if [[ ${世界一类型一标志位} == "43" ]];then 世界一类型="新世界" fi ;; *) 输出 1 "暂不支持${色彩[3]} ${CPU一架构} ${色彩重置}架构" exit 1 ;; esac 输出 2 "检测到${色彩[1]} ${主机一架构} ${色彩重置}架构" } 检查一发行版() { 未知=0 case ${系统一发行版} in *arch*) ;; *Loongnix*) ;; *aosc*) 系统一发行版一标识符="安同" # 前三个是字体包 系统一包列表=('jetbrains-mono' 'powerline-fonts' 'fantasque-sans-mono-nerd-fonts') ;; *debian*) if [[ ${系统一发行版一名称}=="Ubuntu" ]]; then 系统一发行版一标识符="乌班图" 系统一包列表=('universal-ctags') fi ;; *openwrt*) 输出 1 "暂不支持openwrt" exit 1 ;; *) 未知=1 ;; esac 输出 2 "检测到 ${系统一发行版一名称} (${系统一发行版}) 系统" if [[ ${未知} == 1 ]]; then if 是否 "此发行版尚未验证, 是否尝试继续安装"; then 输出 3 "在尚未验证的系统中安装可能会出现未知问题, 如果部分字体出现 口口口 或者乱码的问题, 请手动安装nerd-fonts字体家族的字体" else 输出 1 "已退出安装" exit 1 fi fi } 配置检测(){ 输出 2 "主机信息检测模块启动" 检查一架构 检查一发行版 # 检查本地版本 if [[ -n ${言灵一本地版本} ]]; then if 版本对比 ${言灵一版本} ${言灵一本地版本}; then 是否 "发现本地版本已是最新版, 是否需要重复安装" || 输出 1 "已退出安装" fi fi # 将本机信息更新到指定文件 配置信息=${目录一配置}/信息 rm -v ${配置信息} echo "言灵一路径=${言灵一路径}" >> ${配置信息} echo "言灵一发行系统=${系统一发行版一标识符}" >> ${配置信息} if [[ ${主机一架构} == "龙" ]];then echo "言灵一世界类型=${世界一类型}" >> ${配置信息} fi echo "言灵一系统架构=${主机一架构}" >> ${配置信息} 输出 0 "主机信息检测完毕" } 优化一常用命令一zsh(){ # 创建下载文件的临时目录 输出 2 "启动zsh优化" # 下载zsh扩展 色彩一灰色 配置一路径=${言灵一路径}/oh-my-zsh sudo rm -vrf ${配置一路径} 获取一git ohmyzsh/ohmyzsh ${配置一路径} 获取一git zsh-users/zsh-autosuggestions ${配置一路径}/custom/plugins/zsh-autosuggestions 获取一git zsh-users/zsh-syntax-highlighting ${配置一路径}/custom/plugins/zsh-syntax-highlighting if [ -f $HOME/.zshrc ]; then mv $HOME/.zshrc $HOME/.zshrc.old fi cp -v ${目录一根}/配置/zshrc $HOME/.zshrc sed -i "s:export ZSH=/etc/oh-my-zsh:export ZSH=${配置一路径}:" $HOME/.zshrc 是否 "是否需要将zsh预设配置赋予所有新用户" && sudo mv $HOME/.zshrc /etc/skel/.zshrc if 是否 "将Zsh设置为默认命令行"; then chsh -s /usr/bin/zsh 输出 0 "已将zsh设置为默认命令行,此设置主要适用于ssh和tty如终端不生效则需要在可视化设置中手动配置启动时加载 '/usr/bin/zsh' " else 输出 2 "如需将zsh设置为默认命令行请执行: 'chsh -s /usr/bin/zsh' " fi 色彩一清除 输出 0 "Zsh优化完成" } 优化一常用命令一vim(){ 输出 2 "启动vim优化, 安装代码检查和树状目录插件, 并优化配置(具体配置可以查看 $HOME/.vimrc 文件)" vim一配置路径=$HOME/.vim/pack/xunmi 色彩一灰色 if [ -f $HOME/.vimrc ]; then mv $HOME/.vimrc $HOME/.vimrc.old fi cp -v ${目录一根}/配置/vimrc $HOME/.vimrc rm -vrf ${vim一配置路径} mkdir -vp ${vim一配置路径}/{opt,start} vim说明=${目录一根}/配置/vim配置说明.vim 获取一git scrooloose/nerdtree ${vim一配置路径}/start/树状目录 获取一git dense-analysis/ale ${vim一配置路径}/start/代码检查工具 获取一git jiangmiao/auto-pairs ${vim一配置路径}/start/括号补齐 获取一git preservim/nerdcommenter ${vim一配置路径}/start/注释工具 获取一git vim-airline/vim-airline ${vim一配置路径}/start/VIM状态栏 获取一git vim-airline/vim-airline-themes ${vim一配置路径}/start/VIM状态栏_皮肤 获取一git Yggdroot/LeaderF ${vim一配置路径}/start/模糊搜索器 # if 是否 "是否启用基于c的模糊搜索(默认使用python, c的性能会好很多)"; then # vim -c ":LeaderfInstallCExtension" ${vim说明} # fi 获取一git ludovicchabant/vim-gutentags ${vim一配置路径}/start/标签生成器 if 是否 "是否需要安装vim代码补全工具(代码补全工具需要nodejs支持, 如找不到nodejs脚本将会自动安装)"; then 输出 2 "默认会安装 shell c/c++ cmake go java json markdown perl python r rust 语言的补全" 色彩一灰色 获取一git neoclide/coc.nvim ${vim一配置路径}/start/代码补全 # todo: 这里调用一个nodejs的检查工具 # 编译和启动 npm -C ${vim一配置路径}/start/代码补全 i && npm -C ${vim一配置路径}/start/代码补全 ci vim -c ":CocInstall coc-sh coc-clangd coc-cmake coc-go coc-json coc-java coc-markdownlint coc-perl coc-pyright coc-r-lsp coc-rls" ${vim说明} # 是否 "是否安装前端相关代码补全工具(html css js/ts vue)" && vim -c ":CocInstall coc-css coc-html coc-tsserver coc-vetur" ${vim说明} fi 色彩一清除 输出 0 "Zsh优化完成" } 优化一常用命令一ls(){ 输出 2 "启动ls优化" 色彩一灰色 if ! 包管一安装 "lsd"; then 是否 "在系统源中未发现lsd, 是否使用cargo安装(需要rust语言, 如系统没有则会自动安装)" || return 201 # todo: 需要判断龙芯旧世界, 旧世界安装的cargo版本过低, 需要从官网下载安装 if ! 包管一安装 "cargo"; then 输出 3 "ls优化失败, 未找到cargo, 请手动安装rust语言及其cargo包管理器后重试" return 202 fi cargo install "lsd" fi sudo ln -vs $HOME/.cargo/bin/lsd /usr/bin/lsd 色彩一清除 if 是否 "将lsd使用别名的方式替代ls"; then 别名='alias ls="lsd"' grep -q "${别名}" "$HOME/.zshrc" || echo ${别名} >> $HOME/.zshrc fi 输出 0 "ls优化完成" } 优化一常用命令一top(){ if [[ ${主机一架构}=="龙" ]]; then xmtop版本="v4.2.1" 输出 2 "开始下载 xmtop-${xmtop版本}-${世界一类型}" xmtop_url="https://gitea.whlug.cn/xunmi/xmtop/releases/download/${xmtop版本}/xmtop_${世界一类型}" sudo wget -t 3 -q --show-progress -c ${xmtop_url} || 输出 5 "无法下载程序包" || return 301 sudo mv -v xmtop_${世界一类型} /usr/bin/xmtop sudo chmod 755 /usr/bin/xmtop else 输出 2 "${主机一架构} 架构, 暂未适配top优化, 推荐手动安装gotop, btop等代替top" fi 输出 0 "xmtop配置完毕,输入xmtop查看效果" } 优化一常用命令(){ # 优化git, 修复git中文显示为8进制风格的问题 git config --global core.quotepath false git config --global core.editor "vim" typeset -A 列表=( ["zsh"]="添加omyzsh, zsh自动补齐, 快速添加sudo, 便捷操作目录, 优化命令行提示符等" ["vim"]="添加常用配置项(允许复制 添加行号 显式当前行等), 常用插件(目录 语法检测)" ["ls"]="使用lsd替代老旧的ls, (lsd是rust编写的兼容ls的目录查看工具, 其丰富的配色和图标可有效增加目录的可读性)" #["cat"]="使用bat替代cat" ["top"]="使用xmtop替代老旧的top系统信息监控功能" #["sed"]="使用学习成本较低的sd替代sed" ) 输出 2 "正在优化 ${(k)列表} 命令" # 遍历关联数组 for 键 值 in ${(kv)列表}; do if 是否 "是否启动 '${键}' 命令优化 -> ${值} <- "; then 优化一常用命令一${键} else 输出 3 "已取消 ${键} 的优化" fi done } ############################################################################### # 主函数(main) # ############################################################################### echo " *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* * 欢迎使用 言灵 配置脚本 * *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* " 目录一根=$PWD 目录一配置=$HOME/.config/xunmi source ${目录一配置}/信息 # 判断当前执行的位置 如果不再项目路径中就去寻找路径 if [ ! -f "公共/函数.zsh" ]; then 目录一根=${言灵一路径}/x fi echo "执行目录: ${目录一根}" # 先检查公共函数是否正常加载 [[ ${言灵一函数} == 1 ]] || . ${目录一根}/公共/函数.zsh || exit 2 && 输出 0 "公共函数模块初始化完成" [[ ${言灵一包管} == 1 ]] || . ${目录一根}/公共/包管.zsh || exit 3 && 输出 0 "包管理器模块初始化完成" 配置检测 [[ ${#通用一包列表} -ne 0 ]] && 批量安装 ${通用一包列表[@]} && 输出 0 "通用包安装完毕" [[ ${#架构一包列表} -ne 0 ]] && 批量安装 ${架构一包列表[@]} && 输出 0 "架构专用包安装完毕" [[ ${#系统一包列表} -ne 0 ]] && 批量安装 ${系统一包列表[@]} && 输出 0 "系统发行版专用包安装完毕" 优化一常用命令 # 配置一开发环境 echo "言灵一本地版本=${言灵一版本}" >> ${目录一配置}/信息 输出 0 "已成功安装 言灵 ${言灵一版本}"