Как выполнить обратный поиск в истории в vi-режиме ZSH?

47

Я использую vimпо существу все свои потребности в редактировании, поэтому я решил еще раз попробовать vi-mode для моей оболочки (в настоящее время ZSH w / oh-my-zsh в OS X), но я пытаюсь (и не могу) использовать Ctrl-Rпостоянно. Какая эквивалентная привязка клавиш? И для дальнейшего использования, как бы я это выяснил сам? Я почти уверен, что смогу использовать bind -Pв bash.

Хэнк Гей
источник
2
Согласно 'man zshzle', history-incremental-search-backward не привязывается в режимах Vi (vicmd, viins) по умолчанию.
Пол

Ответы:

56

Вы можете запустить bindkeyбез аргументов, чтобы получить список существующих привязок, например:

# Enter vi mode
chopper:~> bindkey -v

# Search for history key bindings
chopper:~> bindkey | fgrep history
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[[A" up-line-or-history
"^[[B" down-line-or-history

В режиме emacs обязательная привязка есть history-incremental-search-backward, но она не привязана по умолчанию в режиме vi. Чтобы связать Ctrl-R самостоятельно, вы можете запустить эту команду или добавить ее в ~/.zshrc:

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

В zshzlemanpage ( man zshzle) есть больше информации о редакторе строк zsh, bindkey и emacs / vi.

МРБ
источник
3
Спасибо, особенно за zshzle. Это довольно информативно и полезно.
Хэнк Гей
Я люблю вас. Шутки в сторону. После обновления до OSX El Capitan обратный поиск пропал, и я пропустил его больше, чем все остальное в моей повседневной работе.
Кристиан
24

Это древний вопрос, но единственный (и принятый) ответ в основном говорит о том, как перевести «emacs-подобный» history-incremental-search-backwardрежим в vi. Хотя это вполне выполнимо и может быть правильным решением для вас, немного странно, что никто не упомянул «путь vi» поиска в истории.

Режим vi в zsh поддерживает историю поиска с использованием стандартных клавиш vi / vim: /и ?, оба доступны в командном режиме. (Нажмите, <Esc>чтобы перейти из режима вставки в командный режим, как в vi или vim.)

Их смысл, однако, обратный: поскольку вы обычно хотите искать историю своей оболочки в обратном порядке, /выполняет обратный поиск, тогда ?как прямой поиск.

После отображения первого попадания вы можете (как и в vi / vim) использовать, nчтобы продолжить поиск большего числа попаданий в том же направлении или Nизменить направление поиска.

Соответствующие комбинации клавиш по умолчанию в таблице ключей vicmd:

"/" vi-history-search-backward
"?" vi-history-search-forward
"n" vi-repeat-search
"N" vi-rev-repeat-search
wjv
источник
2
Это также хорошо использовать "^P" history-beginning-search-backwardи "^N" history-beginning-search-forwardдля vim-подобного автозаполнения (вы начинаете печатать, затем нажимаете ctrl+pили ctrl+n).
CpRn
Для меня ?воспитывает bck-i-search, именно это я и искал. Спасибо.
geowa4
@wjv преимущество history-incremental-search-backward заключается в том, что он поддерживает шаблоны glob. По умолчанию /или `? ' не: coderwall.com/p/-jvcag/zsh-reverse-history-search-with-regex
alpha_989
@ alpha_989 Сообщение в блоге, на которое вы ссылаетесь, неверно. Может случиться так, что у автора установлена ​​некая zsh-среда, которая перегружает ^Rпривязку клавиш. Единственный «подобный регулярному выражению» символ, поддерживаемый обоими history-search-backwardтипами, history-incremental-search-backwardзаключается в том ^, чтобы привязать строку поиска к началу строки. Реальная сила history-incremental-search-backwardзаключается в том, что он выполняет пошаговый поиск, как следует из его названия. Я могу себе представить, что vicmdпо этой причине кто-то захочет связать его с картой ключей.
wjv
@wjv, ты прав .. Я должен был написать history-incremental-pattern-search-backward, а не history-incremental-search-backward. history-incremental-pattern-search-backwardsвозможно виджет .. но я думаю, что он установлен по умолчанию в Zsh. Он поддерживает globшаблоны не так, regexкак вы правильно указали: zsh.sourceforge.net/Doc/Release/Expansion.html#Glob-Operators . В сообщении действительно есть ошибка ..
alpha_989