Отдельный просмотр стрелки вверх для локальной и глобальной истории ZSH

25

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

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

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

... отдельно.

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

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

Микко Охтамаа
источник

Ответы:

25

Скопируйте и вставьте это на свой .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, но готово для копирования и вставки. Он перезаписывает клавиши курсора вверх и вниз. Я использовал эту запись списка рассылки .

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

lumbric
источник
1
На zsh 5.0.2 я получаю ошибку, что он не может привязаться к пустой последовательности ключей. Даже если я заменю его ключами из другого ответа ниже, как вверх / вниз, так и Ctrl + вверх / вниз просто пройдут глобальную историю. Что-то я не так делаю здесь?
RJH
1
@rjh: Попробуйте: в редакторе, таком как vim, удалите ${key[Up]}. Затем (в режиме редактирования) введите Ctrl + V и стрелку вверх. Это должно вставить правильный код ключа. Сделайте то же самое для стрелки вниз.
Робинст
Я использовал этот метод, и он работает, но я потерял возможность поиска в истории, написав начальную часть команды и затем Стрелка вверх. Он проходит через все команды, такие как Bash, поэтому я должен обойти использование Ctrl+R.
Мелебиус
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.

arnuschky
источник
Это похоже на то, что запрашивал OP - Ctrl+arrowsдля местной истории.
Мелебиус
1

Я пробовал варианты, перечисленные в других ответах здесь, но я не был доволен ими. Виджеты 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 Начало, используемое для поиска, переопределяется после изменения предпочтения локальной истории, поэтому вся первая найденная команда используется в качестве начала, которое нужно искать во втором поиске.

Melebius
источник
1

Основываясь на различных ответах, я смог сделать сокращенную версию:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Эта версия перезапишет существующие up-line-or-historyи down-line-or-historyвиджеты новыми пользовательскими виджетами. Этот виджет включает локальную историю и затем вызывает исходные виджеты, которые доступны под .именами с префиксом. Подробности смотрите в документации по виджету zle .

Это означает, что вы можете сохранить любые существующие сочетания клавиш. Поэтому вы можете избежать выяснения последовательности перехода для набора стрелки вверх в вашем текущем терминале.

Мартин Гайслер
источник
-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

maddy10
источник
Не могли бы вы объяснить, как это отличает местную и мировую историю? ИМХО твой код вообще этого не делает. Более того, это, кажется, уже установлено в Oh My Zsh .
Мелебиус