我的终端环境展开脚本 oh-my-zsh和一些配置和一个改良的主题

内容由ai生成,仅在archlinux和ubuntu上测试,虽考虑其他系统但不保证能用

使用部分终端远程连接会有字符宽度问题,如ghostty连接时就必须取消自动建议,因为del符号不会正常转换为ascll的del,所有输入都会变成两份。可以确定正常的是windows/gnome/finalshell/termuis。还有个很简单的轻量级的A开头的一个终端也是正常的。

最终效果

在这里插入图片描述
在这里插入图片描述

配置说明

启用了插件自动建议和语法高亮以及内置的git和extract

使用了改良的主题
禁用默认的环境标志(会将主题顶开,就变丑了),在主题中获取环境名称并显示,同时限制名称长度以免过长。

创建了便捷函数activate和venv函数用户激活和创建并激活虚拟环境。

创建了便捷函数compress,这是与ectract对应的,extract可以用x解压很多文件,所以创建了这个z指令可以压缩各种格式。

一键安装脚本

有注释,也可以照着自己操作,脚本不一定可靠,ai写的。

#!/bin/bash

# 检查是否通过sudo执行
if [ -n "$SUDO_USER" ]; then
    echo "错误:请不要使用sudo执行此脚本。"
    echo "请直接以当前用户身份运行:./$(basename "$0")"
    exit 1
fi

# 检查当前用户是否为sudoer
if sudo -l > /dev/null 2>&1; then
    is_sudoer=true
else
    is_sudoer=false
fi


#选择github代理地址
# 显示选项菜单
echo "请选择GitHub代理地址(直接回车跳过使用默认地址):"
echo "1) https://gitproxy.click/"
echo "2) https://gh-proxy.net/"
echo "3) https://gh.llkk.cc/"
echo "4) 手动输入"
echo "*) 不使用代理(默认)"

# 读取用户输入
read -p "请输入选项编号 (1-4): " choice

# 根据选择设置代理地址
case $choice in
    1)
        proxy="https://gitproxy.click/"
        ;;
    2)
        proxy="https://gh-proxy.net/"
        ;;
    3)
        proxy="https://gh.llkk.cc/"
        ;;
    4)
        read -p "请输入自定义代理地址: " custom_proxy
        # 确保自定义地址以斜杠结尾
        if [[ -n "$custom_proxy" && "${custom_proxy: -1}" != "/" ]]; then
            custom_proxy="${custom_proxy}/"
        fi
        proxy="$custom_proxy"
        ;;
    *)
        proxy=""
        ;;
esac

# 构建新地址
github_address="${proxy}https://github.com"

# 显示选择结果
echo -e "\n已选择代理地址: ${proxy:-无}"
echo "github下载地址: $github_address"

# 检查依赖是否已安装
echo -e "检查依赖是否已安装..."
missing_deps=()
for dep in zsh git curl tar zip unzip xz gzip bzip2; do
    if ! command -v "$dep" &> /dev/null; then
        missing_deps+=("$dep")
    fi
done

