#bash #powershell #tab-completion
#bash #powershell #вкладка-завершение
Вопрос:
В качестве примера предположим, что я ввожу часть имени:
$ vi partn <= here I press <tab><tab>
partname partnook partnum <= these are the results
Это стандартное поведение в bash
, и это нормально, но в последнее время я много работал над PowerShell, где поведение по умолчанию таково, что если вы нажмете tab, он перебирает имена, завершая каждое имя, а затем снова нажимая tab, переходит к следующему файлу, поэтому, если я нажал tab один раз,Я вижу vi ./partname
, затем снова нажимаю tab, я вижу vi ./partnook
, затем снова вижу tab vi ./partnum
. Я предпочитаю такое поведение, поскольку оно требует меньше ввода (вы просто нажимаете tab, чтобы переключаться, пока не получите нужное имя файла или команду).
Конечно, в Linux все настраивается, поэтому может кто-нибудь посоветовать, как я могу изменить bash
поведение по умолчанию, чтобы следовать приведенному выше по умолчанию?
Ответ №1:
Чтобы постоянно делать так, чтобы завершение табуляции не требовало двух Tab нажатий клавиш всякий раз, когда выполняется несколько совпадающих завершений, и вместо этого перебирать их, в строке:
Вариант A: если у вас уже есть:
/etc/inputrc
файл (применяется в масштабах всей системы, требуется модификацияsudo
)- и / или
~/.inputrc
файл (зависящий от пользователя)
и / или
вы планируете широко настраивать библиотеку Readline и / или хотите сделать настройки эффективными и для сценариев, когда они вызывают read -e
:
Добавить строку:
"C-i": menu-complete
в любой файл, в зависимости от того, хотите ли вы, чтобы настройка действовала для всех пользователей или для текущего пользователя (при необходимости создайте файл).
Примечание. В качестве альтернативы, вы можете просто отключить необходимость Tab двойного нажатия и мгновенно выполнить стандартное поведение, что означает отображение списка из нескольких столбцов со всеми возможными завершениями, а затем повторное отображение строки ввода, чтобы вы могли вводить дополнительные символы либо для полного завершения аргумента, либо для ввода достаточного его количестватак что следующее Tabнажатие клавиши однозначно завершается:
set show-all-if-ambiguous on
Вариант B: В качестве альтернативы вы можете добавить команды Readline в свой пользовательский файл инициализации ( ~/.bash_profile
в macOS, ~/.bashrc
Linux и других Unix-подобных платформах), передав их в качестве одного аргумента bind
встроенному:
bind '"C-i": menu-complete'
Если вы предпочитаете показывать все совпадения:
bind 'set show-all-if-ambiguous on'
Обратите внимание, что bind
команды в ~/.bash_profile
/ ~/.bashrc
имеют приоритет над эквивалентными командами в любом /etc/inputrc
или ~/.inputrc
.
Как подразумевалось выше, настройка Readline таким образом не вступит в силу в сценариях, которые вызываются read -e
для активации поддержки Readline для чтения пользовательского ввода.
Комментарии:
1. хорошо, попробовал и … это работает! Удивительные. Спасибо, Майк, не знаю, как ты всегда это знаешь, это здорово! Раньше мне нравилось, как Linux выполнял завершение табуляции (это было значительно лучше, чем в старые добрые времена DOS), но затем по умолчанию PowerShell снова был лучше, чем по умолчанию bash (на мой взгляд). Действительно приятно иметь возможность использовать это в консоли bash. 🙂
2. Рад слышать, что это было полезно, @YorSubs (в стороне: ничего особенного, но я называю Майкла). Да, завершение вкладки PowerShell очень эффективно с помощью собственных команд PowerShell. Чтобы заставить его работать с внешними программами, требуется дополнительная работа, но есть сторонние проекты, которые могут помочь — см. Модуль posh-cli (репозиторий здесь ).