编辑命令行提示符 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()
}
相关推荐
反方向的空2 小时前
GIt基本操作
大数据·git·elasticsearch
何双新5 小时前
L3-4、让 Prompt 更聪明:调试技巧与智能问答系统实战
prompt
engchina5 小时前
来自B站-AI匠的“RAG的prompt设计指南“的部分截图
prompt·rag
极小狐8 小时前
如何对极狐GitLab 议题进行过滤和排序?
人工智能·git·机器学习·gitlab
花月C8 小时前
Git 全面解析:从核心概念到生态应用
git
Elasticsearch11 小时前
Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
elasticsearch
正宗咸豆花11 小时前
开源提示词管理平台PromptMinder使用体验
人工智能·开源·prompt
Lilith的AI学习日记11 小时前
AI提示词(Prompt)终极指南:从入门到精通(附实战案例)
大数据·人工智能·prompt·aigc·deepseek
柚个朵朵12 小时前
IDEA中使用Git
java·git·spring
我是哈哈hh12 小时前
【Git】初始Git及入门命令行
git·gitee·github·版本控制器