23

Это возможно...

  • Активизировать локальную историю оболочки ZSH (действия выполняются только в этой подсказке)

  • Активизировать глобальную историю ZSH (общая история включена) - по умолчанию, что происходит, когда вы нажимаете стрелку ВВЕРХ, когда общая история включена

... по отдельности.

Например, можно связать CTRL+ вверх для глобальной истории, обычно для локальной истории. В то же время имеет смысл использовать глобальную историю для поиска в обратной истории (т. Е. CTRL+ R).

Это может ускорить некоторые операции оболочки, так как некоторые операции относятся к этому окну оболочки, и вы хотите вернуться к ним.

5 ответов5

22

Скопируйте и вставьте это в свой .zshrc:

Курсоры используют местную историю:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Если вам нужны также привязки клавиш (CTRL + курсоры) для перехода по глобальной истории, добавьте также это в ваш .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Чтобы это работало, должна быть включена опция SHARE_HISTORY (см. 16.2.4 История). Запустите setopt и проверьте, присутствует ли "sharehistory". Если нет, добавьте setopt sharehistory в ваш .zshrc . Тогда можно использовать set-local-history, как мы делали выше. Документация гласит:

По умолчанию команды перемещения по истории посещают импортированные строки, а также локальные линии, но вы можете включать и выключать их с помощью привязки zle set-local-history. Также возможно создать виджет zle, который заставит некоторые команды игнорировать импортированные команды, а некоторые включают их.

Обратите внимание, что по умолчанию используется глобальная история (и все функции заканчиваются на «zle set-local-history 0», т.е. локальная история отключена). Поэтому нажатие CTRL + R будет искать глобальную историю по умолчанию (что имеет смысл в большинстве случаев).

Это очень похоже на решение @mpy, но готово для копирования и вставки. Он перезаписывает клавиши курсора вверх и вниз. Я использовал эту запись списка рассылки.

Смотрите также:

5

Вы можете настроить специальный виджет zle для отображения только элементов локальной истории:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

Предполагая, что привязан к up-line-or-history (я думаю, что это по умолчанию), вы можете привязать этот виджет к другому нажатию клавиши, например, CTRL+:

 bindkey "^[Oa" only-local-history

Если это работает, вероятно, зависит от вашего терминала. Над строкой работает в URxvt/Screen . С xterm вам понадобится

 bindkey "^[[1;5A" only-local-history

для CTRL+.

Другой вариант может быть

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

Итак, если у вас включена локальная история, вы можете заглянуть в глобальную или наоборот.

4

Ответ @ lumbic работал для меня только с несколькими изменениями:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Этот код устанавливает глобальную историю по умолчанию и использует CTRL-стрелку для локальной истории.

Примечание: я использую zsh 5.0.2 вместе с oh-my-zsh.

0

Я пробовал варианты, перечисленные в других ответах здесь, но я не был доволен ими. Виджет 1 up-history или up-line-or-history не включает начальный поиск, а виджет 1 up-line-or-beginning-search кажется, не работает должным образом при изменении предпочтения локальной истории при его использовании. 2

Итак, я пришел к следующим настройкам. Он позволяет использовать клавиши Ctrl+ для просмотра глобальной истории, клавиши Alt+ для просмотра только локальной истории (аналогично Bash) и автономные стрелки для поиска с умным началом (по умолчанию в Oh My Zsh).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 Их down аналоги также подразумеваются неявно.

2 Начало, используемое для поиска, переопределяется после изменения предпочтения локальной истории, поэтому вся первая найденная команда используется в качестве начала, которое нужно искать во втором поиске.

-1
autoload -U up-line-or-beginning-search
autoload -U down-line-or-beginning-search
zle -N up-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

Выше ответ работал для меня.

Ссылка: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

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