# 如果没有缺失依赖就继续,缺失则尝试安装
if [ ${#missing_deps[@]} -eq 0 ]; then
    echo -e "\n所有依赖 (zsh, git, curl) 已安装。"
else
    # 如果有缺失依赖且不是sudoer则报错退出
    if ! $is_sudoer; then
        echo "错误:缺少以下依赖: ${missing_deps[*]}"
        echo "当前用户无sudo权限,请手动安装后重试。"
        exit 1
    fi
    # 安装缺失依赖
	echo "正在安装依赖: ${missing_deps[*]}"

	# 检测包管理器并安装
	if command -v apt-get &> /dev/null; then
		sudo apt-get update
		install_list=()
		for dep in "${missing_deps[@]}"; do
            if [ "$dep" = "xz" ]; then
                install_list+=("xz-utils")
            else
                install_list+=("$dep")
            fi
        done
		sudo apt-get install -y "${install_list[@]}"
	elif command -v dnf &> /dev/null; then
		sudo dnf install -y "${missing_deps[@]}"
	elif command -v yum &> /dev/null; then
		sudo yum install -y "${missing_deps[@]}"
	elif command -v zypper &> /dev/null; then
		sudo zypper install -y "${missing_deps[@]}"
	elif command -v pacman &> /dev/null; then
		sudo pacman -Syu --noconfirm "${missing_deps[@]}"
	else
		echo "错误:不支持的包管理器,请手动安装以下依赖: ${missing_deps[*]}"
		exit 1
	fi

	echo "依赖安装完成!"
fi

# 获取当前用户名和家目录
CURRENT_USER=$(whoami)
USER_HOME=$(eval echo ~$CURRENT_USER)
OHMYZSH_DIR="$USER_HOME/.oh-my-zsh"
ZSH_CUSTOM="${ZSH_CUSTOM:-$OHMYZSH_DIR/custom}"

# 安装oh-my-zsh
echo -e "\n正在安装oh-my-zsh..."
if [ ! -d "$OHMYZSH_DIR" ]; then
    # 下载oh-my-zsh安装脚本
    echo -e "\n下载oh-my-zsh安装脚本"
    echo -e "\n${proxy}https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh"
    curl -OfsSL ${proxy}https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
    # 处理install.sh文件
    if [[ -f "install.sh" ]]; then
        echo -e "\n处理脚本"
        # 替换操作
        if sed --version 2>/dev/null | grep -q GNU; then
            sed -i "s|https://github.com/|$github_address/|g" install.sh
        else  # macOS系统
            sed -i "" "s|https://github.com/|$github_address/|g" install.sh
        fi
	chmod +x ./install.sh
    else
        echo -e "\n错误: install.sh 下载失败,请检查代理地址和网络"
        exit 1
    fi
    echo -e "\n执行oh-my-zsh安装脚本"
    RUNZSH=no ./install.sh
    rm ./install.sh
else
    echo "oh-my-zsh已经安装,跳过安装步骤"
fi

if [ ! -d "$OHMYZSH_DIR" ]; then
    echo -e "\n错误:oh-my-zsh安装失败!"
    exit 1
fi

# 安装插件函数
install_plugin() {
    local repo_url=$1
    local plugin_name=$2
    
    if [ ! -d "$ZSH_CUSTOM/plugins/$plugin_name" ]; then
        echo "正在安装 $plugin_name 插件..."
        git clone ${proxy}${repo_url} "$ZSH_CUSTOM/plugins/$plugin_name"
    else
        echo "$plugin_name 插件已经存在,跳过安装"
    fi
}

# 安装插件
install_plugin "https://github.com/zsh-users/zsh-syntax-highlighting.git" "zsh-syntax-highlighting"
install_plugin "https://github.com/zsh-users/zsh-autosuggestions.git" "zsh-autosuggestions"

# 备份原有的zshrc文件
echo -e "\n正在备份配置文件..."
if [ -f "$USER_HOME/.zshrc" ]; then
    cp "$USER_HOME/.zshrc" "$USER_HOME/.zshrc.bak"
    echo "已备份原有.zshrc文件为.zshrc.bak"
fi

# ======================配置zshrc==========================
echo -e "\n正在配置.zshrc文件..."
cat > "$USER_HOME/.zshrc" << 'EOL'
# oh-my-zsh安装路径
export ZSH="$HOME/.oh-my-zsh"

# 设置主题
ZSH_THEME="xiong-chiamiov"

# 插件设置
plugins=(
    git
    extract
    z
    zsh-syntax-highlighting
    zsh-autosuggestions
)

# 加载oh-my-zsh
source $ZSH/oh-my-zsh.sh

# 禁用默认的python虚拟环境标志
export VIRTUAL_ENV_DISABLE_PROMPT=1
# ==============================================
#                 用户自定义配置          
# ==============================================

#                 python虚拟环境
# ----------------------------------------------

# 已经弃用的旧python虚拟环境激活方式
#alias activate='source $(find . -maxdepth 3 -type f -name "activate" -path "*/bin/activate" -print -quit 2>/dev/null)'

# 创建并激活名为 .venv 的 Python 虚拟环境
venv() {
    # 检查是否已激活虚拟环境
    if [[ -n "$VIRTUAL_ENV" ]]; then
        echo "❌ 当前已经激活环境: $(basename "$VIRTUAL_ENV")"
        echo "   请先使用 'deactivate' 停止当前虚拟环境"
        return 1 2>/dev/null || exit 1
    fi
    if [ -d ".venv" ]; then
        echo "➜ 虚拟环境 .venv 已存在,正在激活..."
        source .venv/bin/activate
    else
        echo "➜ 创建虚拟环境 .venv..."
        python3 -m venv .venv
        source .venv/bin/activate
        echo "✓ 已创建并激活虚拟环境!"
    fi
}

# 智能激活当前目录下的虚拟环境
activate() {
    # 检查是否已激活虚拟环境
    if [[ -n "$VIRTUAL_ENV" ]]; then
        echo "❌ 当前已经激活环境: $(basename "$VIRTUAL_ENV")"
        echo "   请先使用 'deactivate' 停止当前虚拟环境"
        return 1 2>/dev/null || exit 1
    fi
    # 查找所有 bin/activate 文件
    local envs=($(find . -path "*bin/activate" -type f 2>/dev/null))
    
    case ${#envs[@]} in
        0)
            echo "❌ 未找到虚拟环境 (没有找到 bin/activate 文件)"
            return 1
            ;;
        1)
            echo "➜ 找到虚拟环境: ${envs[1]}"
            source "${envs[1]}"
            echo "✓ 已激活虚拟环境"
            ;;
        *)
            echo "📁 找到多个虚拟环境:"
            local i=1
            for env in "${envs[@]}"; do
                echo "  [$i] $(dirname "$(dirname "$env")")"
                ((i++))
            done
            
            echo -n "⌨️  请选择要激活的环境编号 (1-${#envs[@]}): "
            read choice
            
            if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le ${#envs[@]} ]; then
                source "${envs[$choice]}"
                echo "✓ 已激活: $(dirname "$(dirname "${envs[$choice]}")")"
            else
                echo "❌ 无效选择"
                return 1
            fi
            ;;
    esac
}

#                    压缩
# ----------------------------------------------
compress() {
    # 默认设置
    local format="zip"
    local level=""
    local target=""
    local sources=()
    local update_mode=0
    local format_specified=0

    # 解析选项
    while getopts ":gxzb:l:" opt; do
        case $opt in
            g) format="tar.gz"; format_specified=1 ;;
            x) format="tar.xz"; format_specified=1 ;;
            z) format="zip"; format_specified=1 ;;
            b) format="tar.bz2"; format_specified=1 ;;
            l)
                if [[ $OPTARG =~ ^[0-9]$ ]]; then
                    level=$OPTARG
                else
                    echo "❌ 无效压缩级别: $OPTARG (必须是 0-9)"
                    return 1
                fi
                ;;
            \?)
                echo "❌ 无效选项: -$OPTARG"
                return 1
                ;;
            :)
                echo "❌ 选项 -$OPTARG 需要参数"
                return 1
                ;;
        esac
    done
    shift $((OPTIND - 1))

    # 检查参数
    if [[ $# -lt 1 ]]; then
        echo "用法: z [选项] <目标压缩文件> <源文件/目录...>"
        echo "选项:"
        echo "  -z  压缩为 zip 格式 (默认)"
        echo "  -g  压缩为 tar.gz 格式"
        echo "  -x  压缩为 tar.xz 格式"
        echo "  -b  压缩为 tar.bz2 格式"
        echo "  -l [0-9]  设置压缩级别"
        return 1
    fi

    # 获取目标文件名和源文件
    target=$1
    shift
    sources=($@)

    # 检查源文件是否存在
    for src in $sources; do
        if [[ ! -e $src ]]; then
            echo "❌ 源文件不存在: $src"
            return 1
        fi
    done

    # 检测目标文件后缀并自动修正格式
    local target_ext=${target##*.}
    if [[ -n $target_ext && $target_ext != $target ]]; then
        case $target_ext in
            zip)   detected_format="zip" ;;
            gz)    detected_format="tar.gz" ;;
            tgz)   detected_format="tar.gz" ;;
            xz)    detected_format="tar.xz" ;;
            txz)   detected_format="tar.xz" ;;
            bz2)   detected_format="tar.bz2" ;;
            tbz2)  detected_format="tar.bz2" ;;
            *)     detected_format="" ;;
        esac

        if [[ -n $detected_format ]]; then
            # 后缀与选项冲突时警告
            if [[ $format_specified -eq 1 && $detected_format != $format ]]; then
                echo "⚠️  文件后缀 .$target_ext 表示 $detected_format 格式,将覆盖选项指定的 $format 格式"
            fi
            format=$detected_format
        fi
    fi

    # 检查压缩级别支持
    if [[ -n $level ]]; then
        case $format in
            zip|tar.gz|tar.xz|tar.bz2)
                # 有效格式,继续
                ;;
            *)
                echo "⚠️  压缩级别选项对 $format 格式无效,将被忽略"
                level=""
                ;;
        esac
    fi

    # 检查目标文件是否存在
    if [[ -e $target ]]; then
        echo "➜ 更新现有压缩文件: $target"
        update_mode=1
    else
        echo "➜ 创建新压缩文件: $target"
    fi

    # 执行压缩操作
    case $format in
        zip)
            local zip_opts=""
            if [[ -n $level ]]; then
                zip_opts="-$level"
            fi

            if [[ $update_mode -eq 1 ]]; then
                zip $zip_opts -u -r $target $sources
            else
                zip $zip_opts -r $target $sources
            fi
            ;;

        tar.gz)
            local gz_opts=""
            if [[ -n $level ]]; then
                gz_opts="--fast"  # 默认级别
                if [[ $level -gt 1 ]]; then
                    gz_opts="-$level"
                fi
            fi

            if [[ $update_mode -eq 1 ]]; then
                # Tar 不支持直接更新,需要解压后重新压缩
                echo "⚠️  tar 格式不支持直接更新,创建新文件: $target.new"
                tar --delete -f $target $sources 2>/dev/null
                tar $gz_opts -cvzf $target.new $sources
                mv $target.new $target
            else
                tar $gz_opts -cvzf $target $sources
            fi
            ;;

        tar.xz)
            local xz_opts=""
            if [[ -n $level ]]; then
                xz_opts="-$level"
            fi

            if [[ $update_mode -eq 1 ]]; then
                echo "⚠️  tar 格式不支持直接更新,创建新文件: $target.new"
                tar --delete -f $target $sources 2>/dev/null
                tar -cvf - $sources | xz $xz_opts > $target.new
                mv $target.new $target
            else
                tar -cvf - $sources | xz $xz_opts > $target
            fi
            ;;

        tar.bz2)
            local bz2_opts=""
            if [[ -n $level ]]; then
                bz2_opts="-$level"
            fi

            if [[ $update_mode -eq 1 ]]; then
                echo "⚠️  tar 格式不支持直接更新,创建新文件: $target.new"
                tar --delete -f $target $sources 2>/dev/null
                tar -cvf - $sources | bzip2 $bz2_opts > $target.new
                mv $target.new $target
            else
                tar -cvf - $sources | bzip2 $bz2_opts > $target
            fi
            ;;

        *)
            echo "❌ 不支持的压缩格式: $format"
            return 1
            ;;
    esac

    # 检查结果
    if [[ $? -eq 0 ]]; then
        echo "✓ 压缩完成: $target ($(du -h $target | cut -f1))"
    else
        echo "❌ 压缩失败"
        return 1
    fi
}
# 创建 z 命令别名
alias z=compress

