2016-10-30 6 views
1

Есть ли способ настроить bash так, чтобы удалять вкладку для расширения имени файла будет поиск всех подпапок, а также текущей папки?Bash: Заполнение имени файла вкладки во всех подпапках

например. моя структура папок

readme.txt 
colors/blue.txt 
colors/red.txt 
people/roger.txt 

Я хочу less r<tab> (или, возможно, less **/r<tab> расширить, чтобы показать все возможности расширения, начиная с r:

readme.txt colors/red.txt people/roger.txt

+0

Для только конкретной команды, или всегда ? –

+0

Всегда. Где бы «x » обычно возвращал бы все файлы, начинающиеся с x в текущей папке, я бы хотел, чтобы он также возвращал все в папки ниже. – mahemoff

+0

Я не уверен, что это может произойти _allways_, так как это должно было бы переопределить поведение 'compgen -F'. Однако вы могли бы получить что-то вроде этого для определенных команд с помощью собственной функции завершения. –

ответ

1

Предполагая следующую ситуацию, в том числе два уровня подкаталогов:

. 
├── 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