diff --git a/shell/navi.plugin.ps1 b/shell/navi.plugin.ps1 index 3c16103..0cf73da 100644 --- a/shell/navi.plugin.ps1 +++ b/shell/navi.plugin.ps1 @@ -1,26 +1,60 @@ +### This script installs the Powershell module under the user's Powershell modules path +### For modifications of the Powershell Navi plugin, see /shell/navi.plugin/navi.plugin.psm1. -### Initial code from @lurebat (https://github.com/lurebat/) -function Invoke-NaviWidget { - $ast = $tokens = $errors = $cursor = $null - [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref] $ast, [ref] $tokens, [ref] $errors, [ref] $cursor) +param ( + ### Controls if we update the current module (otherwise we don't rewrite the already existing module, if present) + [Switch]$Update, + ### Should the verbosity be enabled? + [Switch]$Verbose +) - $line = $ast.ToString().Trim() - $output = $null - if ([String]::IsNullOrEmpty($line)) { - $output = navi --print - } - else { - $best_match = (navi --print --best-match --query $line | Out-String).Trim() - if ([String]::IsNullOrEmpty($best_match)) { - $output = (navi --print --query "$line" | Out-String).Trim() - } else { - $output = $best_match - } +function InstallNaviWidgetModule(){ + [String]$PwshModulePath = $env:PSModulePath.Split(";")[0]; + [String]$NAVI_PLUGIN = "navi.plugin"; + + Write-Debug "Are we updating the PowerShell module: $Update" + Write-Debug "Current Root Powershell Module path is: $PwshModulePath" + + ### If we're updating the module, Copy the newly updated contents to the currently installed module + ### then quit with a successful exit code. + ### We're not supposed to update the shortcut binding. + if ($Update){ + Write-Debug "Updating Navi-Widget PowerShell module" + Copy-Item -Path .\navi.plugin\ -Destination $PwshModulePath -Force -Recurse + exit 0 } - [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine() - [Microsoft.PowerShell.PSConsoleReadLine]::Insert($output) + ### If we're not updating, check if we don't have the module already installed + if (-Not (Test-Path -Path $PwshModulePath\$NAVI_PLUGIN)) { + Write-Debug "Copying Item to the path" + Copy-Item -Path .\navi.plugin\ -Destination $PwshModulePath -Recurse + } else { + Write-Error "Navi-Widget is already installed for PowerShell!" + exit 1 + } + + Write-Debug "Registering the navi shortcut inside the current shell session" + Set-PSReadlineKeyHandler -BriefDescription "A keybinding to open Navi Widget" -Chord Ctrl+g -ScriptBlock { Invoke-NaviWidget } + + Write-Debug "Appending the navi shortcut inside the current user's profile" + ### Adding a new line + Write-Output "Import-Module navi.plugin" >> $PROFILE + Write-Output "" >> $PROFILE + Write-Output 'Set-PSReadlineKeyHandler -BriefDescription "A keybinding to open Navi Widget" -Chord Ctrl+g -ScriptBlock { Invoke-NaviWidget }' >> $PROFILE + + + Write-Output "Navi plugin has been installed!" + exit 0 ### Succesful installation } -Set-PSReadlineKeyHandler -Key Ctrl+g -ScriptBlock { Invoke-NaviWidget } +if ($Verbose) { + ### Enabling verbose/debug output at the start of the script + $DebugPreference = 'Continue' + InstallNaviWidgetModule -Update $Update + ### Disabling verbose/debug output at the end of the script + ### in order to not modify the current user's shell environment + $DebugPreference = 'SilentlyContinue' +} else { + InstallNaviWidgetModule -Update $Update +} diff --git a/shell/navi.plugin/navi.plugin.psd1 b/shell/navi.plugin/navi.plugin.psd1 new file mode 100644 index 0000000..f7ba419 --- /dev/null +++ b/shell/navi.plugin/navi.plugin.psd1 @@ -0,0 +1,23 @@ +# +# Module manifest for module 'navi.plugin' +# +# Generated by: Alexis Opolka (@alexis-opolka) + + +@{ +RootModule = './navi.plugin.psm1' +ModuleVersion = '1.0' +GUID = '59287935-a9b6-4a7f-a1f5-bd6180d9056f' +Author = 'Alexis-Opolka' +CompanyName = 'None' +Copyright = '(c) Alexis Opolka & Navi contributors. All rights reserved.' +FunctionsToExport = @('Invoke-NaviWidget') +CmdletsToExport = @() +VariablesToExport = '*' +AliasesToExport = @() +PrivateData = @{ + PSData = @{ + } +} +HelpInfoURI = 'https://github.com/denisidor/navi' +} diff --git a/shell/navi.plugin/navi.plugin.psm1 b/shell/navi.plugin/navi.plugin.psm1 new file mode 100644 index 0000000..7c02d10 --- /dev/null +++ b/shell/navi.plugin/navi.plugin.psm1 @@ -0,0 +1,57 @@ + +[CmdletBinding()] +param ( + ### Should we debug this PS Script ? + ### Caution: Set-PSDebug is not limited to this script but enables session-wide calls + ### Be sure to disable Verbose output before calling any other shell modules or scripts. + [Parameter()] + [bool] + $VerboseOutput, + + # Should the function be invoked when called? + [Parameter()] + [bool] + $Invoke +) + +if ($VerboseOutput) { + ### Outputs the running code if required + ### + ### For more details on how it works, please see: + ### - https://stackoverflow.com/a/41334715/13025136 + ### An answer and explaination from @michael-sorens (https://stackoverflow.com/users/115690/michael-sorens) + ### on how Set-PSDebug relates to set-x in LINUX/UNIX environments. + ### + ### - https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/set-psdebug?view=powershell-7.4 + ### Microsoft's Reference and documentation for the `Set-PSDebug` function. + Set-PSDebug -Trace 1 +} else { + Set-PSDebug -Trace 0 +} + + +### Initial code from @lurebat (https://github.com/lurebat/) +### See #570 (https://github.com/denisidoro/navi/issues/570) for its original contribution +function Invoke-NaviWidget { + $ast = $tokens = $errors = $cursor = $null + [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref] $ast, [ref] $tokens, [ref] $errors, [ref] $cursor) + + $line = $ast.ToString().Trim() + $output = $null + + if ([String]::IsNullOrEmpty($line)) { + $output = navi --print + } + else { + $best_match = (navi --print --best-match --query $line | Out-String).Trim() + if ([String]::IsNullOrEmpty($best_match)) { + $output = (navi --print --query "$line" | Out-String).Trim() + } + else { + $output = $best_match + } + } + + [Microsoft.PowerShell.PSConsoleReadLine]::RevertLine() + [Microsoft.PowerShell.PSConsoleReadLine]::Insert([String]$output) +} \ No newline at end of file