Autouzupełnianie nazwy pliku w katalogu

16

To pytanie jest dość podobne do tego , ale nie rozumiem rozwiązania. Znam również ten samouczek , ale nadal nie jestem w stanie zrozumieć, co robię źle.

Próbuję automatycznie uzupełnić listę katalogów umieszczonych w /something/:

$ ls /something/

One    Other    Three

w taki sposób, aby tak się stało:

$ hi [TAB]

One Other Three
$ hi O[TAB]

One Other

Tylko wtedy, gdy pierwsze słowo jest hii nie tylko w środku /something/.

Oto co robię w .profile:

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

}
complete -F _codeComplete "hi "
Donovan
źródło

Odpowiedzi:

15

Próbować:

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

complete -F _codeComplete hi

Musisz określić -Wopcję wcompgen a także zacytować polecenie, które tworzy listę słów.

Więcej informacji na temat pisania funkcji uzupełniania na tym blogu: Pisanie własnej funkcji uzupełniania Bash

dogbane
źródło
6
Nie powiedzie się to w przypadku nazw plików zawierających białe znaki i innych znaków specjalnych.
Gilles „SO- przestań być zły”
2
Dziwnie trudno jest znaleźć nazwę completepolecenia, jeśli jeszcze go nie znasz i szukasz autocompletelub tab-completion... To było pierwsze miejsce, w którym znalazłem nazwę polecenia i to, czego potrzebowałem, aby to naprawić ejectprzy aktualizacji do Ubuntu 14.04 ( $ complete -p ls-> complete -F _longopt ls, więc poprawka była complete -F _longopt eject
:)
1

Pozwól, że poprawię przyjętą odpowiedź.

Oryginalna odpowiedź nie powiedzie się w przypadku nazw plików zawierających białe znaki. Po pewnym dochodzeniu zdaję sobie sprawę, że możesz zmienić separator wejściowy na koniec linii:

IFS=$'\n'

prawidłowe ustawienie funkcji obsługi spacji.

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

complete -F _codeComplete hi
Eduardo Almeida dos Santos
źródło
1

Oto wersja, która nie tylko obsługuje spacje, ale również je wymyka:

_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 "

(Na podstawie dogbane 's i Eduardo Almeida Dos Santos ' odpowiedzi, ale z ucieczki przewidziane przez antak na SO: /programming//a/11536437/1536933 )

EM0
źródło
0
_hi() {
    COMPREPLY=(cd /something/ && compgen -A directory -S / -- $2)
}

complete -o nospace -F _hi hi
xdch47
źródło