Возможно ли, чтобы bash/readline «убирали» предложения по завершению из терминала?

Возможно ли, чтобы bash/readline «убирали» предложения по завершению из терминала?

Если вы используете zsh и выполняете tabавтодополнение для команд, путей, опций и т. д., то всякий раз, когда есть несколько потенциальных совпадений, предложения будут отображаться под подсказкой.
После того, как вы выбрали предложение, zsh удалит список предложений из терминала, как вы можете видеть здесь:

введите описание изображения здесь

Источник изображения

Напротив, когда bash предлагает варианты завершения, он выводит список и возвращает вас к новой подсказке.

введите описание изображения здесь

Источник изображения
Поведение zsh для меня предпочтительнее, так как предложения, которые я никогда не использовал, не приносят никакой пользы и просто производят больше "шума" в терминале.
Возможно ли настроить bash/readline так, чтобы они вели себя как zsh?

решение1

короче: это возможно, но сложно из-за .inputrcпривязок.

длинный: Как и было предложено в комментарии, вымогсделайте что-то подобное в командной строке bash и привязках readline.

Сохранение/восстановление курсора будет неэффективным, поскольку единственная точка, в которой вы сможете надежно очистить оставшуюся часть экрана, — это нажатие Enterдля завершения выбора.

После того, как вы передали управление accept-line, слишком поздно очищать оставшуюся часть экрана. Возможно (но сложно) определить ряд реальных и специальных "привязок клавиш", чтобы readline мог выполнять более одной операции. См. например

Но этот подход ограничивает вас отправкой символов в bash и выдачей команд в readline. Ни одна из команд readline не делает

printf '\033[J'

чтобы очиститьостатокэкрана. Ближайшим будет встроенный в readline clear-screen(нетчто вы хотите). Ваша привязка должна будет сделать что-то вроде

  • beginning-of-line
  • вставлять " printf '\033[J';"
  • end-of-line
  • accept-line

Это end-of-lineбудет работать в обход причуды readline. Это позволяет вам нажатьEnter в любом местена строке. Если бы ваш курсор находился в середине строки, то у вас остался бы видимым только фрагмент ввода (хотя bash получил бы всю строку).

Связанный контент