mirror of
https://github.com/denisidoro/navi.git
synced 2026-01-23 02:14:19 +00:00
Merge pull request #947 from alexis-opolka/pwsh-plugin
Update PowerShell plugin
This commit is contained in:
commit
6f1bbcf666
5 changed files with 48 additions and 135 deletions
|
|
@ -1,60 +1,55 @@
|
|||
### 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.
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
|
||||
function InstallNaviWidgetModule(){
|
||||
[String]$PwshModulePath = $env:PSModulePath.Split(";")[0];
|
||||
[String]$NAVI_PLUGIN = "navi.plugin";
|
||||
$null = New-Module {
|
||||
|
||||
Write-Debug "Are we updating the PowerShell module: $Update"
|
||||
Write-Debug "Current Root Powershell Module path is: $PwshModulePath"
|
||||
function Invoke-Navi {
|
||||
$startArgs = @{
|
||||
FileName = "navi";
|
||||
Arguments = $args;
|
||||
RedirectStandardOutput = $true;
|
||||
WorkingDirectory = $PWD;
|
||||
UseShellExecute = $false;
|
||||
}
|
||||
$p = [System.Diagnostics.Process]@{StartInfo = $startArgs}
|
||||
|
||||
### 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
|
||||
[void]$p.Start()
|
||||
$result = $p.StandardOutput.ReadToEnd()
|
||||
$p.WaitForExit()
|
||||
|
||||
$result
|
||||
}
|
||||
|
||||
### 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
|
||||
|
||||
### 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 = (Invoke-Navi "--print" | Out-String).Trim()
|
||||
}
|
||||
else {
|
||||
$best_match = (Invoke-Navi "--print --best-match --query `"$line`"" | Out-String).Trim()
|
||||
if ([String]::IsNullOrEmpty($best_match)) {
|
||||
$output = (Invoke-Navi "--print --query `"$line`"" | Out-String).Trim()
|
||||
}
|
||||
else {
|
||||
$output = $best_match
|
||||
}
|
||||
}
|
||||
|
||||
[Microsoft.PowerShell.PSConsoleReadLine]::InvokePrompt()
|
||||
|
||||
### Handling the case when the user escapes without selecting any entry
|
||||
if (-Not([String]::IsNullOrEmpty($output))) {
|
||||
[Microsoft.PowerShell.PSConsoleReadLine]::Insert([String]$output)
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
Export-ModuleMember -Function @()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
#
|
||||
# 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 = @{
|
||||
}
|
||||
}
|
||||
### Here should go the HelpInfo XML file if it's supported in
|
||||
### a later version.
|
||||
HelpInfoURI = ''
|
||||
}
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
|
||||
[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
|
||||
)
|
||||
|
||||
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()
|
||||
|
||||
### Handling the case when the user escapes without selecting any entry
|
||||
if (-Not([String]::IsNullOrEmpty($output))) {
|
||||
[Microsoft.PowerShell.PSConsoleReadLine]::Insert([String]$output)
|
||||
}
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@ impl Display for Shell {
|
|||
Self::Fish => "fish",
|
||||
Self::Elvish => "elvish",
|
||||
Self::Nushell => "nushell",
|
||||
Self::PowerShell => "powershell",
|
||||
Self::Powershell => "powershell",
|
||||
};
|
||||
|
||||
write!(f, "{s}")
|
||||
|
|
@ -37,7 +37,7 @@ impl Runnable for Input {
|
|||
Shell::Fish => include_str!("../../shell/navi.plugin.fish"),
|
||||
Shell::Elvish => include_str!("../../shell/navi.plugin.elv"),
|
||||
Shell::Nushell => include_str!("../../shell/navi.plugin.nu"),
|
||||
Shell::PowerShell => include_str!("../../shell/navi.plugin.ps1"),
|
||||
Shell::Powershell => include_str!("../../shell/navi.plugin.ps1"),
|
||||
};
|
||||
|
||||
println!("{content}");
|
||||
|
|
|
|||
|
|
@ -12,8 +12,7 @@ pub enum Shell {
|
|||
Fish,
|
||||
Elvish,
|
||||
Nushell,
|
||||
#[allow(clippy::enum_variant_names)]
|
||||
PowerShell,
|
||||
Powershell,
|
||||
}
|
||||
|
||||
#[derive(Error, Debug)]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue