Separare la freccia in alto per la cronologia ZSH locale e globale


25

È possibile...

  • Aumenta la cronologia della shell ZSH locale (le azioni sono avvenute solo in quel prompt)

  • Aumenta la cronologia ZSH globale (la cronologia condivisa è attiva) - impostazione predefinita cosa succede quando si preme la freccia SU quando la cronologia condivisa è attiva

... separatamente.

Ad esempio, è possibile associare CTRL + per la cronologia globale, normalmente per la cronologia locale. Allo stesso tempo ha senso usare la storia globale per una ricerca della storia all'indietro (cioè CTRL+ R).

Ciò potrebbe velocizzare alcune operazioni della shell, poiché alcune operazioni sono specifiche per quella finestra della shell e si desidera tornare indietro in esse.

Risposte:


25

Copia e incolla questo sul tuo .zshrc:

I cursori utilizzano la cronologia locale:

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

Se hai bisogno anche di combinazioni di tasti ( CTRL+ cursori) per scorrere la cronologia globale, aggiungi anche questo al tuo .zshrc:

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

Affinché funzioni, l'opzione SHARE_HISTORY (vedi 16.2.4 Cronologia ) deve essere abilitata. Esegui setopte controlla se "sharehistory" è elencato. Altrimenti aggiungi setopt sharehistoryal tuo .zshrc. Quindi si può usare set-local-history come abbiamo fatto sopra. La documenazione dice:

Per impostazione predefinita, i comandi di spostamento della cronologia visitano le linee importate e le linee locali, ma è possibile attivarlo e disattivarlo con l'associazione zle set-local-history. È anche possibile creare un widget zle che farà in modo che alcuni comandi ignorino i comandi importati e alcuni li includono.

Si noti che per impostazione predefinita viene utilizzata la cronologia globale (e tutte le funzioni terminano con "zle set-local-history 0", ovvero la cronologia locale è disabilitata). Quindi premendo CTRL+ si Rcercherà la storia globale per impostazione predefinita (il che ha senso nella maggior parte dei casi).

Questo è abbastanza simile alla soluzione di @mpy, ma pronto per il copia e incolla. Sovrascrive i tasti cursore su e giù. Ho usato questa voce dell'elenco di posta .

Guarda anche:


1
Su zsh 5.0.2 viene visualizzato un errore che non può essere associato a una sequenza di tasti vuota. Anche se lo sostituisco con i tasti di un'altra risposta qui sotto, sia su / giù che Ctrl + su / giù passano attraverso la storia globale. Qualcosa che sto facendo di sbagliato qui?
rjh,

1
@rjh: prova questo: in un editor come vim, elimina il file ${key[Up]}. Quindi (in modalità di modifica), digitare Ctrl + V seguito dalla freccia su. Questo dovrebbe inserire il codice chiave corretto. Fare lo stesso per la freccia giù.
Robinin

Ho usato questo metodo e funziona, ma ho perso la possibilità di cercare nella cronologia scrivendo la parte iniziale di un comando e quindi Freccia su. Passa attraverso tutti i comandi come Bash, quindi devo aggirare usando Ctrl+R.
Melebio

5

È possibile impostare un widget zle speciale per mostrare solo gli elementi della cronologia locale:

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

Supponendo che sia vincolato a up-line-or-history(penso che sia predefinito), puoi associare questo widget a un altro tratto di chiave, come CTRL+ :

 bindkey "^[Oa" only-local-history

Se funziona probabilmente dipende dal tuo terminale. La linea sopra funziona in URxvt/Screen. Con xtermte ne avrai bisogno

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

per CTRL+ .

Un'altra variante potrebbe essere

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

quindi, se hai abilitato la cronologia locale, puoi sbirciare in quello globale o viceversa.


4

La risposta di @lumbic ha funzionato per me solo con alcune modifiche:

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

Questo codice rende la cronologia globale predefinita e utilizza la freccia CTRL per la cronologia locale.

Nota: utilizzo zsh 5.0.2 insieme a oh-my-zsh.


Sembra il contrario di quanto richiesto dall'OP - Ctrl+arrowsper la storia locale.
Melebio

1

Ho provato le opzioni elencate in altre risposte qui, ma non ero contento di loro. I widget 1 up-history o up-line-or-historynon includono l' inizio della ricerca e il widget 1 up-line-or-beginning-search sembra non funzionare bene quando si modifica la preferenza della cronologia locale durante l'utilizzo. 2

Quindi sono arrivato alle seguenti impostazioni. Abilita Ctrl+ frecce per sfogliare la cronologia globale, Alt+ frecce per sfogliare solo la cronologia locale (simile a Bash) e frecce autonome per utilizzare la ricerca di inizio intelligente (impostazione predefinita in 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 Anche le loro downcontroparti si intendono implicitamente.

2 L'inizio utilizzato per la ricerca viene ridefinito dopo aver modificato la preferenza della cronologia locale, quindi l'intero primo comando trovato viene utilizzato come inizio da cercare nella seconda ricerca.


1

Sulla base delle varie risposte qui, sono stato in grado di realizzare una versione ridotta:

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

Questa versione sovrascriverà quelli esistenti up-line-or-historye i down-line-or-historywidget con nuovi widget definiti dall'utente. Questo widget abilita la cronologia locale e chiamerà quindi i widget originali , che sono disponibili con i .nomi predefiniti. Vedi la documentazione del widget zle per i dettagli.

Ciò significa che puoi conservare tutte le combinazioni di tasti esistenti. È quindi possibile evitare di dover capire quale sia la sequenza di escape per digitare una freccia verso l'alto nel terminale corrente.


-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

La risposta sopra ha funzionato per me.

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


Potresti spiegare come questo distingue la storia locale e globale? IMHO il tuo codice non lo fa affatto. Inoltre, questo sembra essere già impostato in Oh My Zsh .
Melebio
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.