Как написать автозаполнение zsh, которое заменяет последний аргумент?

#shell #autocomplete #zsh

Вопрос:

Я хочу предоставить автозаполнение, которое будет выполнять поиск результатов в Интернете. Идея заключается в том, что пользователь вводит какой-либо поисковый запрос, нажимает вкладку и получает результаты онлайн-поиска на основе этого термина. Результаты не обязательно начинаются с введенного пользователем термина или даже содержат его (более вероятно, что их описания содержат этот термин).

Вот иллюстрация возможного потока:

  1. Пользователь вводит поисковый запрос и нажимает tab , чтобы запустить автозаполнение
 $ bookmark hellolt;tabgt;  
  1. Автозаполнение удаляет введенный поисковый запрос (поскольку мы ищем по описанию, а не по информации, которую хотим ввести), делает сетевой запрос и предоставляет параметры автозаполнения.
 $ bookmark  www.hellomagazine.com -- HELLO! - Daily royal, ... en.wikipedia.org/wiki/Hello_(Adele_song) -- Hello (Adele song) - Wikipedia ...  
  1. Пользователь выбирает один из возможных вариантов
 $ bookmark www.hellomagazine.com   

Является ли это вообще хорошим подходом? Может быть, подобные вещи обычно делаются по другому шаблону?

Поэтому при этом я столкнулся с несколькими проблемами:

  1. Когда я использую _arguments для представления возможных ответов, zsh фильтрует их по термину, который уже ввел пользователь. Возможно, сначала мне нужно стереть введенное последнее слово? Как мне это сделать?
  2. Zsh сортирует результаты в алфавитном порядке, но я хочу представить их по релевантности (для того, чтобы передать их _arguments ). Как это сделать?
  3. Zsh делает несколько сетевых запросов на один и тот же срок. Первый раз, когда пользователь нажимает вкладку, он делает запрос, но еще не представляет список предложений. На второй вкладке нажмите, чтобы отобразить список опций, но для этого необходимо повторить тот же медленный сетевой запрос. Как мне кэшировать или представить список результатов в первый раз?

Комментарии:

1. На мой взгляд, удаление пользовательского ввода-это плохой UX. Автозаполнение предназначено (как следует из названия) для завершения ввода пользователем, а не для его замены. Учтите это в своем дизайне. Представьте, что у пользователя была опечатка (набрано «Удержано» вместо «Справка»). Стирание входных данных и отображение некоторых неуместных предложений было бы самым раздражающим. Пользователю придется снова начинать вводить «Справка». Большое нет-нет! Вы могли бы эмулировать то, что делает автозаполнение git для zsh: пользователю предоставляется список (пока не стирайте ввод), и когда они выбирают что-то с помощью ввода, вы заменяете их начальный ввод выбором.

2. Is this a good approach at all? Я бы сказал, что нет. Это нарушает принцип наименьшего удивления. Я не хочу, чтобы что-то взывало к Интернету, потому что я нажимаю вкладку. Можно ли его даже легко прервать (ctrl c)? Почему бы просто не иметь -s флажок для поиска и обычное интерактивное меню? Удаление входных данных также является плохой идеей. Это ссылка на текущую команду и на историю. Управляющие последовательности также могут вызывать проблемы.