Compare commits
18 Commits
c8ac7b472c
...
默认分支
Author | SHA1 | Date | |
---|---|---|---|
9c864f1939 | |||
e4f4b9e0ff | |||
db303dd17a | |||
3e1a9acae4 | |||
ecd762ba45 | |||
20b7088ded | |||
f7461b8e2a | |||
40219df6aa | |||
52c2191f38 | |||
eea6cc9dce | |||
6f294c246b | |||
2adb9222f9 | |||
f4200e714d | |||
821f363ad7 | |||
69befa7ad0 | |||
9ea3fa2c02 | |||
5b30214eb4 | |||
cb1062ff89 |
@ -1,11 +1,11 @@
|
||||
# 介绍
|
||||
|
||||
欢迎使用 言灵(effective language) 本工具用于在 `龙`(Loong) 架构和其他常用主机架构上的Linux系统中自动配置一个便捷好用的命令行
|
||||
欢迎使用 言灵(effective language) 本工具用于在 `龙架构` 和其他常用主机架构上的Linux系统中自动配置一个便捷好用的命令行
|
||||
使用zsh替代老旧的bash, 使用一些现代化的工具替代老旧工具集, 并且将部分命令添加汉化别名, 避免长时间未使用时遗忘命令
|
||||
|
||||
```bash
|
||||
# 言灵安装命令, 请在命令行中执行如下命令
|
||||
wget -q --show-progress https://gitea.whlug.cn/xunmi/x/raw/start.sh && bash start.sh
|
||||
wget -q --show-progress https://gitea.whlug.cn/LK/YL/raw/YL_start.sh && bash YL_start.sh
|
||||
```
|
||||
|
||||
## 功能实现
|
||||
|
20
start.sh → YL_start.sh
Executable file → Normal file
20
start.sh → YL_start.sh
Executable file → Normal file
@ -2,9 +2,9 @@
|
||||
|
||||
PACK_LIST=("git" "zsh")
|
||||
# 脚本根地址
|
||||
ROOT_URL="https://gitea.whlug.cn/xunmi/x/"
|
||||
ROOT_URL="https://gitea.whlug.cn/LK/x"
|
||||
# 脚本安装默认路径
|
||||
ROOT_INSTALL="/opt/xunmi"
|
||||
ROOT_INSTALL="/usr/share/言灵"
|
||||
|
||||
###############################################################################
|
||||
# 终端配色 #
|
||||
@ -84,8 +84,7 @@ Download_X(){
|
||||
x_dir=$ROOT_INSTALL/x
|
||||
sudo rm -vrf $x_dir
|
||||
sudo git clone $ROOT_URL $x_dir || Show 1 "言灵拉去失败"
|
||||
mkdir -vp $HOME/.config/xunmi
|
||||
echo "言灵一路径=$ROOT_INSTALL" >> $HOME/.config/xunmi/信息
|
||||
echo "言灵一路径=$ROOT_INSTALL" >> $ROOT_INSTALL/信息
|
||||
ColorReset
|
||||
}
|
||||
|
||||
@ -96,5 +95,16 @@ Download_X(){
|
||||
Install_PKG
|
||||
Download_X
|
||||
sudo chown -R $USER:$USER $ROOT_INSTALL
|
||||
[ -f "安装.zsh" ] && zsh 安装.zsh || zsh $x_dir/安装.zsh
|
||||
|
||||
# 删除自己
|
||||
if [ -f "./安装.zsh" ]; then
|
||||
echo "启动调试模式"
|
||||
zsh 安装.zsh -预设 -镜像 -调试
|
||||
else
|
||||
zsh $x_dir/安装.zsh -预设 -镜像
|
||||
rm YL_start.sh
|
||||
fi
|
||||
|
||||
exec zsh
|
||||
|
||||
|
10
公共/函数.zsh
10
公共/函数.zsh
@ -23,11 +23,12 @@ readonly 色彩=(
|
||||
'\e[32m' # 4: 暗绿
|
||||
'\e[33m' # 5: 暗黄
|
||||
'\e[95m' # 6: 亮紫
|
||||
'\e[100m' # 7: 背景灰
|
||||
)
|
||||
|
||||
# 用于规范输出的工具
|
||||
# 例: `输出 0 "执行成功"`; `输出 3 "请及时更新依赖"`
|
||||
# *-* 一 -> 整数 <- 1: 成功(亮绿); 2: 失败(暗红); 3: 信息(绿色); 4: 通知(黄色); 5: 异常(紫色)
|
||||
# *-* 一 -> 整数 <- 0: 成功(亮绿); 1: 失败(暗红); 2: 信息(绿色); 3: 通知(黄色); 4: 异常(紫色)
|
||||
# *-* 二 -> 字符 <- 在命令行输出的字符串
|
||||
输出() {
|
||||
echo -n "($(date +"%Y-%m-%d %H:%M:%S"))"
|
||||
@ -43,6 +44,11 @@ readonly 色彩=(
|
||||
elif (($1 == 4)); then
|
||||
echo -e "${色彩[2]}[${色彩重置}${色彩[6]} 异常 ${色彩重置}${色彩[2]}]${色彩重置} $2"
|
||||
return 1
|
||||
elif (($1 == 5)); then
|
||||
# 传入是否启用调试模式的一个参数
|
||||
if $3; then
|
||||
echo -e "${色彩[2]}[${色彩重置}${色彩[7]} 调试 ${色彩重置}${色彩[2]}]${色彩重置} $2"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@ -127,4 +133,4 @@ readonly 色彩=(
|
||||
包名="$(ls -t | head -n1)"
|
||||
输出 2 "已获取${包名}"
|
||||
解压 ${包名}
|
||||
}
|
||||
}
|
||||
|
@ -17,8 +17,8 @@
|
||||
# 实例 `包管_更新 -n`; `包管_更新 -确认`
|
||||
包管一更新() {
|
||||
if [ -x "$(command -v oma)" ]; then
|
||||
# ${特权} oma refresh
|
||||
${特权} oma update -y
|
||||
${特权} oma refresh
|
||||
# ${特权} oma update -y
|
||||
elif [ -x "$(command -v apt)" ]; then
|
||||
${特权} apt-get update -qq
|
||||
elif [ -x "$(command -v yum)" ]; then
|
||||
@ -34,7 +34,7 @@
|
||||
if [ -x "$(command -v oma)" ]; then
|
||||
# 解决oma找不到软件包返回值还是0的问题, 先搜索一下软件包
|
||||
# 神奇的oma居然不走标准输出(2>&1, 将错误输出重定向到标准输出, 方便管道符处理), 坑人啊
|
||||
${特权} oma search $1 2>&1 | head -n 1 | grep -q '\[完整匹配\]' || return 1
|
||||
${特权} oma search $1 2>&1 | head -n 1 | grep -q '\[*完整匹配*\]' || return 1
|
||||
${特权} oma install -y $1
|
||||
elif [ -x "$(command -v apt)" ]; then
|
||||
${特权} apt -y install $1
|
||||
|
@ -1,9 +1,9 @@
|
||||
#!/usr/bin/zsh
|
||||
|
||||
#####################################
|
||||
# 自动配置常用开发环境 #
|
||||
# 自动配置常用开发环境 #
|
||||
# [x] go #
|
||||
# [ ] rust #
|
||||
# [x] rust #
|
||||
# [ ] java #
|
||||
# [ ] nodejs #
|
||||
#####################################
|
||||
|
205
安装.zsh
205
安装.zsh
@ -9,15 +9,16 @@ source /etc/os-release
|
||||
# 脚本在执行过程中遇到任何非零返回码的命令时立即退出
|
||||
# set -e
|
||||
|
||||
readonly 言灵一版本="v1.0.1"
|
||||
readonly 言灵一版本="v1.1.1"
|
||||
|
||||
|
||||
###############################################################################
|
||||
# 全局变量 #
|
||||
###############################################################################
|
||||
|
||||
typeset -a 通用一包列表=('wget' 'curl' 'git' 'vim' 'ctag')
|
||||
typeset -a 架构一包列表=()
|
||||
typeset -a 通用一包列表=('wget' 'curl' 'git' 'vim')
|
||||
typeset -a 系统一包列表=()
|
||||
|
||||
readonly CPU一架构="$(uname -m)"
|
||||
readonly 系统一类型="$(uname -s)"
|
||||
readonly 系统一版本="$(uname -r)"
|
||||
@ -28,22 +29,48 @@ readonly 系统一发行版一名称=$(echo "${NAME}")
|
||||
# 龙架构区分新旧世界的标志位
|
||||
世界一类型="旧世界"
|
||||
|
||||
用户名=$USER
|
||||
|
||||
if command -v sudo >/dev/null 2>&1; then
|
||||
特权="sudo"
|
||||
else
|
||||
特权=""
|
||||
fi
|
||||
|
||||
typeset -a 预设一默认=("vim" "zsh")
|
||||
readonly 言灵一镜像站="https://gitcode.com"
|
||||
配置一预设=false
|
||||
配置一镜像=false
|
||||
配置一调试=false
|
||||
# 帮助信息
|
||||
帮助一信息=$(cat <<EOF
|
||||
用法: $0 [选项]
|
||||
|
||||
选项:
|
||||
-h, -帮助 显示帮助信息
|
||||
-v, -版本 显示版本信息
|
||||
-Y, -预设 使用预设配置安装 ${预设一默认}
|
||||
-J, -镜像 使用镜像源安装 ${言灵一镜像站}
|
||||
-T, -调试 启动调试符号(会输出一些调试信息)
|
||||
|
||||
示例:
|
||||
$0 -h 显示此帮助信息
|
||||
$0 -Y -J 使用预设配置和镜像源安装
|
||||
|
||||
EOF
|
||||
)
|
||||
|
||||
###############################################################################
|
||||
# 函数/方法 #
|
||||
###############################################################################
|
||||
|
||||
# 调用包管理器批量安装
|
||||
批量安装(){
|
||||
typeset -a 包列表=($@)
|
||||
输出 2 "计划安装列表: ${包列表}"
|
||||
local 包列表=(${(P)1})
|
||||
|
||||
输出 5 "计划安装列表: ${包列表[@]}" $配置一调试
|
||||
for 包 in "${包列表[@]}";do
|
||||
输出 2 "正在安装 -> ${包} <-"
|
||||
输出 5 "开始尝试安装: ${包}" $配置一调试
|
||||
色彩一灰色
|
||||
包管一安装 ${包}
|
||||
色彩一清除
|
||||
@ -54,10 +81,32 @@ fi
|
||||
# *-* -> 位置参数 1 <- 拉取`作者/仓库名`
|
||||
# *-* -> 位置参数 2 <- 保存地址, 保存到本地的哪个路径
|
||||
获取一git(){
|
||||
git镜像="https://gitcode.com/mirrors"
|
||||
色彩一灰色
|
||||
输出 2 "正在拉取 $1 ..."
|
||||
git clone --depth 1 -q ${git镜像}/$1.git $2
|
||||
if [ -z "$2" ]; then
|
||||
输出 2 "正在拉取 $1 ..."
|
||||
else
|
||||
输出 2 "正在拉取 $1($2) ..."
|
||||
fi
|
||||
|
||||
if ${配置一镜像}; then
|
||||
拉去地址="${言灵一镜像站}/$1.git"
|
||||
else
|
||||
拉去地址="https://github.com/$1.git"
|
||||
fi
|
||||
输出 2 "拉去地址: ${拉去地址}"
|
||||
# 出现鉴权则直接退出
|
||||
GIT_TERMINAL_PROMPT=0 git clone --depth 1 -q ${拉去地址} $2
|
||||
if [ $? -eq 0 ]; then
|
||||
输出 0 "仓库拉去成功"
|
||||
else
|
||||
输出 3 "仓库拉去失败"
|
||||
if ${配置一镜像}; then
|
||||
拉去地址="https://gitea.whlug.cn/LK/${1#*/}.git"
|
||||
输出 2 "尝试从龙架构开发者仓库中拉取 ${拉去地址}"
|
||||
git clone --depth 1 -q ${拉去地址} $2
|
||||
fi
|
||||
fi
|
||||
|
||||
色彩一清除
|
||||
}
|
||||
|
||||
@ -68,11 +117,6 @@ fi
|
||||
;;
|
||||
*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
|
||||
@ -100,7 +144,6 @@ fi
|
||||
*debian*)
|
||||
if [[ ${系统一发行版一名称}=="Ubuntu" ]]; then
|
||||
系统一发行版一标识符="乌班图"
|
||||
系统一包列表=('universal-ctags')
|
||||
fi
|
||||
;;
|
||||
*openwrt*)
|
||||
@ -134,14 +177,14 @@ fi
|
||||
fi
|
||||
fi
|
||||
# 将本机信息更新到指定文件
|
||||
配置信息=${目录一配置}/信息
|
||||
rm -v ${配置信息}
|
||||
rm ${配置信息}
|
||||
echo "言灵一路径=${言灵一路径}" >> ${配置信息}
|
||||
echo "言灵一发行系统=${系统一发行版一标识符}" >> ${配置信息}
|
||||
if [[ ${主机一架构} == "龙" ]];then
|
||||
echo "言灵一世界类型=${世界一类型}" >> ${配置信息}
|
||||
fi
|
||||
echo "言灵一系统架构=${主机一架构}" >> ${配置信息}
|
||||
${特权} cp -v ${配置信息} ${言灵一路径}
|
||||
输出 0 "主机信息检测完毕"
|
||||
}
|
||||
|
||||
@ -151,62 +194,64 @@ fi
|
||||
# 下载zsh扩展
|
||||
色彩一灰色
|
||||
配置一路径=${言灵一路径}/oh-my-zsh
|
||||
${特权} rm -vrf ${配置一路径}
|
||||
${特权} rm -rf ${配置一路径}
|
||||
获取一git ohmyzsh/ohmyzsh ${配置一路径}
|
||||
获取一git zsh-users/zsh-autosuggestions ${配置一路径}/custom/plugins/zsh-autosuggestions
|
||||
获取一git zsh-users/zsh-syntax-highlighting ${配置一路径}/custom/plugins/zsh-syntax-highlighting
|
||||
|
||||
${特权} chmod -R 755 ${配置一路径}
|
||||
|
||||
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
|
||||
|
||||
cat "${言灵一路径}/信息" >> "$HOME/.zshrc"
|
||||
cat "${目录一根}/配置/zshrc" >> "$HOME/.zshrc"
|
||||
|
||||
是否 "是否需要将zsh预设配置赋予所有新用户" && ${特权} cp $HOME/.zshrc /etc/skel/.zshrc
|
||||
if 是否 "将Zsh设置为默认命令行"; then
|
||||
chsh -s /usr/bin/zsh
|
||||
输出 0 "已将zsh设置为默认命令行,此设置主要适用于ssh和tty如终端不生效则需要在可视化设置中手动配置启动时加载 '/usr/bin/zsh' "
|
||||
if [ -f /bin/zsh ]; then
|
||||
chsh -s /bin/zsh
|
||||
elif [ -f /usr/bin/zsh ]; then
|
||||
chsh -s /usr/bin/zsh
|
||||
else
|
||||
输出 3 "在常用位置未找到zsh, 请手动使用 chsh -s [zsh绝对路径] 配置 "
|
||||
fi
|
||||
输出 0 "此设置主要适用于ssh和tty如终端不生效则需要在可视化设置中手动配置启动时加载 '/usr/bin/zsh' "
|
||||
else
|
||||
输出 2 "如需将zsh设置为默认命令行请执行: 'chsh -s /usr/bin/zsh' "
|
||||
fi
|
||||
色彩一清除
|
||||
${特权} chown -R root:root ${配置一路径}
|
||||
输出 0 "Zsh优化完成"
|
||||
}
|
||||
|
||||
优化一常用命令一vim(){
|
||||
输出 2 "启动vim优化, 安装代码检查和树状目录插件, 并优化配置(具体配置可以查看 $HOME/.vimrc 文件)"
|
||||
vim一配置路径=$HOME/.vim/pack/xunmi
|
||||
|
||||
# 安装tag
|
||||
标签包名=('universal-ctags' 'ctags')
|
||||
批量安装 标签包名 && 输出 0 "VIM必要依赖标签安装完毕"
|
||||
|
||||
vim一配置路径=/usr/share/vim/vimfiles/pack/言灵
|
||||
色彩一灰色
|
||||
if [ -f $HOME/.vimrc ]; then
|
||||
mv $HOME/.vimrc $HOME/.vimrc.old
|
||||
if [ -f /etc/vim/vimrc ]; then
|
||||
${特权} mv /etc/vim/vimrc /etc/vim/vimrc.old
|
||||
fi
|
||||
cp -v ${目录一根}/配置/vimrc $HOME/.vimrc
|
||||
rm -vrf ${vim一配置路径}
|
||||
mkdir -vp ${vim一配置路径}/{opt,start}
|
||||
vim说明=${目录一根}/配置/vim配置说明.vim
|
||||
${特权} cp -v ${目录一根}/配置/vimrc /etc/vim/vimrc
|
||||
${特权} rm -rf ${vim一配置路径}
|
||||
${特权} mkdir -vp ${vim一配置路径}/{opt,start}
|
||||
获取一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 airblade/vim-gitgutter ${vim一配置路径}/start/Git插件
|
||||
获取一git ludovicchabant/vim-gutentags ${vim一配置路径}/start/Tag生成器
|
||||
获取一git preservim/tagbar ${vim一配置路径}/start/标签栏
|
||||
获取一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优化完成"
|
||||
}
|
||||
|
||||
@ -259,15 +304,24 @@ fi
|
||||
["top"]="使用xmtop替代老旧的top系统信息监控功能"
|
||||
#["sed"]="使用学习成本较低的sd替代sed"
|
||||
)
|
||||
输出 2 "正在优化 ${(k)列表} 命令"
|
||||
# 遍历关联数组
|
||||
for 键 值 in ${(kv)列表}; do
|
||||
if 是否 "是否启动 '${键}' 命令优化 -> ${值} <- "; then
|
||||
优化一常用命令一${键}
|
||||
else
|
||||
输出 3 "已取消 ${键} 的优化"
|
||||
fi
|
||||
done
|
||||
# 查看预设是否被启动
|
||||
if ${配置一预设}; then
|
||||
输出 2 "正在优化 ${预设一默认} 命令"
|
||||
for 默认 in "${预设一默认[@]}";do
|
||||
echo "正在启动 ${默认} 优化, ->${列表[$默认]}<-"
|
||||
优化一常用命令一${默认}
|
||||
done
|
||||
else
|
||||
输出 2 "正在优化 ${(k)列表} 命令"
|
||||
# 遍历关联数组
|
||||
for 键 值 in ${(kv)列表}; do
|
||||
if 是否 "是否启动 '${键}' 命令优化 -> ${值} <- "; then
|
||||
优化一常用命令一${键}
|
||||
else
|
||||
输出 3 "已取消 ${键} 的优化"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
@ -280,8 +334,8 @@ echo "
|
||||
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
|
||||
"
|
||||
目录一根=$PWD
|
||||
目录一配置=$HOME/.config/xunmi
|
||||
source ${目录一配置}/信息
|
||||
配置信息="/usr/share/言灵/信息"
|
||||
source ${配置信息}
|
||||
# 判断当前执行的位置 如果不再项目路径中就去寻找路径
|
||||
if [ ! -f "公共/函数.zsh" ]; then
|
||||
目录一根=${言灵一路径}/x
|
||||
@ -292,14 +346,47 @@ echo "执行目录: ${目录一根}"
|
||||
[[ ${言灵一函数} == 1 ]] || . ${目录一根}/公共/函数.zsh || exit 2 && 输出 0 "公共函数模块初始化完成"
|
||||
[[ ${言灵一包管} == 1 ]] || . ${目录一根}/公共/包管.zsh || exit 3 && 输出 0 "包管理器模块初始化完成"
|
||||
|
||||
# 处理用户输入
|
||||
# 使用 case 语句检查命令行参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-h | -帮助 | --help )
|
||||
echo "\n*-*-*-*-*-*-*-*-*-*-*-*-*-*\n"${帮助一信息}
|
||||
exit 0
|
||||
;;
|
||||
-v | -版本 | --version )
|
||||
echo "版本号:${言灵一版本}"
|
||||
exit 0
|
||||
;;
|
||||
-Y | -预设)
|
||||
输出 2 "启用预设模式"
|
||||
配置一预设=true
|
||||
;;
|
||||
-J | -镜像)
|
||||
输出 2 "启动镜像下载"
|
||||
配置一镜像=true
|
||||
;;
|
||||
-T | -调试)
|
||||
输出 2 "启动镜像下载"
|
||||
配置一调试=true
|
||||
;;
|
||||
*)
|
||||
输出 4 "未知选项 -> $1 <- "
|
||||
echo ${帮助一信息}
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
配置检测
|
||||
|
||||
[[ ${#通用一包列表} -ne 0 ]] && 批量安装 ${通用一包列表[@]} && 输出 0 "通用包安装完毕"
|
||||
[[ ${#架构一包列表} -ne 0 ]] && 批量安装 ${架构一包列表[@]} && 输出 0 "架构专用包安装完毕"
|
||||
[[ ${#系统一包列表} -ne 0 ]] && 批量安装 ${系统一包列表[@]} && 输出 0 "系统发行版专用包安装完毕"
|
||||
[[ ${#通用一包列表} -ne 0 ]] && 批量安装 通用一包列表 && 输出 0 "通用包安装完毕"
|
||||
[[ ${#系统一包列表} -ne 0 ]] && 批量安装 系统一包列表 && 输出 0 "系统发行版专用包安装完毕"
|
||||
|
||||
优化一常用命令
|
||||
# 配置一开发环境
|
||||
|
||||
echo "言灵一本地版本=${言灵一版本}" >> ${目录一配置}/信息
|
||||
echo "言灵一本地版本=${言灵一版本}" >> ${配置信息}
|
||||
|
||||
输出 0 "已成功安装 言灵 ${言灵一版本}"
|
||||
|
60
定制/AOSC-初始化.zsh
Normal file
60
定制/AOSC-初始化.zsh
Normal file
@ -0,0 +1,60 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
sudo oma remove v2ray v2ray-rules-dat clash mihomo linux+kernel
|
||||
sudo oma remove "linux-kernel-6*"
|
||||
sudo oma autoremove
|
||||
sudo oma install linux+kernel+lts
|
||||
|
||||
用户名="xunmi"
|
||||
while true; do
|
||||
read -r "?请输入用户名(默认:xunmi): "
|
||||
[[ -n $REPLY ]] && 用户名=$REPLY
|
||||
|
||||
# 验证用户名格式
|
||||
if [[ $用户名 =~ ^[a-z_][a-z0-9_-]*$ ]]; then
|
||||
break
|
||||
else
|
||||
echo "错误:用户名只能包含小写字母、数字、下划线和连字符,且不能以数字开头"
|
||||
fi
|
||||
done
|
||||
|
||||
# 从当前用户获取组列表
|
||||
原始组列表=$(id -Gn)
|
||||
|
||||
# 去掉当前用户自己本身的组并将空格变成逗号间隔
|
||||
有效附加组=${(j:,:)${=原始组列表}[2,-1]}
|
||||
|
||||
echo "正在创建用户 ${用户名} ( 配置组: ${有效附加组} ), 请输入当前用户的密码..."
|
||||
if ! sudo useradd -m -s /bin/bash -G ${有效附加组} ${用户名}; then
|
||||
echo "创建用户失败!请检查权限或用户是否已存在" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 设置密码
|
||||
echo "请为 ${用户名} 设置密码:"
|
||||
until sudo passwd $用户名; do
|
||||
echo "密码设置失败,请重试..."
|
||||
done
|
||||
|
||||
# 修改主机名
|
||||
当前主机名=$(</etc/hostname)
|
||||
echo "当前主机名:$当前主机名"
|
||||
read -r "?请输入新主机名(回车保持当前): " 新主机名
|
||||
新主机名=${新主机名:-$当前主机名}
|
||||
|
||||
## 验证主机名格式
|
||||
while [[ ! $新主机名 =~ ^[a-zA-Z0-9-]{1,63}$ ]]; do
|
||||
read -r "?无效格式!请重新输入(仅限字母数字和连字符,最长63字符): " 新主机名
|
||||
done
|
||||
|
||||
if [[ -n "$新主机名" ]]; then
|
||||
if echo "$新主机名" | sudo tee /etc/hostname >/dev/null; then
|
||||
echo "主机名已更新,重启后生效"
|
||||
echo "建议执行:sudo hostnamectl set-hostname $新主机名"
|
||||
else
|
||||
echo "主机名修改失败!" >&2
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "用户 $用户名 创建完成!"
|
||||
|
122
定制/AOSC-磁盘格式化.zsh
Normal file
122
定制/AOSC-磁盘格式化.zsh
Normal file
@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env zsh
|
||||
|
||||
# 磁盘格式化自动化脚本
|
||||
# 功能:检测未格式化磁盘 → 用户选择 → GPT分区 → ext4格式化 → 安全挂载
|
||||
|
||||
(( $UID )) && { echo "请用root运行"; exit 1 }
|
||||
|
||||
# 函数:获取有效挂载点
|
||||
获取挂载点() {
|
||||
local 挂载点
|
||||
while true; do
|
||||
vared -p "请输入挂载点路径(默认 /data): " -c 挂载点
|
||||
挂载点=${挂载点:-/data} # 设置默认值
|
||||
|
||||
# 校验路径格式
|
||||
[[ $挂载点 != /* ]] && echo "错误:必须使用绝对路径" && continue
|
||||
|
||||
# 检查目录状态
|
||||
if [[ -d $挂载点 ]]; then
|
||||
if [[ -n $(ls -A $挂载点 2>/dev/null) ]]; then
|
||||
echo "警告:目录非空!"
|
||||
read -q "确认?[y/n] " || { echo; continue }
|
||||
fi
|
||||
else
|
||||
mkdir -p $挂载点 2>/dev/null || { echo "无法创建目录"; continue }
|
||||
fi
|
||||
break
|
||||
done
|
||||
echo $挂载点
|
||||
}
|
||||
|
||||
选择磁盘() {
|
||||
# 用户选择磁盘
|
||||
echo "可格式化的磁盘:"
|
||||
PS3="请选择磁盘编号: "
|
||||
select 磁盘 in $1; do
|
||||
[[ -n $磁盘 ]] && break || echo "无效选择"
|
||||
done
|
||||
|
||||
while true; do
|
||||
echo -n "确认格式化 $磁盘? [y/n] "
|
||||
read -k 1 确认
|
||||
case $确认 in
|
||||
[Yy]) echo; break ;;
|
||||
[Nn]) echo "\n操作取消"; exit 0 ;;
|
||||
*) echo "\n无效输入,请按 y 或 n" ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 获取未挂载的磁盘
|
||||
未挂载磁盘=($(lsblk -dpno NAME | grep -Ev '/dev/(sr|loop)' | while read dev; do
|
||||
[[ -z $(lsblk -dnfo FSTYPE $dev) ]] && ! grep -q $dev /proc/mounts && echo $dev; done))
|
||||
|
||||
选择磁盘 $未挂载磁盘
|
||||
|
||||
(( ${#未挂载磁盘} == 0 )) && { echo "未找到未挂载的磁盘"; lsblk $磁盘 }
|
||||
echo "请务确认是否要格式化如下磁盘!(按Ctrl+c停止)"; lsblk $磁盘
|
||||
|
||||
总时间=3
|
||||
倒计时=$总时间
|
||||
|
||||
echo -ne "\e[?25l"
|
||||
|
||||
while (( 倒计时 >= 0 )); do
|
||||
# 计算进度长度(0-20)
|
||||
进度=$(( (总时间 - 倒计时) * 20 / 总时间 ))
|
||||
|
||||
# 生成进度条字符串(使用Zsh填充语法)
|
||||
进度条=${(l:进度::▉:)} # 左侧填充方块
|
||||
空白条=${(l:20-进度:: :)} # 右侧填充空格
|
||||
|
||||
# 修复printf格式字符串
|
||||
printf "\r[%s%s] %2d 秒 " $进度条 $空白条 $倒计时
|
||||
|
||||
(( 倒计时-- ))
|
||||
sleep 1
|
||||
done
|
||||
|
||||
echo -e "\a\n\e[32m▶ 开始格式化!\e[0m"
|
||||
echo -ne "\e[?25h"
|
||||
|
||||
# 创建分区
|
||||
echo "\n正在创建GPT分区..."
|
||||
parted -s $磁盘 mklabel gpt && parted -s -a optimal $磁盘 mkpart primary 0% 100% || {
|
||||
echo "分区失败"; exit 1
|
||||
}
|
||||
分区="${磁盘}1"
|
||||
sleep 2
|
||||
|
||||
# 格式化
|
||||
echo "正在格式化为ext4..."
|
||||
mkfs.ext4 -F $分区 || { echo "格式化失败"; exit 1 }
|
||||
|
||||
# 准备挂载
|
||||
挂载点=$(获取挂载点)
|
||||
echo "设置挂载点为:$挂载点"
|
||||
|
||||
UUID=$(blkid -s UUID -o value $分区)
|
||||
|
||||
# 备份fstab
|
||||
echo "\n备份/etc/fstab -> /etc/fstab.bak"
|
||||
cp /etc/fstab{,.bak}
|
||||
|
||||
# 安全挂载
|
||||
{
|
||||
echo "\n# 由自动化脚本添加 $(date)" >> /etc/fstab
|
||||
echo "UUID=$UUID $挂载点 ext4 defaults 0 2" >> /etc/fstab
|
||||
|
||||
if mount -a; then
|
||||
echo "\n挂载成功!"
|
||||
df -h $挂载点
|
||||
else
|
||||
echo "\n挂载失败,正在恢复备份..."
|
||||
mv /etc/fstab.bak /etc/fstab
|
||||
echo "已恢复原始fstab配置"
|
||||
exit 1
|
||||
fi
|
||||
} always {
|
||||
echo "\n操作完成"
|
||||
}
|
||||
|
@ -1,5 +1,10 @@
|
||||
# 更新环境
|
||||
pacman -Syu
|
||||
pkgfile --update
|
||||
|
||||
# 清理pacman的下载缓存
|
||||
## 清理时保留最近一个版本的包
|
||||
paccache -rk1
|
||||
## 清理所有以及卸载的包
|
||||
paccache -ruk0
|
||||
|
@ -1,2 +0,0 @@
|
||||
pacman -Syu
|
||||
pkgfile --update
|
@ -1,196 +0,0 @@
|
||||
#!/usr/bin/bash
|
||||
|
||||
###############################################################################
|
||||
# 变量 #
|
||||
###############################################################################
|
||||
|
||||
# 将终端的输出重置为默认设置,并且不会换行(用于重置终端的字体颜色、背景色和文本样式等设置)
|
||||
echo -e "\e[0m\c"
|
||||
|
||||
# shellcheck disable=SC2016
|
||||
|
||||
# 脚本在执行过程中遇到任何非零返回码的命令时立即退出
|
||||
set -e
|
||||
|
||||
# 下载域
|
||||
readonly DOWNLOAD_DOMAIN=https://gitea.whlug.cn/
|
||||
# 下载保存路径
|
||||
TMP_ROOT=/tmp/xunmi
|
||||
|
||||
# 读取系统架构和内核信息
|
||||
readonly UNAME_M="$(uname -m)"
|
||||
WorldType="新世界"
|
||||
|
||||
# 加载系统信息
|
||||
source /etc/os-release
|
||||
readonly Release=$(echo "${ID}")
|
||||
readonly ReleaseName=$(echo "${NAME}")
|
||||
|
||||
# 获取项目路径
|
||||
ItemDir=$1
|
||||
|
||||
###############################################################################
|
||||
# 终端配色 #
|
||||
###############################################################################
|
||||
|
||||
# 颜色配置
|
||||
readonly COLOUR_RESET='\e[0m'
|
||||
readonly aCOLOUR=(
|
||||
'\e[38;5;154m' # 0: 亮绿
|
||||
'\e[1m' # 1: 白
|
||||
'\e[90m' # 2: 灰
|
||||
'\e[91m' # 3: 红
|
||||
'\e[32m' # 4: 绿
|
||||
'\e[33m' # 5: 黄
|
||||
)
|
||||
|
||||
Show() {
|
||||
if (($1 == 0)); then
|
||||
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} 成功 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
|
||||
elif (($1 == 1)); then
|
||||
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]} 失败 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
|
||||
exit 1
|
||||
elif (($1 == 2)); then
|
||||
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]} 信息 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
|
||||
elif (($1 == 3)); then
|
||||
echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[5]} 通知 $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2"
|
||||
fi
|
||||
}
|
||||
|
||||
# 灰色信息(处理一些无关紧要的信息, 调用后在没有清除颜色之前会一直使用灰色输出)
|
||||
GreyStart() {
|
||||
echo -e "${aCOLOUR[2]}\c"
|
||||
}
|
||||
|
||||
# 清除颜色(一般和灰色信息连用)
|
||||
ColorReset() {
|
||||
echo -e "$COLOUR_RESET\c"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 函数/方法 #
|
||||
###############################################################################
|
||||
|
||||
# 检查文件是否存在
|
||||
exist_file() {
|
||||
if [ -e "$1" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 识别架构
|
||||
Check_Arch() {
|
||||
case $UNAME_M in
|
||||
*loongarch64*)
|
||||
TARGET_ARCH="loong64"
|
||||
;;
|
||||
*)
|
||||
Show 1 "此模块仅支持 loong64 架构处理器暂不支持 $UNAME_M 架构"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
Show 2 "检测到 $TARGET_ARCH 架构"
|
||||
}
|
||||
|
||||
# 检查发行版和世界信息
|
||||
Check_Distribution() {
|
||||
sType=2
|
||||
notice=""
|
||||
case $Release in
|
||||
*arch*) ;;
|
||||
*Loongnix*);;
|
||||
*openwrt*)
|
||||
Show 1 "暂不支持openwrt"
|
||||
exit 1
|
||||
;;
|
||||
*)
|
||||
sType=3
|
||||
notice="我们尚未在此发行版上进行测试,默认使用新世界文件替换"
|
||||
;;
|
||||
esac
|
||||
WorldNum=$(hexdump -s 48 -C /usr/bin/sh | head -n 1 | awk '{print $2}')
|
||||
if [[ ${WorldNum} == "03" ]]; then
|
||||
WorldType="旧世界"
|
||||
fi
|
||||
Show ${sType} "检测到 ${ReleaseName} 发行版系统, 根据内核版本推断属于 -> ${WorldType} <- 系统 "
|
||||
|
||||
if [[ ${sType} == 1 ]]; then
|
||||
select yn in "Yes" "No"; do
|
||||
case $yn in
|
||||
[yY][eE][sS] | [yY])
|
||||
Show 0 "检查已忽略"
|
||||
break
|
||||
;;
|
||||
[nN][oO] | [nN])
|
||||
Show 1 "已退出安装"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done < /dev/tty # < /dev/tty 用于从终端读取输入信息
|
||||
fi
|
||||
}
|
||||
|
||||
# 下载替换依赖
|
||||
DownloadAndInstall() {
|
||||
PACKAGES=(
|
||||
"${DOWNLOAD_DOMAIN}public/JetBrains_jna/releases/download/1.0/libjnidispatch_${WorldType}.so"
|
||||
"${DOWNLOAD_DOMAIN}public/JetBrains_pty4j/releases/download/1.0/libpty_${WorldType}.so"
|
||||
|
||||
"${DOWNLOAD_DOMAIN}public/JetBrains_fsnotifier/releases/download/1.0/fsnotifier_${WorldType}"
|
||||
)
|
||||
|
||||
# 检测项目路径是否存在
|
||||
exist_file $ItemDir/lib/jna/amd64 || Show 1 "未找到关键路径 '$ItemDir/lib/jna/amd64' 请使用最新版JetBrains"
|
||||
|
||||
rm -rf ${TMP_ROOT}
|
||||
mkdir -p ${TMP_ROOT} || Show 1 "无法创建临时目录"
|
||||
TmpDir=$(mktemp -d -p ${TMP_ROOT} || Show 1 "无法创建临时目录")
|
||||
pushd "${TmpDir}"
|
||||
|
||||
for PACKAGE in "${PACKAGES[@]}"; do
|
||||
Show 2 "下载 ${PACKAGE}..."
|
||||
GreyStart
|
||||
wget -t 3 -q --show-progress -c "${PACKAGE}" || Show 1 "无法下载程序包"
|
||||
ColorReset
|
||||
Show 0 "下载完成"
|
||||
done
|
||||
now=$(date +"%Y%m%d-%H%M%S")
|
||||
exist_file $ItemDir/lib/jna/amd64 || Show 1 "未找到指定路径 $ItemDir"
|
||||
|
||||
Show 2 "开始文件替换"
|
||||
GreyStart
|
||||
mv -nv $ItemDir/lib/jna/amd64/libjnidispatch.so $ItemDir/lib/jna/amd64/libjnidispatch_x86_$now.so
|
||||
cp -v $TmpDir/libjnidispatch_${WorldType}.so $ItemDir/lib/jna/amd64/libjnidispatch.so
|
||||
mkdir -vp $ItemDir/lib/pty4j/linux/loongarch64
|
||||
cp -v $TmpDir/libpty_${WorldType}.so $ItemDir/lib/pty4j/linux/loongarch64/libpty.so
|
||||
cp -v $TmpDir/fsnotifier_${WorldType} ~/.config/JetBrains/fsnotifier
|
||||
chmod -v 755 ~/.config/JetBrains/fsnotifier
|
||||
echo "idea.filewatcher.executable.path=$(readlink -f ~/.config/JetBrains/fsnotifier)" >> $ItemDir/bin/idea.properties
|
||||
ColorReset
|
||||
Show 0 "文件替换完成"
|
||||
}
|
||||
|
||||
###############################################################################
|
||||
# 入口(main) #
|
||||
###############################################################################
|
||||
|
||||
usage() {
|
||||
cat <<-EOF
|
||||
使用方法: "$0 <PATH>"
|
||||
PATH: JetBrains软件解压路径
|
||||
EOF
|
||||
}
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
usage
|
||||
Show 1 "该脚本需要至少一个参数!"
|
||||
fi
|
||||
|
||||
# 检查架构
|
||||
Check_Arch
|
||||
# 检查发行版
|
||||
Check_Distribution
|
||||
# 下载替换依赖
|
||||
DownloadAndInstall
|
7
配置/vimrc
7
配置/vimrc
@ -11,6 +11,7 @@ set encoding=utf-8 " 使用 utf-8 编码
|
||||
set autoindent " 按下回车键后,下一行的缩进会自动跟上一行的缩进保持一致。
|
||||
set smartindent " 智能缩进
|
||||
set tabstop=4 " 按下 Tab 键时,Vim 显示的空格数。
|
||||
set shiftwidth=4 " 设置缩进大小为(和tabstop数值最好一样,配合使用)
|
||||
filetype indent on " 开启文件类型检查,并且载入与该类型对应的缩进规则。
|
||||
filetype on " 开启文件类型检测
|
||||
filetype plugin indent on " 开启文件类型插件检测
|
||||
@ -75,3 +76,9 @@ noremap go :<C-U>Leaderf! rg --recall<CR>
|
||||
" 标签栏
|
||||
nnoremap <C-g> :TagbarToggle<CR>
|
||||
|
||||
" 修复旧世界可能无法使用回退键的问题
|
||||
set backspace=indent,eol,start
|
||||
|
||||
" 当打开一个文件时,跳转到上次编辑的位置
|
||||
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
|
||||
|
||||
|
@ -1,7 +0,0 @@
|
||||
受限于vim特性, 没法做到执行完命令后自动退出, 如果左侧命令执行完毕, 请手动退出(:qa或:x)
|
||||
|
||||
完全不会使用vim请按如下操作:
|
||||
等左侧执行完毕(所有下载和安装结束, 左侧内容超过五秒没发生任何变化)
|
||||
1. 双击两下esc
|
||||
2. 输入`:qa`( 按一下冒号,然后按字母q和a ), 这时候整个vim会退出
|
||||
|
34
配置/zshrc
34
配置/zshrc
@ -1,6 +1,15 @@
|
||||
export ZSH=/etc/oh-my-zsh
|
||||
# 添加环境变量
|
||||
# export PATH=$HOME/bin:/usr/local/bin:$HOME/.local/bin:$PATH
|
||||
# 加载基础变量
|
||||
export ZSH=${言灵一路径}/oh-my-zsh
|
||||
|
||||
# 加载各种开发环境
|
||||
if [[ -d "${配置路径}/开发环境" ]]; then
|
||||
for 开发环境 in "${配置路径}"/开发环境/*.zsh; do
|
||||
source "$开发环境"
|
||||
done
|
||||
fi
|
||||
|
||||
# 添加环境变量(python很喜欢将一些可执行文件放在这个位置)
|
||||
export PATH=/usr/local/bin:$HOME/.local/bin:$PATH
|
||||
|
||||
# zsh 主题,在线预览 https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
|
||||
# 推荐主题: gnzh、jispwoso[双行: 1 用户名-目录-Git]
|
||||
@ -53,14 +62,23 @@ HIST_STAMPS="yyyy-mm-dd"
|
||||
# 标准插件可以在 `$ZSH/plugins/` 中找到
|
||||
# 自定义插件可以添加到 `$ZSH_CUSTOM/plugins/`
|
||||
# 注意: 太多的插件会降低 shell 启动的速度。
|
||||
# command-not-found当前仅支持debian系
|
||||
# 支持fzf可以尝试使用zsh-interactive-cd,cd目录时可以模糊查找
|
||||
# znt zsh官方出的导航工具:https://github.com/z-shell/zsh-navigation-tools
|
||||
# 官方插件及其功能说明可以查看:https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
|
||||
# 官方插件及其功能说明可以查看: https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins
|
||||
plugins=(
|
||||
git
|
||||
# 强大的目录自动跳转命令, 会记忆你曾经进入过的目录, 用模糊匹配快速进入你想要的目录
|
||||
# 使用方法: z 路径名
|
||||
z
|
||||
# git别名插件
|
||||
git
|
||||
# 双击exc添加sudo
|
||||
sudo
|
||||
# 快速解压工具
|
||||
# 使用方法: x 压缩包
|
||||
extract
|
||||
# command-not-found当前仅支持debian系
|
||||
#command-not-found
|
||||
# 支持fzf可以尝试使用zsh-interactive-cd,cd目录时可以模糊查找
|
||||
#zsh-interactive-cd
|
||||
# znt zsh官方出的导航工具: https://github.com/z-shell/zsh-navigation-tools
|
||||
zsh-navigation-tools
|
||||
zsh-autosuggestions
|
||||
zsh-syntax-highlighting
|
||||
|
Reference in New Issue
Block a user