private/DirStackCompleter.ps1

function CompleteStack($wordToComplete, $direction) {

  $stack = if ($direction -eq '+') {Get-Stack -Redo} else {Get-Stack -Undo}
  if (-not $stack) { return }

  $numberedStack = @{}
  1..$stack.Length |% { $numberedStack[$_] = $stack[$_ - 1] }

  $numberedStack.GetEnumerator() |
    Where {$_.Value -match $wordToComplete} |
    Select -Unique -Property Value |
    % {
    New-Object Management.Automation.CompletionResult $_, "$($_.Key) $($_.Value)" , 'ParameterValue', $_
  }
}

function RegisterStackCompletion() {
  Register-ArgumentCompleter -CommandName 'Undo-Location' -ParameterName 'n' -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $boundParameters)

    CompleteStack $wordToComplete '-'
  }

  Register-ArgumentCompleter -CommandName 'Redo-Location' -ParameterName 'n' -ScriptBlock {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $boundParameters)

    CompleteStack $wordToComplete '+'
  }
}