ZSH: cronologia delle ricerche sui tasti su e giù?


22

Attualmente, ho nel mio .zshrc:

bindkey '^[[A' up-line-or-search
bindkey '^[[B' down-line-or-search

Tuttavia, questo sembra corrispondere solo al contenuto del mio input corrente prima che si verifichi un carattere spazio. Ad esempio, sudo ls /corrisponderà a ogni riga della mia cronologia che inizia con sudo, mentre mi piacerebbe che corrispondesse solo a righe che corrispondono al mio intero input. (cioè sudo ls /etccorrisponderebbe, ma non sudo cat /var/log/messages)

Cosa devo cambiare per ottenere il comportamento desiderato?

Ecco il mio intero .zshrc nel caso sia rilevante: https://gist.github.com/919566

Risposte:


9

Questo è il comportamento documentato :

down-line-or-search
Spostarsi verso il basso di una riga nel buffer oppure, se già nella riga inferiore, cercare in avanti nella cronologia una riga che inizia con la prima parola nel buffer.

Non sembra esserci un widget esistente che fa esattamente quello che vuoi, quindi dovrai crearne uno tuo. Ecco come definire un widget che si comporta come up-line-or-search, ma usando l'inizio della riga (fino al cursore) anziché la prima parola come stringa di ricerca. Non veramente testato, soprattutto non su input multilinea.

up-line-or-search-prefix () {
  local CURSOR_before_search=$CURSOR
  zle up-line-or-search "$LBUFFER"
  CURSOR=$CURSOR_before_search
}
zle -N up-line-or-search-prefix

È necessario utilizzare un approccio alternativo history-beginning-search-backward, ma chiamarlo solo se il cursore si trova sulla prima riga. Non testato.

up-line-or-history-beginning-search () {
  if [[ -n $PREBUFFER ]]; then
    zle up-line-or-history
  else
    zle history-beginning-search-backward
  fi
}
zle -N up-line-or-history-beginning-search

Grazie, Gilles, la tua prima soluzione funziona abbastanza bene, ma c'è un problema e spero che tu possa aiutarmi a risolverlo. Quando chiamo up-line-o-search-prefix su un input vuoto, mi dà l'ultimo comando di esecuzione: il comportamento desiderato. Tuttavia, quando eseguo nuovamente up-line-or-search-prefix, esegue un up-line-or-search sul primo carattere del mio input. È possibile in qualche modo cambiare le cose in modo che premendo la freccia su con un input vuoto scorrerai la mia storia?
rps,

@rps Ah, capito, stava raccogliendo la prima parola perché mancava l'argomento (invece di essere vuoto come avrebbe dovuto). Usa la mia versione modificata.
Gilles 'SO- smetti di essere malvagio' il

33

zsh fornisce questa funzionalità utilizzando

history-beginning-search-backward
history-beginning-search-forward

Ex.

bindkey "^[[A" history-beginning-search-backward
bindkey "^[[B" history-beginning-search-forward

Trova il codice chiave esatto di
ctrl+vKEY

Ex.
ctrl+ vUP
ctrl+ vDOWN
ctrl+ vPageUp
ctrl+ vPageDown
ecc.


1
In zprezto [ 1 ] è disponibile un'alternativa per codici chiave che potrebbero funzionare su terminali diversi . <kbd> Su </kbd> è $terminfo[kcuu1], <kbd> Giù </kbd> è $terminfo[kcud1].
Giustino C,

8

Questo post del blog del 2013 raccomanda un paio di combinazioni di tasti che corrispondono a tutte le parole prima del cursore.

# Cycle through history based on characters already typed on the line
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 "$key[Up]" up-line-or-beginning-search
bindkey "$key[Down]" down-line-or-beginning-search

(In una versione precedente di questa risposta, avevo usato $terminfocome raccomandato in uno dei commenti sul post del blog. Alcuni valori terminfo sono elencati qui .)


1
zsh fornisce anche questi alias più amichevoli (almeno nel pacchetto ubuntu) in /etc/zsh/zshrc, come $key[Up].
zzxyz,

Se si utilizza $terminfoè necessario modificare le modalità del terminale. Vedi qui .
Tom Hale,

Ho modificato la risposta da utilizzare $key[]anziché $terminfo[]. Spero che funzioni bene per i lettori!
joeytwiddle,

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.