# encoding: ascii
# api: powershell
# title: Short PS Prompt
# description: Dynamically adjusts the length of the path displayed in your prompt based upon the width of the window
# version: 2.0
# type: function
# author: Andy Levy
# license: CC0
# x-poshcode-id: 3997
# x-archived: 2014-11-09T17:05:59
# x-published: 2014-03-03T13:51:00
#
#
<#
.Synopsis
	Dynamically shortens the prompt based upon window size
.Notes
	I got really annoyed by having my PowerShell prompt extend across 2/3 of my window when in a deeply-nested directory structure.
	This shortens the prompt to roughly 1/3 of the window width, at a minimum showing the first and last piece of the path (usually the PSPROVIDER & the current directory)
	Additional detail is added, starting at the current directory's parent and working up from there.
	The omitted portion of the path is represented with an ellipsis (...)
#>

# Window title borrowed from Joel Bennett @ http://poshcode.org/1834
# This should go OUTSIDE the prompt function, it doesn't need re-evaluation
# We're going to calculate a prefix for the window title 
# Our basic title is "PoSh - C:\Your\Path\Here" showing the current path
if(!$global:WindowTitlePrefix) {
   # But if you're running "elevated" on vista, we want to show that ...
   if( ([System.Environment]::OSVersion.Version.Major -gt 5) -and ( # Vista and ...
         new-object Security.Principal.WindowsPrincipal (
            [Security.Principal.WindowsIdentity]::GetCurrent()) # current user is admin
            ).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) )
   {
      $global:WindowTitlePrefix = "PoSh (ADMIN)"
   } else {
      $global:WindowTitlePrefix = "PoSh"
   }
}

function prompt {
# Put the full path in the title bar for reference
    $host.ui.rawui.windowtitle = $global:WindowTitlePrefix + " - " + $(get-location);
	
# Capture the maximum length of the prompt. If you want a longer prompt, adjust the math as necessary.
	$winWidth = $host.UI.RawUI.WindowSize.Width;
    $maxPromptPath = [Math]::Round($winWidth/3);
	
# In the PowerShell ISE (version 2.0 at least), $host.UI.RawUI.WindowSize.Widthis $null.
# For now, I'm just going to leave the default prompt for this scenario, as I don't work in the ISE.
    if (-not ($winWidth -eq $null)) {
        $currPath = (get-location).path;
        if ($currPath.length -ge $maxPromptPath){
            $pathParts = $currPath.split([System.IO.Path]::DirectorySeparatorChar);
# Absolute minimum path - PSPROVIDER and the current directory
            $myPrompt = $pathParts[0] + [System.IO.Path]::DirectorySeparatorChar+ "..." + [System.IO.Path]::DirectorySeparatorChar + $pathParts[$pathParts.length - 1];
            $counter = $pathParts.length - 2;
# This builds up the prompt until it reaches the maximum length we set earlier.
# Start at the current directory's parent and keep going up until the whole prompt reaches the previously-determined limit.
            while( ($myPrompt.replace("...","..."+[System.IO.Path]::DirectorySeparatorChar+$pathParts[$counter]).length -lt $maxPromptPath) -and ($counter -ne 0)) {
                $myPrompt = $myPrompt.replace("...","..."+[System.IO.Path]::DirectorySeparatorChar+$pathParts[$counter]);
                $counter--;
            }      
            $($myPrompt) + ">";    
        } else{
# If there's enough room for the full prompt, use the Powershell default prompt
            $(if (test-path variable:/PSDebugContext) { '[DBG]: ' } else { '' }) + 'PS ' + $(Get-Location) + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '
        }
    }
}
