22

I love Powershell, but coming from a Linux background there is a few things that is really bugging me. Like for example how the default auto completion works.

For example: Get-PS expands to "Get-PSBreakpoint" which is the first matching command. In bash if there is only one command matching bash will expand to the matching command. If there is several hitting tab once does nothing, double tapping tab will show a list of matching commands but not expanding. Is there a way to make Powershell behave like this?

And one other thing, if i have written one line, and moves the marker back to an earlier command (marker is where the ^ is):

"Get-PSS^ | Remove-PSSession" auto completes to "Get-PSSession^", removing all trailing commands. In bash the trailing commands would still be there unaffected. Is there a way to make Powershell not remove the trailing commands when auto completing?

A bonus would be to get CTRL+L to clear the screen. CTRL+A to go to the beginning of the line, and CTRL+E to go to the end of the line.

3
  • I posted an answer to your question but the funny thing is that I arrived on this question because I'm looking for the exact opposite... I want PowerShell style completion in bash :) Commented Nov 28, 2010 at 0:24
  • PowerShell style completion is available in bash - look for the function menu-complete Commented Nov 15, 2013 at 23:20
  • Luckily we have bash on windows 10 now.
    – byxor
    Commented Feb 12, 2018 at 11:39

7 Answers 7

16

Check out PSReadline.

From the article:

This module replaces the command line editing experience in PowerShell.exe. It provides:

  • Syntax coloring
  • Simple syntax error notification
  • A good multi-line experience (both editing and history)
  • Customizable key bindings
  • Cmd and emacs modes (neither are fully implemented yet, but both are usable)
  • Many configuration options
  • Bash style completion (optional in Cmd mode, default in Emacs mode)
  • Bash/zsh style interactive history search (CTRL-R)
  • Emacs yank/kill ring
  • PowerShell token based "word" movement and kill
  • Undo/redo
  • Automatic saving of history, including sharing history across live sessions
  • "Menu" completion (somewhat like Intellisense, select completion with arrows) via Ctrl+Space

I use it daily!

5
  • 6
    Once you install PSReadLine, you have to enable bash-style tab completion by adding this to your profile: Set-PSReadlineKeyHandler -Key Tab -Function Complete Commented Nov 21, 2016 at 6:24
  • 5
    PSReadLine is now installed by default on Windows 10. Just put the configuration line that @brianpeiris mentioned into your profile and you're good to go. Commented Feb 5, 2017 at 19:47
  • Try using CompleteMenu instead of Complete for a more bash-like experience, it lets you use the arrow keys to navigate the choices
    – stib
    Commented Aug 17, 2017 at 3:01
  • In case anyone was wondering like me, the profile file in the latest versions of Windows is located in C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.
    – Dr_Zaszuś
    Commented May 22, 2020 at 15:14
  • 1
    You can easily get to your profile by running notepad $profile as well (or code $profile or some other editor). It works in any version of PowerShell. Commented May 22, 2020 at 16:14
3

Maybe you should have a look at Powertab, a customizable PowerShell Tab expansion.

1
  • 2
    Thanks! Powertab really makes tab expansion way better. Still, the issue completing something not at the end of the command is there. Commented Nov 3, 2010 at 12:22
2

hi peter just press F8 for something like speedsearch. It completes with the commands that you run previously that start with what you have in the line. The problem with the deletion of the trailing is annoying, I write a suggestion in Connect regarding the same issue. In the main time you could use Powershell ISE, that behave a little better(don't delete the trailing characters).

1
  • In Windows Terminal at least, you can do Shift+End to highlight the trailing and then Del to remove it.
    – techSage
    Commented Mar 4, 2021 at 19:31
2

The old command.exe subsystem is still involved in PowerShell, and forces a lot of unpleasant behaviors. But as of PowerShell v3, the GUI (PowerShell ISE) is now usable, and it includes a much more modern completion experience + colorization.

enter image description here

2

PowerShell uses the same console features as the venerable Command Prompt; so you have the usual Home/End, and:

  • F3 to bring up the previous command
  • F1 to copy a single character from the previous command
  • F7 popup history window

...but there's no facility to show all possible completions, as far as I know.

1
  • This is still very limiting compared to good old bash. For example it is really great being able to type ctrl+r (speedsearch) in bash and just start typing and a matching previous command will show up. Commented Nov 11, 2010 at 8:24
2

Regular powershell uses cmd as command prompt window. That's why it have a huge legacy (programs relay on behavior of old cmd for ages) that can not be change because of backward comparability.

I recommend you use powershell_ise instead of powershell (it's includes in standard powershell bundle). Version 3.0 (don't sure about previous) support Intellisense from the box. This is very close to bash completion style. Just hit Ctrl+Space instead of Tab. I experience problems with custom completions on PowerTab, but Intellisense works just fine with it. Powershell_ise also preserves trailing commands, have normal select mode, support Ctrl+C, Ctrl+V, Ctrl+A for select entered command, so Ctrl+A, jump to begging of the line, Ctrl+A, to the end (or Home/End).

0

PowerShell uses its own parser for commands, so in a sense it is a different shell than cmd.exe, even though they share the same terminal (gui window).

Because of that difference, PowerShell allows you to override the tab-completion functionality with your own function. I haven't had time to mess with this myself, but you basically override the function tabexpansion in your profile, the same way you can override the prompt function.

I found this article, by Lee Holmes (author of the awesome Windows PowerShell Cookbook), that describes a tabexpansion override that is very similar to what you're looking for. You could probably tweak it to give you exactly what you want.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .