Skip to content

Commit

Permalink
Add Trigger completion for *Service cmdlets
Browse files Browse the repository at this point in the history
- Start-Service, Stop-Service, Get-Service support fzf trigger
  • Loading branch information
kelleyma49 committed Mar 22, 2020
1 parent 5e1a6cb commit e3c616f
Showing 1 changed file with 46 additions and 0 deletions.
46 changes: 46 additions & 0 deletions PSFzf.TabExpansion.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,21 @@ function CheckFzfTrigger {
$wordToComplete
}
}


function GetServiceSelection() {
param(
[scriptblock]
$ResultAction
)
$header = [System.Environment]::NewLine + $("{0,-24} | NAME" -f "DISPLAYNAME") + [System.Environment]::NewLine
$result = Get-Service | Where-Object { ![string]::IsNullOrEmpty($_.Name) } | ForEach-Object {
"{0,-24} | {1}" -f $_.DisplayName.Substring(0,[System.Math]::Min(24,$_.DisplayName.Length)),$_.Name } | Invoke-Fzf -Multi -Header $header
$result | ForEach-Object {
&$ResultAction $_
}
}

function RegisterBuiltinCompleters {
$processIdOrNameScriptBlock = {
param($commandName, $parameterName, $wordToComplete, $commandAst, $cursorPosition,$action)
Expand Down Expand Up @@ -147,6 +162,37 @@ function RegisterBuiltinCompleters {
Register-ArgumentCompleter -CommandName $_ -ParameterName "Name" -ScriptBlock $processIdOrNameScriptBlock
Register-ArgumentCompleter -CommandName $_ -ParameterName "Id" -ScriptBlock $processIdOrNameScriptBlock
}

$serviceNameScriptBlock = {
param($commandName, $parameterName, $wordToComplete, $commandAst, $cursorPosition,$action)
$wordToComplete = CheckFzfTrigger $commandName $parameterName $wordToComplete $commandAst $cursorPosition
if ($null -ne $wordToComplete)
{
if ($parameterName -eq 'Name') {
$group = '$2'
} elseif ($parameterName -eq 'DisplayName') {
$group = '$1'
}

$script:resultArr = @()
GetServiceSelection -ResultAction {
param($result)
$script:resultArr += $result -replace "(.*)\|(.*)",$group
}

$script:resultArr -join ', '
#HACK: workaround for fact that PSReadLine seems to clear screen
# after keyboard shortcut action is executed:
[Microsoft.PowerShell.PSConsoleReadLine]::InvokePrompt()
} else {
# don't return anything - let normal tab completion work
}
}

'Get-Service','Start-Service','Stop-Service' | ForEach-Object {
Register-ArgumentCompleter -CommandName $_ -ParameterName "Name" -ScriptBlock $serviceNameScriptBlock
Register-ArgumentCompleter -CommandName $_ -ParameterName "DisplayName" -ScriptBlock $serviceNameScriptBlock
}
}


Expand Down

0 comments on commit e3c616f

Please sign in to comment.