#                    文件列出
# ----------------------------------------------
alias ll='ls -alFh'
alias la='ls -A'
alias l='ls -CF'
EOL
# ========================================================

# 创建自定义主题
echo -e "\n正在创建自定义主题..."
CUSTOM_THEME_DIR="$ZSH_CUSTOM/themes"
CUSTOM_THEME_NAME="xiong-chiamiov-betterVENV"
CUSTOM_THEME_FILE="$CUSTOM_THEME_DIR/$CUSTOM_THEME_NAME.zsh-theme"

mkdir -p "$CUSTOM_THEME_DIR"

if [ ! -f "$CUSTOM_THEME_FILE" ]; then
    cat > "$CUSTOM_THEME_FILE" << 'EOL'
# 字符串截断函数,保留后n个字符
function truncate_str() {
    local str=$1
    local len=$2
    # 先去除颜色转义序列获取纯文本长度
    local plain_str=$(echo "$str" | sed -E 's/\\e\[[0-9;]*m//g')
    if [ ${#plain_str} -gt $len ]; then
        # 保留原始颜色,仅截断文本部分
	echo "${str:0: 3}...${str: 6-$len}"
    else
        echo "$str"
    fi
}

# 获取可靠的主机名
function get_hostname() {
    local host_name
    # 尝试多种获取主机名的方式
    if command -v hostname &> /dev/null; then
        host_name=$(hostname)
    elif [ -f /etc/hostname ]; then
        host_name=$(cat /etc/hostname)
    else
        host_name=${HOSTNAME:-$(uname -n)}
    fi
    # 去除域名部分(如果有)
    host_name=${host_name%%.*}
    echo "$host_name"
}


# 虚拟环境信息函数
function venv_info() {
    if [ -n "$VIRTUAL_ENV" ]; then
        local venv_name=$(basename "$VIRTUAL_ENV")
        venv_name=$(truncate_str "$venv_name" 20)
        echo "%{\e[0;34m%}%B[%b%{\e[0m%}%{\e[1;90m%}${venv_name}%{\e[0m%}%{\e[0;34m%}%B]%b%{\e[0m%} - "
    else
        echo ""
    fi
}

# 主提示符
PROMPT=$'%{\e[0;34m%}%B┌─[%b%{\e[0m%}%{\e[1;32m%}%n%{\e[1;30m%}@%{\e[0m%}%{\e[0;36m%}$(truncate_str $(get_hostname) 10)%{\e[0;34m%}%B]%b%{\e[0m%} - %b%{\e[0;34m%}%B[%b%{\e[1;37m%}$(truncate_str $(print -P %~) 28)%{\e[0;34m%}%B]%b%{\e[0m%} - %{\e[0;34m%}%B[%b%{\e[0;33m%}'%D{"%b%d %H:%M"}%b$'%{\e[0;34m%}%B]%b%{\e[0m%}
%{\e[0;34m%}%B└─$(venv_info)%{\e[0;34m%}%B[%{\e[1;35m%}$%{\e[0;34m%}%B]>%{\e[0m%}%b '

# 次提示符
PS2=$' \e[0;34m%}%B>%{\e[0m%}%b '
EOL
    echo "已创建空主题模板: $CUSTOM_THEME_FILE"
else
    echo "自定义主题已存在: $CUSTOM_THEME_FILE"
fi

# 设置使用自定义主题
sed -i "s/ZSH_THEME=.*/ZSH_THEME=\"$CUSTOM_THEME_NAME\"/" "$USER_HOME/.zshrc"

# 询问是否将 zsh 设为默认终端
echo -e "\n\033[1m配置 zsh 为默认终端:\033[0m"
read -p "是否将 zsh 设为当前用户的默认 shell?(y/n) " set_default_shell
if [[ $set_default_shell =~ ^[Yy]$ ]]; then
    if command -v zsh &> /dev/null; then
        echo "正在将 zsh 设为默认 shell..."
        chsh -s "$(command -v zsh)" "$USER"
        echo "已成功将 zsh 设为默认 shell。需要重新登录生效。"
    else
        echo "错误: zsh 未安装,无法设置默认 shell。" >&2
    fi
fi

# 询问是否在 bashrc 中添加强化配置
echo -e "\n\033[1m强化 bashrc 配置:\033[0m"
read -p "是否在 ~/.bashrc 中添加自动启动 zsh 的配置?(y/n) " enhance_bashrc
if [[ $enhance_bashrc =~ ^[Yy]$ ]]; then
    echo "正在更新 ~/.bashrc..."
    if ! grep -q "自动启动 zsh" ~/.bashrc; then
        cat >> ~/.bashrc << 'EOL'

# 自动启动 zsh (由 oh-my-zsh 安装脚本添加)
if [ -t 1 ] && [ -z "$ZSH_VERSION" ] && [ -f "$HOME/.oh-my-zsh/oh-my-zsh.sh" ]; then
    export SHELL=$(command -v zsh)
    exec $(command -v zsh) -l
fi
EOL
        echo "已添加强化配置到 ~/.bashrc"
    else
        echo "~/.bashrc 中已存在相关配置,跳过添加。"
    fi
fi

echo -e "\n安装完成!请执行以下操作之一:"
echo "1. 注销后重新登录"
echo "2. 运行 'exec zsh' 立即生效"
echo "3. 使用 'activate' 命令快速激活虚拟环境"

安装依赖

# ubuntu
sudo apt update
sudo apt install -y zsh git curl tar zip unzip xz-utils gzip bzip2

# archlinux
sudo pacman -Syy zsh git curl tar zip unzip xz gzip bzip2

安装oh-my-zsh

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

这里下载下载失败可以使用代理下载这个脚本,然后找到REMOTE=${REMOTE:-https://github.com/${REPO}.gi}这一行,在地址前添加代理地址。

安装插件

# 语法高亮
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ~/.oh-my-zsh/custom/plugins/zsh-syntax-highlighting

# 自动建议
git clone https://github.com/zsh-users/zsh-autosuggestions.git ~/.oh-my-zsh/custom/plugins/zsh-autosuggestions

编写配置文件

# 备份原配置
mv ~/.zshrc ~/.zshrc.bak

# 创建并编写配置
vim ~/.zshrc

编写配置

# oh-my-zsh安装路径
export ZSH="$HOME/.oh-my-zsh"

# 设置主题
ZSH_THEME="xiong-chiamiov"

# 插件设置
plugins=(
    git
    extract
    z
    zsh-syntax-highlighting
    zsh-autosuggestions
)

# 加载oh-my-zsh
source $ZSH/oh-my-zsh.sh

# 禁用默认的python虚拟环境标志
export VIRTUAL_ENV_DISABLE_PROMPT=1
# ==============================================
#                 用户自定义配置          
# ==============================================

#                 python虚拟环境
# ----------------------------------------------

# 已经弃用的旧python虚拟环境激活方式
#alias activate='source $(find . -maxdepth 3 -type f -name "activate" -path "*/bin/activate" -print -quit 2>/dev/null)'

# 创建并激活名为 .venv 的 Python 虚拟环境
venv() {
    # 检查是否已激活虚拟环境
    if [[ -n "$VIRTUAL_ENV" ]]; then
        echo "❌ 当前已经激活环境: $(basename "$VIRTUAL_ENV")"
        echo "   请先使用 'deactivate' 停止当前虚拟环境"
        return 1 2>/dev/null || exit 1
    fi
    if [ -d ".venv" ]; then
        echo "➜ 虚拟环境 .venv 已存在,正在激活..."
        source .venv/bin/activate
    else
        echo "➜ 创建虚拟环境 .venv..."
        python3 -m venv .venv
        source .venv/bin/activate
        echo "✓ 已创建并激活虚拟环境!"
    fi
}

# 智能激活当前目录下的虚拟环境
activate() {
    # 检查是否已激活虚拟环境
    if [[ -n "$VIRTUAL_ENV" ]]; then
        echo "❌ 当前已经激活环境: $(basename "$VIRTUAL_ENV")"
        echo "   请先使用 'deactivate' 停止当前虚拟环境"
        return 1 2>/dev/null || exit 1
    fi
    # 查找所有 bin/activate 文件
    local envs=($(find . -path "*bin/activate" -type f 2>/dev/null))
    
    case ${#envs[@]} in
        0)
            echo "❌ 未找到虚拟环境 (没有找到 bin/activate 文件)"
            return 1
            ;;
        1)
            echo "➜ 找到虚拟环境: ${envs[1]}"
            source "${envs[1]}"
            echo "✓ 已激活虚拟环境"
            ;;
        *)
            echo "📁 找到多个虚拟环境:"
            local i=1
            for env in "${envs[@]}"; do
                echo "  [$i] $(dirname "$(dirname "$env")")"
                ((i++))
            done
            
            echo -n "⌨️  请选择要激活的环境编号 (1-${#envs[@]}): "
            read choice
            
            if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le ${#envs[@]} ]; then
                source "${envs[$choice]}"
                echo "✓ 已激活: $(dirname "$(dirname "${envs[$choice]}")")"
            else
                echo "❌ 无效选择"
                return 1
            fi
            ;;
    esac
}

#                    文件列出
# ----------------------------------------------
alias ll='ls -alFh'
alias la='ls -A'
alias l='ls -CF'

修改主题

打开~/.oh-my-zsh/themes/xiong-chiamiov.zsh-theme文件

# 字符串截断函数,保留后n个字符
function truncate_str() {
    local str=$1
    local len=$2
    # 先去除颜色转义序列获取纯文本长度
    local plain_str=$(echo "$str" | sed -E 's/\\e\[[0-9;]*m//g')
    if [ ${#plain_str} -gt $len ]; then
        # 保留原始颜色,仅截断文本部分
	echo "${str:0: 3}...${str: 6-$len}"
    else
        echo "$str"
    fi
}

# 获取可靠的主机名
function get_hostname() {
    local host_name
    # 尝试多种获取主机名的方式
    if command -v hostname &> /dev/null; then
        host_name=$(hostname)
    elif [ -f /etc/hostname ]; then
        host_name=$(cat /etc/hostname)
    else
        host_name=${HOSTNAME:-$(uname -n)}
    fi
    # 去除域名部分(如果有)
    host_name=${host_name%%.*}
    echo "$host_name"
}


# 虚拟环境信息函数
function venv_info() {
    if [ -n "$VIRTUAL_ENV" ]; then
        local venv_name=$(basename "$VIRTUAL_ENV")
        venv_name=$(truncate_str "$venv_name" 20)
        echo "%{\e[0;34m%}%B[%b%{\e[0m%}%{\e[1;90m%}${venv_name}%{\e[0m%}%{\e[0;34m%}%B]%b%{\e[0m%} - "
    else
        echo ""
    fi
}

# 主提示符
PROMPT=$'%{\e[0;34m%}%B┌─[%b%{\e[0m%}%{\e[1;32m%}%n%{\e[1;30m%}@%{\e[0m%}%{\e[0;36m%}$(truncate_str $(get_hostname) 10)%{\e[0;34m%}%B]%b%{\e[0m%} - %b%{\e[0;34m%}%B[%b%{\e[1;37m%}$(truncate_str $(print -P %~) 28)%{\e[0;34m%}%B]%b%{\e[0m%} - %{\e[0;34m%}%B[%b%{\e[0;33m%}'%D{"%b%d %H:%M"}%b$'%{\e[0;34m%}%B]%b%{\e[0m%}
%{\e[0;34m%}%B└─$(venv_info)%{\e[0;34m%}%B[%{\e[1;35m%}$%{\e[0;34m%}%B]>%{\e[0m%}%b '

# 次提示符
PS2=$' \e[0;34m%}%B>%{\e[0m%}%b '




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值