Как заставить zsh Tab-дополнение cat **/foo<TAB>
соответствовать и завершать первый найденный файл foo*
в любом подкаталоге текущего каталога?
Например, сделайте это, находясь в новом тестовом каталоге: (опять же, это zsh)
% mkdir aaa bbb ccc
% touch aaa/foo bbb/foo ccc/foo
% cat **/f<TAB>
Я хочу, чтобы при нажатии <TAB>
на последнюю строку мой экран выглядел примерно так:
% cat aaa/foo_ # filled in the first match; "_" is the cursor
aaa/foo bbb/foo ccc/foo # and here is the list of all matches
Я попробовал setopt GLOB_COMPLETE
, но это не дало того, чего я хотел.
решение1
Добавьте в файл следующее ~/.zshrc
(или вставьте в командную строку, чтобы попробовать):
# Load Zsh's new completion system.
autoload -Uz compinit && compinit
# Bind Tab to complete-word instead of
# expand-or-complete. This is required for
# the new completion system to work
# correctly.
bindkey '^I' complete-word
# Add the _match completer.
# We add it after _expand & _complete, so it
# will get called only once those two have
# failed.
# _match_ completes patterns only, which
# _expand can do, too, (which is why we call
# _match_ only when _expand & _complete
# fail), but _match adds an extra * at the
# cursor position. Without that, the pattern
# **/f would not match {aaa,bbb,ccc}/foo
zstyle ':completion:*' completer \
_expand _complete _match _ignored
# Let all possible completions for a partial
# path be listed, rather than just the first
# one.
zstyle ':completion:*' list-suffixes true
Затем, когда вы введете cat **/f
и нажмете Tab, вы получите следующий вывод:
% cat aaa/foo
aaa/foo bbb/foo ccc/foo
**/f
Документация:
Смотрите также:Руководство пользователя Z-Shell: комплектация, старая и новая