Я только что начал использовать плагин Command-T для vim, и он крут. Если вы о нем не слышали, он позволяет вам набирать что-то вроде этого:
Sb
чтобы выбрать Something.hs-boot из списка
src/project/Control/Whatever/Foobs.hs
src/project/Control/Whatever/Something.hs-boot
src/project/Control/Whatever/Something.hs
И так далее.
Мне было интересно, могу ли я использовать похожий стиль автодополнения с zsh. Я понимаю, что дополнение оболочки не может быть таким же обширным, как дополнение vim, потому что дополнение оболочки, вероятно, не должно искать по всей системе каждый раз, когда вы вводите букву, но есть ли какой-то аналогичный стиль автодополнения, где я мог бы хотя бы ввести
s/p/c/w/Sb<tab>
и получить эффект, аналогичный показанному выше?
Я слышал, что в zsh есть довольно хорошо программируемая функциональность автодополнения, но мой shell-fu довольно слаб.
Кто-нибудь знает, как это настроить?
решение1
Чтобы завершить частичные пути, достаточно просто инициализировать систему завершения (по крайней мере, в моей системе, с помощью zsh v4.3.17
):
autoload -U compinit && compinit
zmodload zsh/complist
Если вы хотите сделать что-то более замысловатое, вы можете сделать сопоставление нечувствительным к регистру:
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
Обновление 1:
Я не знаю, можно ли сделать автодополнение в стиле Command-T... но поскольку zsh должен получитьвсесопоставляется до того, как что-то отобразится, выполнение этого «на лету», особенно там, где много подкаталогов/файлов, может оказаться нецелесообразным.
Однако вы можете использовать:
**/*thing <Tab>
Соответствует **
всем файлам и подкаталогам текущего каталога.
Идея: Если это не обязательно должен быть актуальный список файлов, вы могли бы написать функцию завершения, которая использует выходные данные locate
(т. е. предварительно вычисленный список файлов)
Обновление 2: https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh
решение2
Еще одна интересная альтернатива — использовать что-то вродефасд.