8

Я использую zsh и, поскольку я заядлый пользователь Vim, я просто переключился на использование редактирования в стиле Vim в командной строке. (Это означает, что если я ls foo/bar и решу вместо этого выбрать cd , я могу нажать Esc ^ чтобы вернуться в начало, и cw cd чтобы изменить ls на cd .

Это все здорово, но проблема в том, что я больше не могу использовать Ctrl+R для рекурсивного поиска в истории. Есть ли другой способ сделать это, или я могу как-то переопределить привязку клавиш Vim, чтобы вернуть его?

3 ответа3

6

Конечно, вы больше не можете использовать Ctrl+R. Если вы обратитесь к руководству по Z Shell, то увидите, что в таблице ключей history-incremental-search-backward есть только привязка клавиш для виджета emacs . Для него нет привязок клавиш в сочетаниях клавиш vi.

Но, как вы также узнаете из чтения руководства (это глава 18.), добавление привязки клавиш является довольно простым упражнением при использовании команды bindkey :

bindkey "^R" history-incremental-search-backward

Вам даже не нужно использовать команду zle для сопоставления виджета с функцией оболочки, так как это стандартный виджет.

Если вы обратитесь к ответу на этот же вопрос, который есть в вики Z Shell, вы увидите команды для конкретного добавления этого в комбинации клавиш vi "command" и "insert mode":

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Также обратите внимание, что, как указывает garyjohn, в ключевой карте vi "команда" символ / связан с виджетом vi-history-search-backward . Разница между этим виджетом и виджетом history-incremental-search-backward заключается в поведении виджета, которое применяется, когда один находится в режиме поиска истории. Вот пара различий, которые вы заметите:

  • Переключение режимов vi:
    • Режим поиска в history-incremental-search-backward переключается между main и vicmd когда вы вызываете виджет vi-cmd-mode , оставаясь в режиме поиска. то есть в режиме emacs нажатие клавиши Esc или клавиш Ctrl+X Ctrl+V переключает режим поиска между таблицами клавиш emacs и vicmd . (Вызывать history-incremental-search-backward из vicmd таким образом, хлопотно, если только вы не привязываете что-либо к vi-cmd-mode в vicmd .)
    • Режим поиска в vi-history-search-backward рассматривает виджет vi-cmd-mode как accept-line и завершает поиск, снова входя в командный режим, из которого вы ввели поиск. т.е. (с привязками по умолчанию) / входит в режим поиска из командного режима, а Esc возвращается в командный режим.
  • Повторение поиска:
    • В history-incremental-search-backward распознаются виджеты history-incremental-search-backward и vi-rev-repeat-search . т.е. (предполагая, что вы изменили привязки, как указано выше), и Ctrl+R, и N будут искать предыдущую совпадающую строку.
    • В vi-history-search-backward распознается только виджет vi-rev-repeat-search . т.е. (при условии, что вы изменили привязки, как указано выше), Ctrl+R вызовет звуковой сигнал и будет проигнорирован.
4

В bash-режиме vi, набрав <Esc>/<string><Enter> будет искать в истории команд <string> . n будет искать дальше в истории; N будет искать вперед. zshell может быть таким же.

1

Я предпочитаю использовать:

bindkey -M vicmd '/' history-incremental-search-backward

Таким образом, я могу набрать ESC /text и увидеть командную строку. Если я хочу перейти к следующему матчу, я ESC n

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .