Як зробити так, щоб завершення вкладки PowerShell працювало як Bash


105

Скажімо, у моєму поточному каталозі є такі файли:

buildBar.bat
buildFoo.bat
buildHouse.bat

І я набираю наступне у своєму командному рядку, ./buа потім TAB.

  • У Bash він розширюється до ./build

  • У PowerShell він розширюється до ./buildBar.bat- першого пункту у списку.

  • У Cmd поведінка така ж, як у PowerShell.

Я віддаю перевагу поведінці Баша - чи є спосіб змусити PowerShell поводитись як Баш?


2
Ви можете використовувати Cygwin's bash;)
Blender

12
Так - це те, що я робив протягом останнього десятиліття або близько того, але я намагаюся перейти до PowerShell, тому що я хочу мати можливість літати за командним рядком у інших системах, крім власної, де Cygwin не є встановлено.
RobSiklos

Відповіді:


174

Нові версії PowerShell включають PSReadline, який можна використовувати для цього:

Set-PSReadlineKeyHandler -Key Tab -Function Complete

Щоб зробити його постійним, введіть цю команду в C: \ Users \ [User] \ Documents \ WindowsPowerShell \ profile.ps1.


25
MenuCompleteзамість того Complete, що більше нагадує баш, він дозволяє використовувати клавіші зі стрілками для вибору з доступних варіантів
стиб

1
@LeBleu Це дивно, адже моя нова машина Windows 10 поставилася з PSReadline. Я думав, що модуль був від Microsoft.
Франклін Ю

8
До речі, якщо файл profile.ps1 не існує на вашій машині, ви можете створити його командоюnew-item $profile -itemtype file -force
Reinis

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 !!!


Цікаво. Якщо є спосіб зробити щось подібне, тоді видається цілком можливим зробити так, щоб розширення працювало, як у bash. Я далеко не фахівець у PowerShell, однак, можливо, чогось не вистачає.
Андрій М

Звичайно! Почніть вивчати код модуля PowerTab, щоб спробувати виконати свої потреби в розширенні. Але PowerTab пропонує розширення майже для будь-якої команди, wmi, comobject, збірки з простим способом вибору!
КБ.

7

tab тільки завершує ім'я команди не її попередні аргументи / параметри.

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

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

Тепер введіть кілька символів імені команди та використовуйте стрілку вгору / вниз для автоматичного завершення цієї команди (з аргументами) з історії.

в режимі реального часу.


5

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


Модифікація функції TabExpansion - це, мабуть, шлях, але все ще набагато складніше, ніж те, що я шукав, хоча. Я думаю, що мені потрібно буде набагато краще володіти силою, перш ніж я зможу зіткнутися з цим.
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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.