Сначала найдите решение zsh
, а затем решение bash
.
Обновление: оказалось, что реализация zsh
(на основе встроенной функции compctl
) намного проще, чем реализация bash
(на основе встроенной функции complete
).
Сохраните интересующий код в файл (например, frontend
) и отправьте его (например, . ./frontend
); либо в интерактивном режиме, либо, что предпочтительнее, из вашего профиля bash/zsh.
После этого автозаполнение имен подкаталогов в ~/Desktop/Work/Frontend
будет работать следующим образом:
- Введите, например,
frontend myProject
и нажмите TAB.
myProject
is then prefix-matched against the names of the subdirectories in ~/Desktop/Work/Frontend
:
- If there's only 1 match,
myProject
will instantly expand to the full subdirectory name.
- Otherwise, a beep sounds to indicate that there are multiple matches:
zsh
: The names of all matching subdirectories are listed right away.
bash
: Нажмите TAB еще раз, чтобы просмотреть имена всех соответствующих подкаталогов.
- Продолжайте вводить до тех пор, пока совпадение префикса не станет однозначным, затем снова нажмите клавишу TAB.
Примечание. В bash
, чтобы также требовалось только один раз нажать TAB для отображения нескольких совпадений, добавьте следующее в свой профиль оболочки bind "set show-all-if-ambiguous on"
.
zsh решение:
# Define the shell function.
frontend(){
cd ~/Desktop/Work/Frontend/"${1:-}"
}
# Tell zsh to autocomplete directory names in the same directory as
# the function's when typing a command based on the shell function.
compctl -/ -W ~/Desktop/Work/Frontend frontend
bash решение:
Примечание. complete -o dirnames
, к сожалению, не принимает аргументов — он всегда автоматически дополняется для текущего каталога. Таким образом, требуется специальная функция оболочки, которая возвращает возможные совпадения в сочетании с -o filenames
.
# Define the main shell function.
frontend(){
local BASEDIR=~/Desktop/Work/Frontend
cd "$BASEDIR/${1:-}"
}
# Define the custom completion function.
_frontend_completions() {
local BASEDIR=~/Desktop/Work/Frontend
# Initialize the array variable through which
# completions must be passed out.
COMPREPLY=()
# Find all matching directories in the base folder that start
# with the name prefix typed so far and return them.
for f in "$BASEDIR/${COMP_WORDS[COMP_CWORD]}"*; do
[[ -d $f ]] && COMPREPLY+=( "$(basename "$f")" )
done
}
# Tell bash to autocomplete directory names as returned by the
# _frontend_completions() helper functoin when typing a command
# based on the main shell function.
complete -o filenames -F _frontend_completions frontend fe
person
mklement0
schedule
28.02.2014
ls
вывод папки, о которой вы говорите, с именами .m и .tablet? - person brokenfoot   schedule 01.03.2014if
, который будетls
работать в случае сбоя, но как оставить его открытым, чтобы пользователь мог выбрать, какой файл ускользает от меня - person JDillon522   schedule 01.03.2014