编辑命令行提示符 prompt,支持显示 git 分支、标签等信息

实时在 Linhieng/current--Microsoft.PowerShell_profile.ps1 上更新

打开 $Profile 文件,将下面内容粘贴到其中即可:

powershell 复制代码
<# 负责打印 git 分支相关信息
    支持输出以下信息:
        当前分支,或者是 hash 值
        当前目录是否为 git 子目录
        当前是否有提交历史
#>
function write_host_git_branch {
    # 在这里,能确保是一个 git 仓库,或者是一个 git 仓库中的子目录


    # 获取当前 HEAD 所在分支名。如果当前是 detached HEAD 状态,则显示为 hash。
    $git_branch = git symbolic-ref --short --quiet HEAD
    Write-Host "(" -ForegroundColor "DarkGray" -NoNewline
    if ( $null -eq $git_branch ) {
        $hash = git rev-parse --short HEAD
        Write-Host $hash -ForegroundColor "red" -NoNewline
    } else {
        Write-Host $git_branch -ForegroundColor "blue" -NoNewline
    }
    Write-Host ") " -ForegroundColor "DarkGray" -NoNewline


    if (
        # 如果当前目录没有 .git 文件夹,说明当前是在 git 仓库的子目录
        $false -eq (Test-Path .git)
    ) {
        Write-Host "sub " -ForegroundColor "DarkGray" -NoNewline
    }



    $git_log = git log 2>&1
    if (
        # 命令执行失败
        $? -eq $false
    ) {
        write_host_not_commits($git_log)
    }


    $tags = git tag --points-at HEAD
    if (
        $null -ne $tags
    ) {
        $tags_one_line =  ($tags -split '\r?\n') -join ', '
        Write-Host "[" -ForegroundColor "DarkGray" -NoNewline
        Write-Host "$tags_one_line" -ForegroundColor "DarkYellow" -NoNewline
        Write-Host "] " -ForegroundColor "DarkGray" -NoNewline
    }


    # 打印子模块相关信息会有性能问题
    # $submodule = git submodule status 2>&1
}

function write_host_not_commits($git_log) {
    $error_message = ($git_log.Exception.Message | Select-Object -First 1).Trim()
    if (
        $true -eq $error_message.EndsWith("does not have any commits yet")
    ) {
        Write-Host "not commits yet"  -ForegroundColor "red" -NoNewline
    } else {
        Write-Host "❌fatal: $error_message" -ForegroundColor "red" -NoNewline
    }
    return
}

function wirte_host_git_wrong($git_output) {
    # 转换为字符串对象,并只获取第一行的内容
    $error_message = ($git_output.Exception.Message | Select-Object -First 1).Trim()

    # 检查输出是否以指定的前缀开头
    if (
        # 空(非 git 仓库)
        $true -eq $error_message.StartsWith("fatal: not a git repository")
    ) {
        Write-Host "" -NoNewline
    } elseif (
        # 不安全的仓库
        $true -eq $error_message.StartsWith("fatal: detected dubious ownership")
    ) {
        Write-Host "❌fatal: detected dubious ownership" -ForegroundColor "red" -NoNewline
    } else {
        Write-Host "❌fatal: $error_message" -ForegroundColor "red" -NoNewline
    }
}

function write_host_git_info {

    # 执行 Git 命令并捕获输出。 2>&1 表示将 stderr 重定向到 stdout, 以将错误信息保存在 $git_output 变量中
    $git_output = git rev-parse --is-inside-work-tree 2>&1

    if (
        # 前一个命令执行失败
        $? -eq $false
    ) {
        wirte_host_git_wrong($git_output)
        return
    }

    write_host_git_branch
}

# 判断当前是否是管理员
function has_admin_power {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = [Security.Principal.WindowsPrincipal] $identity
    $adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
    return $principal.IsInRole($adminRole)
}

function __prompt {
    # 空格原则:输出内容时,不需要考虑给前面留空,只需要考虑给后面留空

    $pwsh_version = "PS$($Host.version.Major) "
    $fullpath = "$($executionContext.SessionState.Path.CurrentLocation)"

    Write-Host "`n$pwsh_version" -NoNewline
    Write-Host "$fullpath " -NoNewline -ForegroundColor "green"

    write_host_git_info

    if (has_admin_power) {
        return "`n# "
    } else {
        return "`n$ "
    }

}

# 主入口
function prompt {
    # 编写的代码可能报错
    try {
        __prompt
        return
    } catch {
        # 输出报错信息
        Write-Host "powershell script error occurred: $_" -NoNewline -ForegroundColor "red"
    }

    return "`nPS> "
}

# 解决终端的中文乱码问题。注意,chcp 无效!
$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding
# 设置 UpArrow 快捷方式为向前搜索
Set-PSReadLineKeyHandler -Key UpArrow -ScriptBlock {
  [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchBackward()
  [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
} # 设置向上键为后向搜索历史记录
# 设置 DownArrow 快捷方式为向后搜索
Set-PSReadLineKeyHandler -Key DownArrow -ScriptBlock {
  [Microsoft.PowerShell.PSConsoleReadLine]::HistorySearchForward()
  [Microsoft.PowerShell.PSConsoleReadLine]::EndOfLine()
}
相关推荐
Good_Starry7 小时前
Git介绍--github/gitee/gitlab使用
git·gitee·gitlab·github
敲代码不忘补水9 小时前
Prompt 初级版:构建高效对话的基础指南
prompt
饮尽夏日10 小时前
【PromptEngineeringGuide】用自己的话复述总结
prompt
给自己一个 smile10 小时前
如何高效使用Prompt与AI大模型对话
人工智能·ai·prompt
云端奇趣12 小时前
探索 3 个有趣的 GitHub 学习资源库
经验分享·git·学习·github
丶213614 小时前
【大数据】Elasticsearch 实战应用总结
大数据·elasticsearch·搜索引擎
闲人编程15 小时前
elasticsearch实战应用
大数据·python·elasticsearch·实战应用
F_D_Z16 小时前
【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:
网络·git·网络协议·ssl
龙的爹233317 小时前
论文翻译 | LLaMA-Adapter :具有零初始化注意的语言模型的有效微调
人工智能·gpt·语言模型·自然语言处理·nlp·prompt·llama
CM莫问17 小时前
大语言模型入门(三)——提示词编写注意事项
人工智能·语言模型·自然语言处理·prompt·kimi