Я делал что-то похожее. Вы используете oh-my-zsh? Если да, убедитесь, что вы включили плагин zsh-completions в вашем .zshrc
файле. Я бы также рекомендовал плагин zsh-autosuggestions.
После этого вам нужно добавить следующее в файл .zshrc
(если его там еще нет)
fpath=(~/.zsh/completions $fpath)
autoload -U compinit && compinit
Как вывести все параметры, начинающиеся с foo
:
declare -p ${(Mk)parameters:#foo*}
Все переменные хранятся в ассоциативном массиве parameters
, поэтому достаточно вывести все его ключи (k)
и поискать паттерн foo*
. Флаг (M)
присутствует для удаления несовпадающих элементов.
Output:
typeset foo_a=1
typeset foo_b=2
(обратите внимание, что declare
- то же самое, что typeset
).
Вставка не работает так, как ожидалось, из-за недавно появившейся функции под названием bracketed_paste:
zle_bracketed_paste
Многие эмуляторы терминалов имеют функцию, которая позволяет приложениям определять, когда текст вставляется в терминал. когда текст вставляется в терминал, а не набирается обычным образом. Для ZLE это означает, что специальные символы, такие как табуляция и новая строка, могут быть вместо того, чтобы вызывать команды редактора. Кроме того, вставленный текст формирует одно событие отмены, и если область активна, вставленный текст заменит регион.
Этот двухэлементный массив содержит терминальные управляющие последовательности для включения и отключения функции. Эти управляющие последовательности используются для включения вставки со скобками, когда ZLE активен, и отключения в другое время. Снятие установки приводит к тому, что вставка со скобками остается отключенной.
Просто снимите значение, если оно вам не нравится:
unset zle_bracketed_paste
@jimmij дал отличный ответ, и это работает в общем случае для печати совпадений с шаблоном для каждого ключа в ассоциативном массиве.
Однако в случае переменных окружения zsh
есть встроенное -решение, которое я нашел с помощью команды typeset
, когда читал man zshbuiltins
.
Вы можете просто использовать опцию typeset
's -m
и предоставить в кавычках шаблон имен параметров, которые вы пытаетесь сопоставить.
Просто имя переменной:
typeset +m 'foo*'
foo
foo_fighters
food
Имя переменной и присвоенное значение:
typeset -m 'foo*'
foo=bar
foo_fighters=awesome
food=(my life)
Набор флагов, имя переменной и присвоенное значение
typeset -p -m 'foo*'
typeset foo=bar
typeset foo_fighters=awesome
typeset -a food=( my life )