ZSH: Suchverlauf auf Auf- und Ab-Tasten?

22

Derzeit habe ich Folgendes in meinem .zshrc:

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

Dies scheint jedoch nur mit dem Inhalt meiner aktuellen Eingabe übereinzustimmen, bevor ein Leerzeichen auftritt. Beispiel: sudo ls /Stimmt mit jeder Zeile in meinem Verlauf überein, die mit beginnt sudo, während ich möchte, dass nur Zeilen übereinstimmen, die mit meiner gesamten Eingabe übereinstimmen. (dh sudo ls /etcwürde passen, aber nicht sudo cat /var/log/messages)

Was muss ich ändern, um das gewünschte Verhalten zu erzielen?

Hier ist meine gesamte .zshrc falls es relevant ist: https://gist.github.com/919566

rps
quelle

Antworten:

9

Dies ist das dokumentierte Verhalten :

down-line-or-search
Gehen Sie im Puffer eine Zeile nach unten oder suchen Sie im Verlauf nach einer Zeile, die mit dem ersten Wort im Puffer beginnt, wenn Sie sich bereits in der untersten Zeile befinden.

Es scheint kein Widget zu geben, das genau das tut, was Sie wollen. Sie müssen also Ihr eigenes Widget erstellen. Hier erfahren Sie, wie Sie ein Widget definieren, das sich wie up-line-or-searchfolgt verhält , jedoch den Zeilenanfang (bis zum Cursor) und nicht das erste Wort als Suchzeichenfolge verwendet. Nicht wirklich getestet, besonders nicht bei mehrzeiligen Eingängen.

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

Ein alternativer Ansatz ist history-beginning-search-backward, ihn aber nur dann aufzurufen, wenn sich der Cursor in der ersten Zeile befindet. Ungetestet.

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
Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank, Gilles, Ihre erste Lösung funktioniert ziemlich gut, aber es gibt ein Problem, und ich hoffe, Sie können mir bei der Lösung helfen. Wenn ich bei einer leeren Eingabe das Präfix "up-line-or-search" aufrufe, erhalte ich den Befehl "last run" - das gewünschte Verhalten. Wenn ich jedoch das Präfix "Up-Line-or-Search" erneut ausführe, wird das erste Zeichen meiner Eingabe nach dem Präfix "Up-Line-or-Search" durchsucht. Ist es möglich, Dinge irgendwie zu ändern, so dass das Drücken des Aufwärtspfeils mit einer leeren Eingabe durch meinen Verlauf scrollen wird?
RPS
@rps Ah, gotcha, es hat das erste Wort aufgegriffen, weil das Argument fehlte (anstatt leer zu sein, wie es sein sollte). Verwenden Sie meine bearbeitete Version.
Gilles 'SO- hör auf böse zu sein'
33

zsh bietet diese Funktionalität mit

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

Ex.

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

Finden Sie den genauen Schlüsselcode mit
ctrl+vKEY

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

Mudrii
quelle
1
Eine Alternative für Schlüsselcodes, die möglicherweise auf verschiedenen Terminals funktionieren, finden Sie in zprezto [ 1 ]. <kbd> Hoch </ kbd> ist $terminfo[kcuu1], <kbd> Runter </ kbd> ist $terminfo[kcud1].
Justin C
8

In diesem Blog-Beitrag aus dem Jahr 2013 werden einige Tastenkombinationen empfohlen, die mit allen Wörtern vor dem Cursor übereinstimmen.

# 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 einer früheren Version dieser Antwort hatte ich die $terminfoin einem Kommentar zum Blog-Post empfohlenen Werte verwendet. Einige terminfo-Werte sind hier aufgelistet .)

joeytwiddle
quelle
1
zsh gibt auch diese freundlicheren Aliase (zumindest im Ubuntu-Paket) an /etc/zsh/zshrc, wie z $key[Up].
zzxyz
Bei Verwendung müssen $terminfoSie die Terminalmodi ändern. Sehen Sie hier .
Tom Hale
Ich habe die Antwort bearbeitet zu verwenden , $key[]statt $terminfo[]. Ich hoffe, das funktioniert gut für die Leser!
Joeytwiddle
1

Schauen Sie sich auch das Projekt zsh-history-substring-search an .

Es bietet, wonach Sie suchen, und kann sogar als oh-my-zsh-Plugin verwendet werden.

Matthieu Napoli
quelle