Рыбообразный поиск завершения аргумента в ZSH

8

Я возился с рыбой и заметил это удобное поведение

Если я печатал wget -<tab><tab><tab>, меня помещали в интерактивное меню. Однако, когда я печатал, я искал описания самих аргументов. Я пробовал это в zsh, и ввод в это меню, казалось, только возвращал меня к моему интерактивному приглашению. Есть ли способ добиться аналогичной функциональности в Zsh?

ollien
источник
Я давно хотел знать, как это сделать. Когда дело доходит до стандартного завершения ключевого слова (не параметров), vim делает это, позволяя вам настроить завершение так, чтобы фокусировался на буфере строк, поэтому, если список завершения слишком длинный, вы просто продолжаете печатать, и список естественным образом фильтруется. Но zsh сразу переключает фокус на виджет выбора меню
the_velour_fog
Я не понимаю поведение, которое вы описываете. Речь идет о поиске в описаниях параметров, а не в именах параметров? Или это о способе выбора? На какое меню вы ссылаетесь (у zsh есть много разных настроек для завершения)?
Жиль "ТАК - перестань быть злым"
@ Жиль Да, вы можете использовать его для поиска описаний опций или даже самих названий опций. Меню, на которое я ссылаюсь, появляется, когда вы набираете команду, тире, а затем дважды нажимаете клавишу Tab. Например, ввод текста ls -<tab><tab>вводит меня в меню, где я могу прокручивать различные варианты вверх и вниз. В рыбе я могу напечатать, который затем будет искать эти параметры и их описания. Я надеюсь достичь аналогичной функциональности в Zsh.
ollien
Я до сих пор не уверен, что именно вы имеете в виду. Это интерактивность, которую вы хотите? т.е. возможность выбора из списка стрелками и подсветкой? Вы говорите, In fish, I'm able to type, which will then search these options and their descriptions.что можете «искать эти опции и их описания» в Zsh. например, ls --h<tab>ищет варианты, начинающиеся с --hи перечисляет четыре совпадения.
Sparhawk
Посмотрите на этот скриншот . Если я ls -size<tab>наберу, я получу ls --block-size и ls --size в качестве опций в zsh. Однако fish рекомендует мне --size, --tabsize, -k, -S, --block-size и --human-readable. Я надеялся добиться аналогичной функциональности в Zsh. Он не только ищет имена команд, но также ищет описания
ollien

Ответы:

1

Я думаю, что это делает то, что вы хотите:

  zmodload zsh/complist
  setopt menucomplete
  zstyle ':completion:*' menu select=0 search

Это приведет к тому, что список будет отображаться при нажатии на вкладку, а затем, если вы продолжите вводить текст, он будет искать доступные параметры, включая описания, с пошаговым поиском.

Вы также можете быть заинтересованы в той же конфигурации, но с интерактивным вместо поиска. В этом случае, когда вы набираете текст, он будет отфильтровывать дополнения до тех, которые соответствуют тому, что вы уже набрали.

Thayne
источник
Хм ... если я наберу wget -<tab>noэто не фильтрует список завершения. Это просто продолжает набирать 'no' в терминале после --accept-regex=, что является первой опцией в списке завершения.
ollien
1
да, это не то, что происходит со мной. Но на самом деле он не подходит для параметра поиска, он просто выполняет поиск по возможностям
Thayne
1

Попробуйте поместить это в ваш .zshrcфайл:

 # load module for list-style selection
 zmodload zsh/complist

 # use the module above for autocomplete selection
 zstyle ':completion:*' menu yes select

 # now we can define keybindings for complist module
 # you want to trigger search on autocomplete items
 # so we'll bind some key to trigger history-incremental-search-forward function
 bindkey -M menuselect '?' history-incremental-search-forward

Теперь при вводе wget -<tab>меню с автозаполнением появляется. Мы определили связывание клавиш для этого меню, поэтому, если вы нажмете, ?строка поиска появится в верхней части списка :

davidsykora~%wget --referer
isearch: refe

Некоторые дополнительные советы:

  • Вы также можете определить bindkey -M menuselect '/' history-incremental-search-backwardдля обратного поиска
  • если вы нажмете ?во время поиска снова, выбор перейдет к следующему результату поиска. Использовать /для перехода к предыдущему результату
  • Требуется много настроек, чтобы все заработало так, как вы хотите, поэтому посмотрите complist документацию, чтобы найти дополнительные функции и опции.
  • для меня обычно гораздо быстрее использовать vi-insertфункцию complist - она ​​фильтрует дополнения на основе того, что вы вводите.
Дэвид Сикора
источник