Как я могу искать историю с текстом, уже введенным в приглашении в zsh?

59

В zsh я знаю, что могу искать историю с Ctrl+ r. Тем не менее, часто я начинаю набирать команду прямо в командной строке, но потом понимаю, что должен искать историю. Когда я нажимаю Ctrl+ r, появляется пустое окно поиска в истории, например:

подсказка поиска в истории не заполнена

Обратите внимание на то, что в моей подсказке есть текст, но нет в строке поиска по истории. Как начать поиск по истории с текстом уже в приглашении, так это выглядит так:

предварительный поиск в истории поиска

Шон Макси
источник

Ответы:

44

Вы можете использовать функциональность zlehistory-search :

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Это связывает Upи Down(с учетом ваших собственных escape-последовательностей) поиск в истории, вперед и назад, на основе того, что уже было введено в приглашении.

Таким образом, если вы введете «vim» и нажмете Up, zsh будет перемещаться назад по вашей истории только для тех команд, которые начинаются с «vim».

Кроме того, вы можете поместить курсор в конец строки после того, как вы выбрали нужную команду из истории zsh, используя функцию history-search-end (обычно расположенную в /usr/share/zsh/functions/Zle/) и добавляя -endв конец каждой строки, например, так:

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
jasonwryan
источник
Отлично, спасибо. Мне пришлось удалить «-end» для обеих команд bindkey, чтобы они работали. Я не редактировал ваш ответ, потому что, может быть, есть какая-то ситуация, в которой это необходимо?
Шон Маккези
Нет проблем: обновил ответ, уточнив детали, которые вы хотели.
Джейсонвриан
Раньше это работало для меня до конца ноября 2015 года, когда я обновил до последней версии oh my zsh. Есть идеи? предложение? кто-нибудь еще видел это? как отлаживать?
Хани прошел
2
@hanielabed Oh-my-Zsh является кластером fsck; Я нисколько не удивлен, что это
сломало
1
Есть ли способ, с помощью которого курсор может перейти к концу из пустого поиска по истории, но остаться на той же позиции для частичного поиска? Это то, что происходит в Bash в настоящее время.
CMCDragonkai
19

Еще одна полезная опция history | grep

Назначьте псевдоним, например

alias hg='history | grep'

затем вы можете набрать hg whateverдля поиска команд, которые вы использовали, например,

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Я поместил этот псевдоним в мои точечные файлы.

Майкл Даррант
источник
17
Что hgнапоминает мне о ... О да, Mercurial!
12

Если вы используете oh-my-zsh , добавьте history-substring-searchв plugins=(...)строку.

Затем добавьте

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

где-то ниже строки, которая читается source $ZSH/oh-my-zsh.sh. Сохраните и запустите новый терминал или запустите source ~/.zshrcтекущий терминал.

Примечание: ^[[A последовательность перехода для стрелки вверх в терминале, который я использую (котенок) и многие другие. Чтобы проверить выбранный вами терминал, введите, showkey -aа затем нажмите клавишу, для которой вы хотите найти escape-последовательность.

joelostblom
источник
Неясно, что делает это сопоставление клавиш, ответ выше объясняет: «Это связывает Вверх и Вниз (с учетом ваших собственных escape-последовательностей) с поиском в истории, назад и вперед, основываясь на том, что уже было введено в приглашении».
Колин Д.
@ColinD Добавил примечание, чтобы уточнить
joelostblom
1
Поиск по подстроке является лучшим, его расширенный набор команд начинается с. чтобы реализовать, не будучи пользователем oh-my-zsh, я brew install zsh-history-substring-searchпроверил readme репозитория для инструкций, я просто продолжу и создаю ответ, я действительно доволен результатом.
Мерлин
7

Возможно, вы захотите использовать скрипт по адресу https://github.com/zsh-users/zsh-history-substring-search

Где вы можете ввести в любой части любой ранее введенной команды и нажмите Upи Downклавиши для переключения между командами согласования.

number5
источник
4

Я очень рекомендую использовать "$terminfo[kcuu1]"или "$key[Up]"вместо жестко запрограммированных вещей, "^[[A"которые могут работать или не работать в любой конкретной системе.

Проверьте /etc/zsh/zshrcбольше ключей. Вот как это выглядит в моей системе. Я думаю, что terminfoключи, скорее всего, будут определены.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)
zzxyz
источник
4

Как насчет использования zsh-autosuggestions?

Дело в том, что для каждой команды, которую вы вводите, этот плагин будет показывать вам некоторые предложения, которые могут быть приняты или нет. Попробуйте и дайте нам обратную связь.

Без плагинов мы можем нажать, Ctrlrчтобы выполнить обратный поиск в истории, как только вы начнете вводить соответствующие команды, появятся в качестве подсказок.

SergioAraujo
источник
2

Я использую плагин vi-mode . И тогда в моем ~ / .zshrc у меня есть следующие привязки:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Это позволяет мне использовать ^Pи ^Nкак обычный поиск вперед и назад, если я не ввожу никакой текст, и как поиск с фильтрацией, если я делаю.

Слободан Ильич
источник
1

Я согласен с cheflo, что поиск по "подстроке" более полезен. Я не могу комментировать там, поэтому я начал новый ответ. Я использую oh-my-zsh и добавляю "history-substring-search" к плагинам = (...) ~ / .zshrc. Тогда источник ~ / .zshrc. Не нужно ничего больше добавлять. Используйте «bindkey» для проверки:

"^ [OA" история-подстрока-поиск
"^ [OB" история-подстрока-поиск вниз

Позже вы вводите «до» и стрелку вверх, появляется «история» и подсвечивается «до» (если вы ранее использовали команду «история»).

Джеймс
источник
1

Вместо этого вы могли бы использовать zaw , который полностью заменяет ваш поиск гораздо лучшим супер-поиском с несколькими ключевыми словами, а также решает вашу проблему - история поиска - это только одна из вещей, которые может искать zaw.

Небольшое вступление / обсуждение здесь

Брэд Паркс
источник
0

Поскольку я использую oh-my-zsh и использую решение подстроки из joelostblom, Джеймс, я изменяю .zshrc следующим образом: (который в строке 13 находит строку «source $ ZSH / oh-my-zsh.sh» , затем измените код вокруг него.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down
user3633852
источник
bindkey -vсломается ctrl-a, ctrl-e. Скорее всего, все команды Ctrl.
Михаил Озерянский
0

Ответ не о-о-о-о

Это сработало для меня (на macOS), чтобы получить доступ к истории подстрок через стрелки вверх / вниз. Связывание ключей зависит от вас.

История поиска по подстроке лучше, чем просто доступ к командам, начинающимся со строки. В большинстве случаев это больше похоже на ctrl-r, без глобусов и регулярных выражений.

Начиная с инструкций в zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Теперь наслаждаюсь этим полностью.

Мерлин
источник