Частичное расширение Bash

595
Ryo

У меня есть вопрос, похожий на этот, но другой: я хочу, чтобы bash использовал расширение glob в автозаполнении, если это возможно. Например, я хотел бы

$ ls *2.<TAB> 

Дать мне:

$ ls mydoc2. mydoc2.pdf mydoc2.tex mydoc2.txt 

Я сталкиваюсь с этой ситуацией довольно часто. В приведенном выше примере я использовал короткий префикс «mydoc», но фактические часто бывают довольно длинными. Это возможно?

Я понимаю, *2.*что расширится C-x*, но это другая функция, которая не подходит в этой ситуации (потому что мне нужно выбрать только один файл из списка файлов, которые соответствуют глобусу).

2

1 ответ на вопрос

1
Travis Clarke

Лучший способ симулировать это поведение автозаполнения - включить переменную readline (для отображения возможных завершений, если найдено более одного совпадения), а затем вызвать завершение с помощью команды readline (чтобы выполнить расширение имени пути glob).show-all-if-ambiguous glob-complete-word


# 1: Enable `show-all-if-ambiguous` in ~/.inputrc  set show-all-if-ambiguous on 

show-all-if-ambiguous : Это изменяет поведение по умолчанию функций завершения. Если установлено значение «вкл.», Слова, которые имеют более одного возможного завершения, приводят к немедленному отображению совпадений, а не к звонку. Значением по умолчанию является «off».


# 2a: Check to ensure that `glob-complete-word` is bound.  $ bind -q "glob-complete-word"  glob-complete-word can be invoked via "\eg".   # 2b: If unbound, bind `glob-complete-word` to "\eg".  $ bind '"\eg":glob-complete-word' 

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


# 3: Trigger the autocompletion with <META-g> or <ESC-g>  # META => alt (Windows/Linux) # META => option (OSX)  $ ls *2.<META-g>   # possible completions will be listed (show-all-if-ambiguous)  mydoc2.pdf mydoc2.tex mydoc2.txt  # glob pathname completion will be performed (glob-complete-word) $ ls mydoc2.  
Спасибо! Ваш метод работает! Один вопрос: я не понимаю, зачем показывать все, если неоднозначно. Другими словами, что глобус-полное слово должно делать самостоятельно? На моем терминале ничего не происходит без show-all-if-неоднозначного readline. Ryo 6 лет назад 1
@Ryo - `glob-complete-word` выполняет фактическую * завершающую * часть. Таким образом, в этом примере он преобразует `* 2.` в` mydoc2.`. `show-all-if-ambiguous` - это то, что обрабатывает список возможных завершений (` mydoc2.pdf` `mydoc2.tex`` mydoc2.txt`) для неоднозначных (т. е. более 1) совпадений. Если вы вызываете ``несколько раз с отключенным` show-all-if-ambiguous`, большинство оболочек обычно показывают список завершения; эта опция просто делает его более плавным, так как он работает при первом вызове. Travis Clarke 6 лет назад 0