Автозаповнення імені файлу в каталозі


16

Це питання досить схоже на це , але я не можу зрозуміти рішення. Я також знаю цей підручник , але все-таки я не в змозі зрозуміти, що я роблю неправильно.

Я намагаюся заповнити список каталогів, розміщених у /something/:

$ ls /something/

One    Other    Three

таким чином, що це станеться:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Тільки тоді, коли перше слово є, hiі не тільки всередині /something/.

Це те, що я роблю .profile:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen `ls /something/` -- $cur) )

}
complete -F _codeComplete "hi "

Відповіді:


15

Спробуйте:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W "$(ls /something/)" -- $cur) )
}

complete -F _codeComplete hi

Вам потрібно вказати -Wпараметр у, compgenа також процитувати команду, яка створює список слів.

Детальніше про те, як написати функції завершення в цьому блозі: Написання власної функції завершення Bash


6
Не вдасться назвати файли, що містять пробіли та інші спеціальні символи.
Жил "ТАК - перестань бути злим"

2
Дивно важко знайти ім’я completeкоманди, якщо ви її ще не знаєте і шукаєте autocompleteабо tab-completion... Це було перше місце, де я знайшов ім'я команди, і що мені потрібно було виправити для ejectоновлення до Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, тому виправлення було complete -F _longopt eject
:)

1

Дозвольте спробувати покращити прийняту відповідь.

Оригінальна відповідь не буде мати імена файлів, що містять пробіли. Після деякого розслідування я розумію, що ви можете змінити роздільник вводу на кінець рядка:

IFS=$'\n'

зробити правильно обробляти пробіли функції.

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    IFS=$'\n' tmp=( $(compgen -W "$(ls ~/something/ )" -- $cur))
    COMPREPLY=( "${tmp[@]// /\ }" )
}

complete -F _codeComplete hi

1

Ось версія, яка не лише обробляє пробіли, але й уникає їх:

_codeComplete()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local AUTO_COMPLETE_DIRS=$(ls /something/)

    IFS=$'\n' COMPREPLY1=( $(compgen -W "$AUTO_COMPLETE_DIRS" -- $cur))
    COMPREPLY2=( "${COMPREPLY1[@]// /\ }" )
    COMPREPLY=($(printf "%q\n" "${COMPREPLY2[@]}"))

}
complete -F _codeComplete "hi "

(На основі відповідей догбена та Едуардо Альмейди дос Сантоса , але з втечею, як це передбачено антаком на SO: /programming//a/11536437/1536933 )


0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.