Автозаполнение имени файла в каталоге


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.