Предполагая следующую ситуацию, в том числе два уровня подкаталогов:
.
├── colors
│ ├── blue.txt
│ └── red.txt
├── completion.bash
├── people
│ ├── rdir
│ ├── roger.txt
│ └── subdir
│ └── rhino.txt
└── readme.txt
Вы можете получить вид завершения, который вы хотите w Ith этой функции:
_comp_less() {
# Store current globstar setting and set globstar if necessary
local glob_flag
if shopt -q globstar; then
glob_flag=0
else
glob_flag=1
shopt -s globstar
fi
# $2 is the word being completed
local cur=$2
# Loop over all files and directories in the current and all subdirectories
local fname
for fname in **/"$cur"*; do
# Only add files
if [[ -f "$fname" ]]; then
COMPREPLY+=("$fname")
fi
done
# Set globstar back to previous value if necessary
if ((glob_flag == 1)); then
shopt -u globstar
fi
return 0
}
Он проверяет опции в globstar
оболочки и устанавливает его в случае необходимости (и сбрасывает его снова, если он не был установлен, чтобы начать с), а затем использует **/"$cur"*
Glob, чтобы получить все файлы и каталоги (включая подкаталоги), которые заполняют текущее слово и, наконец, отфильтровывают имена каталогов.
Функция может пойти в вашем .bashrc
, вместе с инструкцией, чтобы использовать его для less
:
complete -F _comp_less less
Теперь less r<tab>
завершается следующим образом:
$ less r
colors/red.txt people/subdir/rhino.txt
people/roger.txt readme.txt
Для только конкретной команды, или всегда ? –
Всегда. Где бы «x» обычно возвращал бы все файлы, начинающиеся с x в текущей папке, я бы хотел, чтобы он также возвращал все в папки ниже. –
mahemoff
Я не уверен, что это может произойти _allways_, так как это должно было бы переопределить поведение 'compgen -F'. Однако вы могли бы получить что-то вроде этого для определенных команд с помощью собственной функции завершения. –