Могу ли я перемещаться по меню дополнения вкладок в zsh с помощью клавиш в виде vi-like hjkl?

12

Я использую завершение вкладки на основе меню Zsh. Я нажимаю Tabодин раз, и появляется список возможных завершений. Если я нажму Tabснова, я могу перемещаться по этому списку с помощью клавиш со стрелками. Тем не менее, можно ли управлять ими с vi-как H, J, K, Lключи вместо?

Я использую режим Emacs для ввода командной строки, с bindkey -eв ~/.zshrc. Я также использую ZIM с Zsh . Если уместно, команды, которые определяют систему завершения табуляции, находятся здесь .

Sparhawk
источник

Ответы:

15

Да, вы можете, включив menu select:

zstyle ':completion:*' menu select
zmodload zsh/complist
...
# use the vi navigation keys in menu completion
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
bindkey -M menuselect 'j' vi-down-line-or-history
jasonwryan
источник
+1 Это хорошо работает, если я вручную запускаю bindkeyкоманды в терминале, но не получается, если я ставлю их в конце ~/.zshrc, с /home/sparhawk/.zshrc:bindkey:186: no such keymap `menuselect'.
Sparhawk
Вы включили сценарии завершения? Смотрите команду перед эллипсами ...
Джейсонвриан
Вы имеете в виду zstyleлинию? Да, у меня это ~/.zshrcтоже было.
Sparhawk
Вы должны включить это также . Смотрите мой .zshrc в качестве примера .
Джейсонвриан
Добавление autoload -Uz compinitи compinitне сработало, но я не уверен, что включение это проблема, потому что (а) выбор меню работает нормально в общем смысле, и всегда есть, и (б) я могу вручную запустить bindkeyстроки позже, что работает. Кроме того, я только что понял (б) работает, только если я сначала нажимаю вкладку , предположительно, чтобы инициализировать систему завершения, а затем запустить bindkey…. В противном случае это не так, как указано выше ( bindkey: no such keymap `menuselect').
Sparhawk
3

Самое близкое, к чему я пришел, - это использовать CTRL- Nи CTRL- Pдля перемещения вперед и назад по списку возможных завершений, а не Tabи Shift- Tab. Это является более vi-как навигации.

В .zshфайле конфигурации я добиваюсь этого с помощью:

bindkey '^n' expand-or-complete
bindkey '^p' reverse-menu-complete

И в связи с этим:

bindkey '^k' up-history
bindkey '^j' down-history
bindkey '^h' backward-delete-char
bindkey '^w' backward-kill-word
bindkey '^r' history-incremental-search-backward

Вот документы для привязок .

Effel
источник
2
это здорово, спасибо. также, -M menuselectможно добавить в bindkeyкоманду, чтобы ограничить режим здесь.