Окремий погляд стрілки вгору для локальної та глобальної історії 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, як ми це робили вище. Документація говорить:

За замовчуванням команди руху історії відвідують імпортовані рядки, а також локальні рядки, але ви можете перемикати цю функцію та вимикати за допомогою прив'язки zle set-local-history. Можна також створити віджет zle, який змусить деякі команди ігнорувати імпортовані команди, а деякі включити їх.

Зауважте, що за замовчуванням використовується глобальна історія (і всі функції закінчуються на "zle set-local-history 0", тобто локальна історія вимкнена). Тому натискання кнопки CTRL+ здійснює Rпошук у глобальній історії за замовчуванням (що має сенс у більшості випадків).

Це досить схоже на рішення від @mpy, але готове для копіювання та вставки. Він перезаписує клавіші курсору вгору та вниз. Я використав цей запис у списку пошти .

Дивись також:


1
На zsh 5.0.2 я отримую помилку, яка не може прив’язати до порожньої послідовності ключів. Навіть якщо я замінюю його ключами з іншої відповіді нижче, і вгору / вниз, і Ctrl + вгору / вниз просто пройти глобальну історію. Щось тут я роблю неправильно?
rjh

1
@rjh: Спробуйте це: У такому редакторі, як vim, видаліть ${key[Up]}. Потім (у режимі редагування) введіть Ctrl + V, а потім стрілку вгору. Тут слід вставити правильний код ключа. Зробіть те ж саме для стрілки вниз.
robinst

Я використовував цей метод, і він працює, але я втратив можливість пошуку історії, написавши початкову частину команди, а потім Стрілка вгору. Він проходить через усі команди, такі як 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.


Це виглядає навпаки, ніж те, що вимагала ОП - 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 Початок, який використовується для пошуку, переосмислюється після зміни параметрів локальної історії, тому вся перша знайдена команда використовується як початок пошуку в другому пошуку.


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


Чи можете ви пояснити, як це відрізняє локальну та глобальну історію? IMHO ваш код зовсім не робить цього. Більше того, це, здається, встановлено вже в Oh My Zsh .
Мелебій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.