Oddzielne przeglądanie strzałek w górę dla lokalnej i globalnej historii ZSH

25

Czy jest możliwe żeby...

  • Przyspiesz lokalną historię powłoki ZSH (akcje miały miejsce tylko w tym monicie)

  • Zwiększ globalną historię ZSH (historia wspólna jest włączona) - domyślnie co dzieje się po naciśnięciu strzałki W GÓRĘ, gdy historia wspólna jest włączona

... osobno.

Na przykład można przypisać CTRL + do historii globalnej, normalnie do historii lokalnej. Jednocześnie sensowne jest wykorzystanie historii globalnej do wyszukiwania historii wstecznej (tj. CTRL+ R).

Może to przyspieszyć niektóre operacje powłoki, ponieważ niektóre operacje są specyficzne dla tego okna powłoki i chcesz do nich wrócić.

Mikko Ohtamaa
źródło

Odpowiedzi:

25

Skopiuj i wklej to do .zshrc:

Kursory używają historii lokalnej:

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

Jeśli potrzebujesz również powiązań klawiszy ( CTRL+ kursorów), aby przejść przez historię globalną, dodaj również to do .zshrc:

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

Aby to zadziałało, należy włączyć opcję SHARE_HISTORY (patrz 16.2.4 Historia ). Uruchom setopti sprawdź, czy na liście znajduje się „sharehistory”. Jeśli nie, dodaj setopt sharehistorydo .zshrc. Następnie można użyć ustawionej historii lokalnej, jak to zrobiliśmy powyżej. Dokumentacja mówi:

Domyślnie polecenia ruchu historii odwiedzają zarówno linie importowane, jak i linie lokalne, ale można to włączać i wyłączać za pomocą wiązania zle set-local-history. Możliwe jest również utworzenie widgetu zle, który spowoduje, że niektóre polecenia będą ignorować zaimportowane polecenia, a niektóre dołączą je.

Zauważ, że domyślnie używana jest historia globalna (a wszystkie funkcje kończą się na „zle set-local-history 0”, tzn. Historia lokalna jest wyłączona). Więc naciśnięcie CTRL+ Rprzeszuka domyślnie historię globalną (co ma sens w większości przypadków).

Jest to dość podobne do rozwiązania @mpy, ale gotowe do kopiowania i wklejania. Nadpisuje klawisze kursora w górę i w dół. Użyłem tego wpisu na liście mailowej .

Zobacz też:

lędźwiowy
źródło
1
W wersji zsh 5.0.2 pojawia się błąd, że nie można powiązać z pustą sekwencją klawiszy. Nawet jeśli zastąpię go kluczami z innej odpowiedzi poniżej, zarówno w górę / w dół, jak i Ctrl + w górę / w dół, po prostu przejrzyj historię globalną. Coś tu robię źle?
rjh
1
@rjh: Spróbuj tego: w edytorze takim jak vim usuń plik ${key[Up]}. Następnie (w trybie edycji) wpisz Ctrl + V, a następnie strzałkę w górę. To powinno wstawić poprawny kod klucza. Zrób to samo dla strzałki w dół.
robinst
Użyłem tej metody i działa, ale straciłem możliwość przeszukiwania historii, pisząc początkową część polecenia, a następnie Strzałkę w górę. Przechodzi przez wszystkie polecenia, takie jak Bash, więc muszę się obejść, używając Ctrl+R.
Melebius
5

Możesz skonfigurować specjalny widget zle, aby wyświetlał tylko elementy historii lokalnej:

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

Zakładając, że jest to związane up-line-or-history(myślę, że jest to ustawienie domyślne), możesz powiązać ten widget z innym naciśnięciem klawisza, na przykład CTRL+ :

 bindkey "^[Oa" only-local-history

Jeśli to zadziała, prawdopodobnie zależy od twojego terminala. Linia powyżej działa w URxvt/Screen. Z xtermtym będziesz potrzebować

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

dla CTRL+ .

Innym wariantem może być

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

więc jeśli masz włączoną historię lokalną, możesz zajrzeć do globalnej lub odwrotnie.

mpy
źródło
4

Odpowiedź @ lumbic działała dla mnie tylko z kilkoma zmianami:

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

Ten kod sprawia, że ​​historia globalna jest domyślna i używa strzałki CTRL do historii lokalnej.

Uwaga: używam zsh 5.0.2 razem z oh-my-zsh.

arnuschky
źródło
Wygląda to na przeciwieństwo tego, o co prosił PO - Ctrl+arrowsdla lokalnej historii.
Melebius
1

Próbowałem opcji wymienionych w innych odpowiedziach tutaj, ale nie byłem z nich zadowolony. Widżety 1 up-history lub up-line-or-historynie zawierają wyszukiwania początkowego, a widżet 1 up-line-or-beginning-search wydaje się nie działać dobrze podczas zmiany preferencji historii lokalnej podczas korzystania z niego. 2)

Więc doszedłem do następujących ustawień. Umożliwia Ctrlstrzałkom + przeglądanie historii globalnej, Altstrzałkom + przeglądanie tylko historii lokalnej (podobnej do Bash), a strzałkom niezależnym korzystanie z inteligentnego wyszukiwania początkowego (domyślnie w 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 Ich downodpowiedniki również są rozumiane w sposób dorozumiany.

2 Początek wyszukiwania jest redefiniowany po zmianie preferencji historii lokalnej, więc całe pierwsze znalezione polecenie jest używane jako początek do wyszukiwania w drugim wyszukiwaniu.

Melebius
źródło
1

Na podstawie różnych odpowiedzi tutaj mogłem stworzyć wersję warunkową:

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

Ta wersja zastąpi istniejące up-line-or-historyi down-line-or-historywidżety nowymi widgetami zdefiniowanymi przez użytkownika. Ten widget włącza historię lokalną, a następnie wywołuje oryginalne widżety, które są dostępne pod .prefiksowanymi nazwami. Zobacz dokumentację widgetu zle .

Oznacza to, że możesz zachować wszystkie istniejące skróty klawiszowe. Możesz zatem uniknąć konieczności wymyślania sekwencji ucieczki podczas wpisywania strzałki w górę w bieżącym terminalu.

Martin Geisler
źródło
-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

Powyższa odpowiedź działała dla mnie.

Odniesienie: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

maddy10
źródło
Czy możesz wyjaśnić, jak to odróżnia historię lokalną i globalną? IMHO twój kod wcale tego nie robi. Co więcej, wydaje się, że jest to ustawione już w Oh My Zsh .
Melebius