aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Karatarakis <alex@karatarakis.com>2017-12-04 16:33:43 -0800
committerGitHub <noreply@github.com>2017-12-04 16:33:43 -0800
commit3f053c15f50ad67da4bb3c04f718f6d49e203e5e (patch)
tree4f509e5dd99bed46ce7fcf7547ea8bf375f8d8fc
parente30cabce354a4e0cbf06e5a4708b96fbb98f0dda (diff)
parent1a9a14b3ce456289c2a4523079e0104dc17a9758 (diff)
downloadvcpkg-3f053c15f50ad67da4bb3c04f718f6d49e203e5e.tar.gz
vcpkg-3f053c15f50ad67da4bb3c04f718f6d49e203e5e.zip
Merge pull request #2260 from Microsoft/PowershellTabCompletion
[posh-vcpkg] Add `vcpkg integrate powershell` for enabling tab-completion
-rw-r--r--README.md8
-rw-r--r--scripts/addPoshVcpkgToPowershellProfile.ps155
-rw-r--r--toolsrc/src/vcpkg/commands.integrate.cpp12
3 files changed, 73 insertions, 2 deletions
diff --git a/README.md b/README.md
index bf7d7b0ea..9ff217564 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,14 @@ Finally, create a New Project (or open an existing one) in Visual Studio 2017 or
For CMake projects, simply include our toolchain file. See our [using a package](docs/examples/using-sqlite.md) example for the specifics.
+## Tab-Completion / Auto-Completion
+`Vcpkg` supports auto-completion of commands, package names, options etc. To enable tab-completion in Powershell, use
+```
+.\vcpkg integrate powershell
+```
+and restart Powershell.
+
+
## Examples
See the [documentation](docs/index.md) for specific walkthroughs, including [using a package](docs/examples/using-sqlite.md) and [adding a new package](docs/examples/packaging-zlib.md).
diff --git a/scripts/addPoshVcpkgToPowershellProfile.ps1 b/scripts/addPoshVcpkgToPowershellProfile.ps1
new file mode 100644
index 000000000..92a7573e4
--- /dev/null
+++ b/scripts/addPoshVcpkgToPowershellProfile.ps1
@@ -0,0 +1,55 @@
+[CmdletBinding()]
+param()
+
+function findExistingImportModuleDirectives([Parameter(Mandatory=$true)][string]$path)
+{
+ if (!(Test-Path $path))
+ {
+ return $false
+ }
+
+ $fileContents = Get-Content $path
+ return $fileContents -match 'Import-Module.+?(?=posh-vcpkg)'
+}
+
+$scriptsDir = split-path -parent $MyInvocation.MyCommand.Definition
+. "$scriptsDir\VcpkgPowershellUtils.ps1"
+
+$profileEntry = "Import-Module '$scriptsDir\posh-vcpkg'"
+$profilePath = $PROFILE # Implicit powershell variable
+if (!(Test-Path $profilePath))
+{
+ $profileDir = Split-Path $profilePath -Parent
+ vcpkgCreateDirectoryIfNotExists $profileDir
+}
+
+Write-Host "`nAdding the following line to ${profilePath}:"
+Write-Host " $profileEntry"
+
+# @() Needed to force Array in PowerShell 2.0
+[Array]$existingImports = @(findExistingImportModuleDirectives $profilePath)
+if ($existingImports.Count -gt 0)
+{
+ $existingImportsOut = $existingImports -join "`n "
+ Write-Host "`nposh-vcpkg is already imported to your PowerShell profile. The following entries were found:"
+ Write-Host " $existingImportsOut"
+ Write-Host "`nPlease make sure you have started a new Powershell window for the changes to take effect."
+ return
+}
+
+# Posh-git does the following check, so we should too.
+# https://github.com/dahlbyk/posh-git/blob/master/src/Utils.ps1
+# If the profile script exists and is signed, then we should not modify it
+if (Test-Path $profilePath)
+{
+ $sig = Get-AuthenticodeSignature $profilePath
+ if ($null -ne $sig.SignerCertificate)
+ {
+ Write-Warning "Skipping add of posh-vcpkg import to profile; '$profilePath' appears to be signed."
+ Write-Warning "Please manually add the line '$profileEntry' to your profile and resign it."
+ return
+ }
+}
+
+Add-Content $profilePath -Value "`n$profileEntry" -Encoding UTF8
+Write-Host "`nSuccessfully added posh-vcpkg to your PowerShell profile. Please start a new Powershell window for the changes to take effect."
diff --git a/toolsrc/src/vcpkg/commands.integrate.cpp b/toolsrc/src/vcpkg/commands.integrate.cpp
index 66c5eb5a9..460e99b88 100644
--- a/toolsrc/src/vcpkg/commands.integrate.cpp
+++ b/toolsrc/src/vcpkg/commands.integrate.cpp
@@ -324,18 +324,20 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
" vcpkg integrate install Make installed packages available user-wide. Requires admin privileges on "
"first use\n"
" vcpkg integrate remove Remove user-wide integration\n"
- " vcpkg integrate project Generate a referencing nuget package for individual VS project use\n";
+ " vcpkg integrate project Generate a referencing nuget package for individual VS project use\n"
+ " vcpkg integrate powershell Enable PowerShell Tab-Completion\n";
namespace Subcommand
{
static const std::string INSTALL = "install";
static const std::string REMOVE = "remove";
static const std::string PROJECT = "project";
+ static const std::string POWERSHELL = "powershell";
}
static std::vector<std::string> valid_arguments(const VcpkgPaths&)
{
- return {Subcommand::INSTALL, Subcommand::REMOVE, Subcommand::PROJECT};
+ return {Subcommand::INSTALL, Subcommand::REMOVE, Subcommand::PROJECT, Subcommand::POWERSHELL};
}
const CommandStructure COMMAND_STRUCTURE = {
@@ -365,6 +367,12 @@ With a project open, go to Tools->NuGet Package Manager->Package Manager Console
{
return integrate_project(paths);
}
+ if (args.command_arguments[0] == Subcommand::POWERSHELL)
+ {
+ System::powershell_execute("PowerShell Tab-Completion",
+ paths.scripts / "addPoshVcpkgToPowershellProfile.ps1");
+ Checks::exit_success(VCPKG_LINE_INFO);
+ }
#endif
Checks::exit_with_message(VCPKG_LINE_INFO, "Unknown parameter %s for integrate", args.command_arguments[0]);