Understanding the Root Cause
Tab completion in modern versions of PowerShell (5.1 and 7+) is handled by the PSReadLine module, not the core engine itself. This module manages syntax highlighting, command line editing, and the prediction of possible completions as you type. When this feature fails, it is rarely due to system permissions or execution policies. Instead, it is almost always caused by one of two specific issues: a corrupted history file that prevents the module from loading correctly, or a custom key binding that overrides the default Tab key behavior.
The history file stores previously executed commands to enable up-arrow navigation and completion suggestions. If this file becomes locked, unreadable, or contains invalid data structures, PSReadLine may fail silently during initialization. Consequently, the shell falls back to basic input handling where Tab does not trigger completion. Identifying whether the issue is file-based or configuration-based is the first step toward resolution.
Resetting the PSReadLine History File
The most common solution for broken autocomplete is to remove the corrupted history file. PowerShell automatically regenerates this file upon the next launch, ensuring a fresh start without losing any critical system settings. Follow these steps to locate and delete the problematic file:
- Close all running PowerShell windows. You must ensure no instance is holding a lock on the history file, or the deletion will fail.
- Navigate to the AppData directory. Open File Explorer and paste the following path into the address bar:
%LOCALAPPDATA%\Microsoft\Windows\PowerShell\PSReadLine. - Delete the history file. Look for a file named
History.txt. Right-click it and select Delete. If you see multiple files with similar names (e.g.,History_*.txt), delete all of them to ensure a complete reset. - Restart PowerShell. Open a new PowerShell window and test the Tab key. Autocomplete should now function normally.
This method resolves the majority of autocomplete failures because it eliminates the possibility of disk corruption or permission errors affecting the read/write operations of the history store. If you are experiencing other PowerShell stability issues, such as internal errors or registry problems, you might find related guidance in our article on Powershell (Win) Stopped Working: Win32 Internal Error.
Checking Key Bindings and Configurations
If deleting the history file does not restore tab completion, the issue likely lies within the key bindings defined in your PowerShell profile. Users often customize their experience by mapping keys to different functions, accidentally overriding the default completion behavior. To diagnose this, you can inspect the current key bindings programmatically.
Run the following command in an elevated PowerShell session to list all active key bindings:
Get-PSReadLineKeyHandler | Format-Table Key, Function
Look for entries where the Key column shows Tab. By default, there should be two entries: one for Complete and one for MenuComplete. If you see a different function assigned to Tab, such as ForwardChar or a custom script block, that override is preventing autocomplete.
To temporarily disable custom bindings and revert to defaults, you can run this command in the current session:
Set-PSReadLineOption -EditMode Windows
This command resets the edit mode to the standard Windows style, which includes the correct Tab bindings. If this fixes the issue, check your $PROFILE script for any lines that modify PSReadLine options and remove or comment out the conflicting code. For deeper troubleshooting involving registry keys that might affect PowerShell environment variables, refer to our guide on Registry Key PowerShell: Troubleshooting with Get-Item and Test-Path.
Verifying Module Integrity
In rare cases, the PSReadLine module itself may be corrupted or missing required dependencies. While less common than history file issues, this can happen after a failed Windows Update or a manual module removal. You can verify the integrity of the module by checking its version and status.
Execute the following command to get detailed information about the installed module:
Get-Module -ListAvailable PSReadLine
If the module is listed, note the version number. If it is missing entirely, you can reinstall it by running:
Install-Module PSReadLine -Force
After reinstallation, restart PowerShell to load the fresh module copy. Ensure that your execution policy allows the module to load if you are using strict policies, although this typically affects script signing rather than built-in module functionality. If you encounter errors during module installation or command execution, such as failures with appx packages or mount commands, consult our troubleshooting resources on Troubleshooting PowerShell Get-Appx -AllUsers Failure for broader system repair strategies.
Frequently Asked Questions
Why does Tab only insert spaces instead of completing?
This occurs when the TabExpansionPlusPlus option is disabled or when a custom key handler is mapped to insert whitespace. Check your Set-PSReadLineOption settings to ensure that TabExpansionMode is set to Auto or Scripting. Reverting to Windows edit mode via Set-PSReadLineOption -EditMode Windows usually restores the default space-insertion behavior if completion is broken.
Can a third-party terminal emulator cause autocomplete issues?
Yes. Applications like ConEmu, Cmder, or specialized VS Code terminals may intercept the Tab key before PowerShell receives it. If autocomplete works in standard ConsoleHost but not in your preferred terminal, check the terminal's settings for "Tab" key mappings. Disabling any custom tab handlers in the terminal application often resolves the conflict.
Does changing the Execution Policy affect tab completion?
No. Execution policies control whether scripts can be loaded and executed, but they do not impact the interactive command-line editing features provided by PSReadLine. Changing from Restricted to RemoteSigned will not fix autocomplete issues. Focus on PSReadLine configuration and history files instead.
How do I save my custom key bindings permanently?
To make changes permanent, you must add the Set-PSReadLineKeyHandler or Set-PSReadLineOption commands to your PowerShell profile script. Open your profile by typing $PROFILE in PowerShell, then add your desired configurations to that file. Save the file and restart PowerShell for the changes to take effect.
What if the history file is encrypted or protected?
By default, the history file is stored in plain text within your user profile. If you cannot delete it, check if another process has it open. Use Task Manager to end any lingering powershell.exe or pwsh.exe processes. If permissions prevent deletion, right-click the file, select Properties, go to Security, and grant yourself Full Control before deleting.