iPython-подобное завершение для Zsh?

Интересно, есть ли способ использовать ipython-подобное завершение в zsh?

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

token = 'something blah blah'    
import os
token.split()

..и тогда вы печатаете token и перебрав историю в ipython, вы получите только 1-ю и 3-ю строчки.

Так есть ли способ заставить Zsh работать таким образом?

1 ответ

Решение

Вы можете использовать виджеты history-beginning-search-backward а также history-beginning-search-forward для этого. По умолчанию они не привязаны ни к каким клавишам, поэтому вам придется делать это с bindkey,

bindkey "^[[5~" history-beginning-search-backward
bindkey "^[[6~" history-beginning-search-forward

куда ^[[5~ это код для страницы вверх и [[6~ для страницы вниз. Эти коды могут отличаться для вашего терминала.

Вы можете использовать cat -v показать коды для непечатных символов. Или вы можете использовать ассоциативный массив terminfo от zsh/terminfo модуль (который уже может быть загружен; см. zshmodules(1) а также zshbuiltins(1) больше информации о модулях zsh), которые должны содержать правильные коды в ключах knp (ключ следующей страницы) и kpp (ключ предыдущей страницы):

if (( ${+terminfo[knp]} )) && (( ${+terminfo[kpp]} )); then
     bindkey "${terminfo[kpp]}" history-beginning-search-backward
     bindkey "${terminfo[knp]}" history-beginning-search-forward
fi

Честно говоря, эти виджеты не будут зацикливаться, когда они достигнут начала или конца истории, но так как вы можете идти в обоих направлениях (и учитывая, что ipython тоже не зацикливается) это не должно быть настоящей проблемой.

Другие вопросы по тегам