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

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

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

<# 负责打印 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()
}

相关推荐

  1. git---分支---标签

    2024-03-22 13:42:03       36 阅读
  2. Git命令

    2024-03-22 13:42:03       8 阅读
  3. git命令提交——github

    2024-03-22 13:42:03       23 阅读
  4. git 的基本命令

    2024-03-22 13:42:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 13:42:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 13:42:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 13:42:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 13:42:03       20 阅读

热门阅读

  1. 常见视频名词及视频格式

    2024-03-22 13:42:03       21 阅读
  2. Git进阶指南

    2024-03-22 13:42:03       20 阅读
  3. 科大讯飞开放平台-python语音转文字教程

    2024-03-22 13:42:03       22 阅读
  4. 二进制数转化为四,八,十,十六进制

    2024-03-22 13:42:03       24 阅读
  5. C# Selenium Edge 驱动下的常见用法

    2024-03-22 13:42:03       16 阅读
  6. VUE pc端+移动端上传录音并上传(recorder-core)

    2024-03-22 13:42:03       16 阅读
  7. doris参数总结

    2024-03-22 13:42:03       16 阅读
  8. AWTK-MODBUS 客户端工具

    2024-03-22 13:42:03       15 阅读
  9. P3378 【模板】堆

    2024-03-22 13:42:03       18 阅读
  10. xbackup 备份MySQL数据库脚本

    2024-03-22 13:42:03       19 阅读