поведение bash при нажатии дважды для завершения имени файла

#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 (репозиторий здесь ).