GuiCompletion.psm1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$ErrorActionPreference = 'Stop'
$UI = $Host.UI.RawUI

. $PSScriptRoot\scripts\ConsoleLib.ps1
. $PSScriptRoot\scripts\GuiCompletionConfig.ps1

function Install-GuiCompletion($Key = 'Ctrl+Spacebar') {
    Set-PSReadLineKeyHandler -Key $Key -ScriptBlock {
        Invoke-GuiCompletion
    }
}

function Invoke-GuiCompletion {
    for() {
        # get input buffer state
        $buffer = ''
        $cursorPosition = 0
        [Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$buffer, [ref]$cursorPosition)
        if (!$cursorPosition) {
            return
        }

        # get completion items
        try {
            $completion = TabExpansion2 $buffer $cursorPosition
        }
        catch {
            return
        }
        if (!$completion.CompletionMatches) {
            return
        }

        # show the menu
        $Repeat = $false
        $replacement = Get-ConsoleList -Content $completion.CompletionMatches -Repeat ([ref]$Repeat)

        # apply the completion
        if ($replacement) {
            [Microsoft.PowerShell.PSConsoleReadLine]::Replace($completion.ReplacementIndex, $completion.ReplacementLength, $replacement)
        }
        if (!$Repeat) {
            break
        }
    }
}

Export-ModuleMember -Function Install-GuiCompletion, Invoke-GuiCompletion -Variable GuiCompletionConfig