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
тоже не зацикливается) это не должно быть настоящей проблемой.