Автодополнение Bash с подстановочными знаками

Автодополнение Bash с подстановочными знаками

Я хотел бы ввести в терминале, как я это делаю в emacs:

emacs 2019-*subject*

При нажатии Tabя получаю первое совпадение:

2019-08-03-subject.markdown 

Я бы хотел, чтобы он показывал мне такие варианты, как:

2019-08-03-subject.markdown 2019-bla-bla-subject-predicate.markdown etc...

Я поискал всюду в Интернете и не могу поверить, что такой функции нет.

Естьмного похожийзаданных вопросов.Ответы не работают так, как мне хотелось бы (показано выше). Другие решения, которые я пробовал:здесь.

P.S. Я использую Ubuntu 16. Это типичная функциональность, которую я нахожу в emacs, когда открываю файлы. Это было бы очень удобно.

решение1

Что произойдет дальше, Tabзависит от сценариев завершения.Этот ответзаставляет меня верить, что желаемое поведение имело место по крайней мере для одного пользователя в 2013 году, но в 2019 году поведение моего Debian 9 такое, как вы описали; возможно, скрипты/поведение с тех пор изменились.

Кроме того, Bash выбирает скрипт в соответствии с набранной командой (первое слово в текущей строке). Не сразу становится очевидным, что какое-либо одно изменение может повлиять на все дополнения, чтобы предоставить то, что вам нужно (я думаю, функция _filedir— хорошее начало).


К счастью, вы можете получить возможные расширения по запросу. Из man 1 bash(под READLINEзаголовком):

glob-complete-word( M-g)
Слово перед точкой рассматривается как шаблон для расширения имени пути, с неявно добавленной звездочкой. Этот шаблон используется для генерации списка соответствующих имен файлов для возможных завершений.

glob-expand-word( C-x *)
Слово перед точкой рассматривается как шаблон для расширения имени пути, и список соответствующих имен файлов вставляется, заменяя слово. Если указан числовой аргумент, перед расширением имени пути добавляется звездочка.

glob-list-expansions( C-x g) Отображается
список расширений, которые были бы сгенерированы glob-expand-word, и линия перерисовывается. Если указан числовой аргумент, перед расширением имени пути добавляется звездочка.

M-g, C-x *и C-x gописать привязки клавиш по умолчанию. В более удобном формате это:

  • Meta+ g( Alt+ g) для glob-complete-word,
  • Ctrl+ x, (отпустите Ctrl) *для glob-expand-word(примечание: *на самом деле это Shift+ 8на моей клавиатуре),
  • Ctrl+ x, (отпустить Ctrl) gдля glob-list-expansions.

Следующий код устанавливает эти привязки (на случай, если они по какой-либо причине отсутствуют):

  • только для текущей оболочки:

    # commands to run in Bash
    bind '"\eg":   glob-complete-word'
    bind '"\C-x*": glob-expand-word'
    bind '"\C-xg": glob-list-expansions'
    
  • или в вашей постоянной конфигурации ( /etc/inputrcили ~/.inputrc):

    # lines to add
    "\eg":   glob-complete-word
    "\C-x*": glob-expand-word
    "\C-xg": glob-list-expansions
    

    (обратите внимание, это повлияет только на новые оболочки, если выперезагрузить).


Вам будет интересно glob-complete-wordили glob-list-expansions. Основные отличия:

  • glob-complete-wordвсегда добавляет звездочку, тогда как glob-list-expansionsделает это условно (см. цитируемое руководство).
  • Если совпадений много, то вам может потребоваться glob-complete-wordдважды выполнить запуск (т. е. дважды нажать комбинацию клавиш), прежде чем он что-то напечатает; это зависит от show-all-if-ambiguous, сравнитеуже упомянутый ответ.
  • Если совпадение только одно, то glob-complete-wordбудет выполнено фактическое завершение строки, при этом glob-list-expansionsсовпадение будет просто отображено.

В вашем конкретном случае введите следующее:

emacs 2019-*subject*

тогда Ctrl+ x, g.

Связанный контент