When I'm called upon to navigate to these different folders I typically have to remember where they are & then 'cd' over to them (if I'm at a command line) or type into explorer's address bar one component at a time, waiting for the auto-complete (or attempting tab completion at the command line). This can be cumbersome--especially when I'm not physically connected to the network.
At some point I decided to set some environment variables for myself so I could just type, e.g., %myproj% into the Run window or Explorer's address bar or an Open File dialog & be taken there instantly. I found this very helpful--no more having to remember where things lived, just my nicknames for them.
Then after adopting powershell as my preferred command-line & discovering functions, I created a parallel set of functions that just did a 'cd' into the proper directory.
Then my machine was repaved & upgraded to Windows 7, and I lost my environment variables. Around the same time I read a lifehacker article on the Launchy utility & decided to try that. So rather than set up the environment vars I just created a special folder called Shortcuts into which I put shortcut files pointing to the various folders, named after my nicknames for the projects. I like Launchy quite a bit, but I did miss my environment variables for the odd Open File dialog.
So today I decided to delve into powershell scripting a little so that I could put all the information in a script, and have it generate:
- The environment variables I missed,
- the ps functions I wanted, and
- the Launchy shortcuts I wanted.
$WinShell = New-Object -comObject WScript.Shell $shrt_dir = "C:\Users\Roy\Desktop\shortcuts" # nicknames and locations of my projects $projects = @{"grif" = "\\some_server\griffin\stupid name" ; "cupid" = "\\other_server\projects\cupid" ; "prod" = "\\data_server\management\programs\" } foreach($prj in $projects.GetEnumerator()) { # Create a shortcut named for the nickname that points to the dir in the value. $shrtfile = $shrt_dir + '\' + $prj.key + '.lnk' $shrt = $WinShell.CreateShortcut($shrtfile) $shrt.TargetPath = $prj.value $shrt.WorkingDirectory = $prj.value $shrt.Save() # Create an environment variable for each. [Environment]::SetEnvironmentVariable($prj.key, $prj.value, "User") # Create a function for each nickname $this_func = "function " + $prj.key + "() {Set-Location '" + $prj.value + "'}" $this_func Invoke-Expression $this_func }
Next up I want to change my prompt function so that those project folders show up as e.g., ::cupid:: in the prompt rather than the whole long thing. I'm already replacing $env:home with a '~', so I should just be able to loop through that $projects dictionary to make similar substitutions.
And here's the prompt function that does what I want:
ReplyDeletefunction global:prompt {
$realLASTEXITCODE = $LASTEXITCODE
# Reset color, which can be messed up by Enable-GitColors
$Host.UI.RawUI.ForegroundColor = $GitPromptSettings.DefaultForegroundColor
$pat = $pwd.ProviderPath.ToLower()
# Write-Host "Hey!"
foreach($prj in $projects.GetEnumerator()) {
# Write-Host "Looking for $prj.value().ToLower()"
$pat = $pat.replace($prj.value.ToLower(), '[' + $prj.key + ']')
}
$pat = $pat.replace($env:home.ToLower(), '~')
Write-Host($pat) -nonewline
# Write-Host($pwd.ProviderPath) -nonewline
Write-VcsStatus
$global:LASTEXITCODE = $realLASTEXITCODE
return "> "
}