Я хотел бы ввести в терминале, как я это делаю в 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.