Как заставить автозавершение вкладки PowerShell работать как Bash

107

Допустим, у меня в текущем каталоге есть следующие файлы:

buildBar.bat
buildFoo.bat
buildHouse.bat

И я набираю в командной строке следующее, ./buа затем TAB.

  • В Bash он расширяется до ./build

  • В PowerShell он расширяется до ./buildBar.bat- первого элемента в списке.

  • В Cmd поведение такое же, как и в PowerShell.

Я предпочитаю поведение Bash - есть ли способ заставить PowerShell вести себя как Bash?

РобСиклос
источник
2
Вы можете использовать Cygwin's bash;)
Blender
13
Да, это то, чем я занимаюсь последние десять лет или около того, но я пытаюсь перейти на PowerShell, потому что хочу иметь возможность запускать командную строку в системах, отличных от моей, где Cygwin не работает. установлены.
RobSiklos

Ответы:

175

Новые версии PowerShell включают PSReadline, который можно использовать для этого:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Чтобы сделать его постоянным, поместите эту команду в C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.

Свик
источник
27
MenuCompleteвместо этого Completeон больше похож на bash, он позволяет использовать клавиши со стрелками для выбора из доступных опций
stib
1
@LeBleu Это странно, потому что моя новая машина с Windows 10 шла с PSReadline. Я думал, что модуль от Microsoft.
Франклин Ю
8
Кстати, если файл profile.ps1 не существует на вашем компьютере, вы можете сгенерировать его с помощью командыnew-item $profile -itemtype file -force
Рейнис
2
Очень вероятно, что на вашем компьютере не будет. C:\Users\[User]\Documents\WindowsPowerShell\profile.ps1.Вам действительно нужно запуститьnew-item $profile -itemtype file -force
RF
1
Это действительно неудобное написание для touch:-(
SamB
21

Теперь можно заставить PowerShell выполнять завершение в стиле Bash с помощью PSReadline.

Ознакомьтесь с публикацией в блоге Завершение вкладок в стиле Bash в PowerShell .

Джей Базузи
источник
4
Ссылка в блоге не работает, однако в конце дня она приводит вас к PsReadline (последняя фиксация в 2012 г.), которая была разветвлена ​​(последняя фиксация в 2013 г.)
GameScripting
6
В настоящее время вы можете сделать это с помощью однострочника, как описано здесь: stackoverflow.com/a/37715242/24874
Дрю Ноукс
15

Взгляните сюда, не совсем то, что вам нужно:

PowerTab

но я думаю, что это лучшая функция расширения вкладок для консоли PowerShell !!!

CB.
источник
Интересный. Если есть способ сделать что-то подобное, то кажется вполне возможным заставить расширение работать как в bash. Я далек от того, чтобы быть экспертом в PowerShell, поэтому, возможно, что-то упускаю.
Andriy M
Конечно! Начните изучать код модуля PowerTab, чтобы попытаться удовлетворить ваши потребности в расширении. Но PowerTab предлагает расширения практически для любой команды, wmi, comobject, сборки с простым способом выбора!
CB.
7

tab завершает только имя команды, а не ее предыдущие аргументы / параметры.

чтобы также выполнить автозаполнение полной команды с аргументами из истории, установите следующую привязку клавиш.

Set-PSReadlineKeyHandler -Key UpArrow -Function HistorySearchBackward
Set-PSReadlineKeyHandler -Key DownArrow -Function HistorySearchForward

Теперь введите несколько символов имени команды и используйте стрелки вверх / вниз для автозаполнения этой команды (с аргументами) из истории.

реальная экономия времени.

Гурав
источник
5

Измените функцию TabExpansion, чтобы добиться желаемого. Помните, что, возможно, он завершится до конца, если вы снова нажмете вкладку, новое предложение изменится с того места, где вы первоначально нажали клавишу. Я очень предпочитаю реальное поведение, я хочу, чтобы строка была написана как можно быстрее. Наконец, не забудьте про подстановочные знаки, например: bu * h [Tab] автоматически завершается до buildHouse.bat

mjsr
источник
Изменение функции TabExpansion, вероятно, будет подходящим вариантом, но все же намного более сложным, чем то, что я искал. Я думаю, мне нужно научиться более свободно говорить в PowerShell, прежде чем я смогу с этим возиться.
RobSiklos
1

С Powershell Core мы можем установить свойство PredictionSource для PSReadLine как History, чтобы получить автоматическое предложение. Более подробную информацию см. В видео на YouTube https://youtu.be/I0iIZe0dUNw

Нилеш Гуле
источник
1
# keep or reset to powershell default
Set-PSReadlineKeyHandler -Key Shift+Tab -Function TabCompletePrevious

# define Ctrl+Tab like default Tab behavior
Set-PSReadlineKeyHandler -Key Ctrl+Tab -Function TabCompleteNext

# define Tab like bash
Set-PSReadlineKeyHandler -Key Tab -Function Complete
徐志鹏
источник