Есть ли возможность сделать автозаполнение в Powershell, как в bash?


19

Мне нравится Powershell, но, исходя из опыта работы с Linux, есть несколько вещей, которые действительно меня беспокоят. Как, например, как работает автозаполнение по умолчанию.

Например: Get-PS расширяется до «Get-PSBreakpoint», который является первой соответствующей командой. В bash, если есть только одна команда, соответствующая bash расширится до соответствующей команды. Если есть несколько нажатий на вкладку, когда однажды ничего не происходит, вкладка двойного касания покажет список соответствующих команд, но не расширяется. Есть ли способ заставить Powershell вести себя так?

И еще одна вещь, если я написал одну строку и переместил маркер обратно к более ранней команде (маркер находится там, где находится ^):

«Get-PSS ^ | Remove-PSSession» автоматически завершает «Get-PSSession ^», удаляя все завершающие команды. В bash завершающие команды все равно будут там не затронуты. Есть ли способ заставить Powershell не удалять завершающие команды при автозаполнении?

Бонусом было бы получить CTRL + L, чтобы очистить экран. CTRL + A, чтобы перейти к началу строки, и CTRL + E, чтобы перейти к концу строки.


Я опубликовал ответ на ваш вопрос, но забавно то, что я прибыл на этот вопрос, потому что я ищу прямо противоположное ... Я хочу завершить стиль PowerShell в bash :)
Robert S Ciaccio

Завершение стиля PowerShell доступно в bash - ищите полное меню функций
Джейсон Ширк

К счастью, теперь у нас есть bash на windows 10.
byxor

Ответы:


11

Проверьте PSReadline .

Из статьи:

Этот модуль заменяет опыт редактирования командной строки в PowerShell.exe. Это обеспечивает:

  • Синтаксическая раскраска
  • Простое синтаксическое сообщение об ошибке
  • Хороший многострочный опыт (как редактирование, так и история)
  • Настраиваемые привязки клавиш
  • Режимы Cmd и emacs (ни один из них еще не полностью реализован, но оба могут использоваться)
  • Множество вариантов конфигурации
  • Завершение стиля Bash (необязательно в режиме Cmd, по умолчанию в режиме Emacs)
  • Интерактивный поиск истории в стиле Bash / Zsh (CTRL-R)
  • Emacs yank / kill ring
  • PowerShell на основе токенов "слово" движение и убить
  • Отменить повторить
  • Автоматическое сохранение истории, включая совместное использование истории между сеансами в реальном времени
  • Завершение «Меню» (что-то вроде Intellisense, выберите завершение стрелками) через Ctrl + Пробел

Я использую это ежедневно!


4
После установки PSReadLine необходимо включить завершение вкладки в стиле bash, добавив его в свой профиль:Set-PSReadlineKeyHandler -Key Tab -Function Complete
brianpeiris

3
PSReadLine теперь установлен по умолчанию в Windows 10. Просто поместите строку конфигурации, упомянутую @brianpeiris, в свой профиль, и все готово.
Дон Круикшенк

Попробуйте использовать CompleteMenuвместо Completeболее похожего на bash, он позволяет вам использовать клавиши со стрелками для навигации по выбору
stib

3

Возможно, вам стоит взглянуть на Powertab , настраиваемое расширение для вкладки PowerShell.


2
Благодарность! Powertab действительно расширяет возможности вкладок. Тем не менее, проблема завершения чего-то не в конце команды есть.
Питер Моберг

2

Привет, Питер, просто нажми F8 для чего-то вроде speedsearch. Он завершается командами, которые вы запускаете ранее, которые начинаются с того, что у вас есть в строке. Проблема с удалением трейлинга раздражает, я пишу предложение в Connect по поводу той же проблемы. В основном вы можете использовать Powershell ISE, который ведет себя немного лучше (не удаляйте висячие символы).


2

Старая подсистема command.exe по-прежнему участвует в PowerShell и вызывает много неприятных действий. Но с PowerShell v3 графический интерфейс (PowerShell ISE) теперь можно использовать, и он включает в себя гораздо более современный опыт завершения + раскрашивание.

введите описание изображения здесь


2

PowerShell использует те же функции консоли, что и почтенная командная строка; так у вас есть обычный Home / End, и:

  • F3 вызвать предыдущую команду
  • F1 скопировать один символ из предыдущей команды
  • F7 всплывающее окно истории

... но, насколько я знаю, нет возможности показать все возможные варианты.


Это все еще очень ограничивает по сравнению со старым добрым bash Например, действительно здорово иметь возможность вводить ctrl + r (speedsearch) в bash и просто начать печатать, и появится соответствующая предыдущая команда.
Питер Моберг

1

Обычный powershell использует cmd в качестве окна командной строки. Вот почему он имеет огромное наследие (программы ретранслируют поведение старого cmd целую вечность), который нельзя изменить из-за обратной сопоставимости.

Я рекомендую вам использовать powershell_ise вместо powershell (он входит в стандартную комплектацию powershell). Версия 3.0 (не уверена в предыдущем) поддерживает Intellisense из коробки. Это очень близко к стилю завершения bash. Просто нажмите Ctrl + Пробел вместо Tab. У меня возникают проблемы с пользовательскими дополнениями в PowerTab, но Intellisense прекрасно с ним работает. Powershell_ise также сохраняет конечные команды, имеет нормальный режим выбора, поддерживает Ctrl + C, Ctrl + V, Ctrl + A для выбранной введенной команды, поэтому Ctrl + A, переход к началу строки, Ctrl + A, до конца (или Home /Конец).


0

PowerShell использует собственный синтаксический анализатор для команд, поэтому в некотором смысле это оболочка, отличная от cmd.exe, даже если они используют один и тот же терминал (окно графического интерфейса пользователя).

Из-за этого различия PowerShell позволяет вам переопределить функциональность завершения табуляции своей собственной функцией. У меня не было времени возиться с этим самостоятельно, но вы в основном переопределяете функцию tabexpansionв своем профиле, так же, как вы можете переопределить promptфункцию.

Я нашел эту статью , написанную Ли Холмсом (автором потрясающей книги Windows PowerShell Cookbook ), в которой описывается переопределение табуляции, очень похожее на то, что вы ищете. Вы могли бы, вероятно, настроить его, чтобы дать вам именно то, что вы хотите.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.