Могу ли я использовать режим редактирования Vim в командной строке, не теряя рекурсивный поиск по истории?

8

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

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

Натан Лонг
источник
Трудный выбор! garyjohnпоказывает Vim способ сделать это и JdeBPпоказывает, как вернуть привязку клавиш для Ctrl + R! Я собираюсь поиграть с обоими методами и приму ответ позже. Я решу, основываясь на 1), какой метод мне кажется более легким, и 2) который получает больше голосов. Спасибо вам обоим!
Натан Лонг

Ответы:

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

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

  • Переключение режимов vi:
    • Режим поиска history-incremental-search-backwardПереключение между mainи vicmdраскладок при вызове vi-cmd-modeвиджета пока все еще оставаясь в режиме поиска. т.е. из emacsрежима presssing на Escклавишах или Ctrl+ XCtrl+ 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вызовет звуковой сигнал и будет проигнорирован.
JdeBP
источник
Моя мышечная память благословляет тебя!
Натан Лонг
4

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

garyjohn
источник
1
Это интересно, хотя я часто использую поиск как движение в Vim. Думаю, я не могу использовать его для перемещения внутри команды, которую я сейчас редактирую, поскольку она привязана к истории поиска, а?
Натан Лонг
Правильно. Но вы можете (по крайней мере, в bash) использовать f, F, t, T, ';' (точка с запятой) и ',' (запятая) команды для перемещения вперед и назад к определенным символам в строке.
garyjohn
1

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

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

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

Йонас Фагундес
источник