Wie kann ich den Verlauf mit Text durchsuchen, der bereits an der Eingabeaufforderung in zsh eingegeben wurde?

58

In zsh weiß ich, dass ich mit Ctrl+ den Verlauf durchsuchen kann r. Oft fange ich jedoch an, einen Befehl direkt an der Eingabeaufforderung einzugeben, und stelle dann fest, dass ich den Verlauf durchsuchen sollte. Wenn ich Ctrl+ rdrücke, wird eine leere Verlaufssuchaufforderung wie folgt angezeigt:

Verlaufssuchaufforderung nicht ausgefüllt

Beachten Sie, dass sich an meiner Eingabeaufforderung Text befindet, nicht jedoch an der Eingabeaufforderung für die Verlaufssuche. Wie starte ich die Verlaufssuche mit dem Text, der bereits in der Eingabeaufforderung enthalten ist?

Eingabeaufforderung für Verlaufssuche bereits ausgefüllt

Sean Mackesey
quelle

Antworten:

44

Sie können diehistory-search Funktionen von zle verwenden:

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

Dies bindet Upund Down(an Ihre eigenen Escape-Sequenzen anpassbar) eine Verlaufssuche vorwärts und rückwärts auf der Grundlage dessen, was bereits an der Eingabeaufforderung eingegeben wurde.

Wenn Sie also "vim" eingeben und Updrücken, durchläuft zsh Ihren Verlauf nur für Befehle, die mit "vim" beginnen.

Sie können den Cursor auch an das Ende der Zeile setzen, sobald Sie den gewünschten Befehl aus dem Verlauf von zsh ausgewählt haben. Verwenden Sie dazu die Funktion history-search-end (in der Regel in /usr/share/zsh/functions/Zle/) und fügen Sie sie -endan das Ende jeder Zeile an.

autoload -U history-search-end
zle -N history-beginning-search-backward-end history-search-end
zle -N history-beginning-search-forward-end history-search-end
bindkey "^[[A" history-beginning-search-backward-end
bindkey "^[[B" history-beginning-search-forward-end
jasonwryan
quelle
Grosses Dankeschön. Ich musste das "-end" für beide Bindkey-Befehle entfernen, damit sie funktionieren. Ich habe Ihre Antwort nicht bearbeitet, weil es vielleicht eine Situation gibt, in der diese notwendig sind?
Sean Mackesey
Kein Problem: Die Antwort wurde mit den Details aktualisiert, die Sie geklärt haben möchten.
Jasonwryan
Dies funktionierte für mich bis Ende November 2015, als ich auf die neueste Version von oh my zsh upgegradet habe. Irgendwelche Ideen? Vorschlag? hat das noch jemand gesehen? wie man debuggt
Hani elabed
2
@hanielabed Oh-my-Zsh ist ein clusterfsck; Ich bin überhaupt nicht überrascht, dass es etwas so Grundlegendes wie die Suche nach Geschichte brechen würde ...
jasonwryan
1
Gibt es eine Möglichkeit, dass der Cursor bei einer leeren Verlaufssuche ans Ende springt, bei einer Teilsuche jedoch an derselben Position bleibt? Dies ist, was derzeit in Bash passiert.
CMCDragonkai
19

Eine weitere nützliche Option ist history | grep

Vergeben Sie einen Alias, z

alias hg='history | grep'

Dann können Sie hg whatevereingeben, um nach Befehlen zu suchen, die Sie verwendet haben, z

$ hg chmod                                                                                                       
 1309  chmod +x rotate_files.sh 
 1385  chmod +x rotate_files_270.sh 
 1512  chmod +x testy.sh 
 1528  chmod +x act_on_2_numbers.sh 
 2142  chmod +x ~/bin/display_tmux_pane_pwd.sh
 4532  chmod +x cat_files.rb 

Ich habe diesen Alias ​​in meine Punktedateien eingefügt.

Michael Durrant
quelle
17
Was hgerinnert mich an ... Oh ja, Mercurial!
12

Wenn Sie oh-my-zsh verwenden , ergänzen Sie history-substring-searchdie plugins=(...)Zeile.

Dann füge hinzu

bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down

Irgendwo unter der Zeile, die lautete source $ZSH/oh-my-zsh.sh. Speichern und starten Sie ein neues Terminal oder führen Sie source ~/.zshrcdas aktuelle Terminal aus.

Hinweis: ^[[A Ist die Escape-Sequenz für den Aufwärtspfeil in dem von mir verwendeten Terminal (Kitty) und vielen anderen. Um das Terminal Ihrer Wahl einzuchecken, geben Sie ein showkey -aund drücken Sie die Taste, für die Sie die Escape-Sequenz suchen möchten.

joelostblom
quelle
Es ist unklar, was diese Tastenzuordnung bewirkt. In der obigen Antwort wird erläutert: "Dies bindet Auf und Ab (angepasst an Ihre eigenen Escape-Sequenzen) an eine Verlaufssuche in Rückwärts- und Vorwärtsrichtung, basierend auf dem, was bereits an der Eingabeaufforderung eingegeben wurde."
Colin D
@ColinD Zur Klarstellung wurde ein Hinweis hinzugefügt
joelostblom
1
Die Teilstringsuche ist am besten, eine Obermenge von Befehlen beginnt mit. Um zu implementieren, ohne ein oh-my-zsh-Benutzer zu sein, habe ich brew install zsh-history-substring-searchdie Repo-Readme-Datei auf Anweisungen überprüft. Ich werde einfach weitermachen und eine Antwort erstellen. Ich bin wirklich zufrieden mit dem Ergebnis.
Merlin
4

Ich würde mit sehr empfehlen "$terminfo[kcuu1]"oder "$key[Up]"eher als hartcodierte Sachen wie "^[[A"die möglicherweise nicht auf ein bestimmtes System arbeiten.

Schauen Sie sich /etc/zsh/zshrcfür weitere Tasten. So sieht es auf meinem System aus. Ich denke, die terminfoSchlüssel sind eher definiert.

key=(
    BackSpace  "${terminfo[kbs]}"
    Home       "${terminfo[khome]}"
    End        "${terminfo[kend]}"
    Insert     "${terminfo[kich1]}"
    Delete     "${terminfo[kdch1]}"
    Up         "${terminfo[kcuu1]}"
    Down       "${terminfo[kcud1]}"
    Left       "${terminfo[kcub1]}"
    Right      "${terminfo[kcuf1]}"
    PageUp     "${terminfo[kpp]}"
    PageDown   "${terminfo[knp]}"
)
zzxyz
quelle
4

Was ist mit zsh-autosuggestions?

Die Sache ist, dass für jeden Befehl, den Sie dieses Plugin eingeben, einige Vorschläge angezeigt werden, die akzeptiert werden könnten oder nicht. Probieren Sie es aus und geben Sie uns ein Feedback.

Ohne Plugins können wir drücken Ctrlr, um eine umgekehrte Suche im Verlauf durchzuführen. Sobald Sie mit der Eingabe beginnen, werden die übereinstimmenden Befehle als Vorschläge angezeigt.

SergioAraujo
quelle
2

Ich benutze das vi-mode Plugin. Und dann habe ich in meinem ~ / .zshrc die folgenden Bindungen:

bindkey "^P" history-beginning-search-backward
bindkey "^N" history-beginning-search-forward

Das ermöglicht mir, die ^Pund ^Nals normale Rückwärts- und Vorwärtssuche zu verwenden, wenn ich keinen Text eingebe, und als gefilterte Suche, wenn ich es tue.

Slobodan Ilic
quelle
1

Ich stimme cheflo zu, dass die Suche nach "Teilzeichenfolgen" nützlicher ist. Da ich dort keinen Kommentar abgeben kann, habe ich eine neue Antwort gestartet. Ich benutze oh-my-zsh und füge "history-substring-search" zu den plugins = (...) von ~ / .zshrc hinzu. Dann geben Sie ~ / .zshrc ein. Müssen Sie nichts mehr hinzufügen. Verwenden Sie "bindkey", um Folgendes zu überprüfen:

"^ [OA" History-Teilstringsuche
"^ [OB" History-Teilzeichenfolge-Suche nach unten

Später geben Sie "bis" und den Aufwärtspfeil ein, "Verlauf" wird angezeigt und "bis" hervorgehoben (wenn Sie zuvor den Befehl "Verlauf" verwendet haben).

James
quelle
1

Sie könnten stattdessen zaw verwenden , das Ihre Suche vollständig durch eine viel bessere Super-Suche mit mehreren Suchbegriffen ersetzt und auch Ihr Problem behebt - der Suchverlauf ist nur eines der Dinge, die zaw durchsuchen kann.

Kleines Intro / Diskussion hier

Brad Parks
quelle
0

Da ich oh-my-zsh verwende und die Teilzeichenfolgenlösung von joelostblom, James, verwende, ändere ich die .zshrc folgendermaßen: , dann ändern Sie den Code um ihn herum.)

plugins=(
  git
  history-substring-search
)

source $ZSH/oh-my-zsh.sh

bindkey -v
bindkey "^[[A" history-substring-search-up
bindkey "^[[B" history-substring-search-down
user3633852
quelle
bindkey -vbricht Strg-A, Strg-E. Höchstwahrscheinlich alle Strg-Befehle.
Michael Ozeryansky
0

Non-Oh-My-Zsh-Antwort

Dies funktionierte für mich (unter macOS), um den Teilstring-Verlauf über den Aufwärts- / Abwärtspfeil leicht zugänglich zu machen. Die Schlüsselbindung liegt bei Ihnen.

Der Teilstringsuchverlauf ist besser, als nur auf Befehle zuzugreifen, die mit einer Zeichenfolge beginnen. Dies entspricht in den meisten Fällen eher der Tastenkombination Strg-R (Strg-R), wenn keine Globs oder Regex-Übereinstimmungen vorliegen.

Ausgehend von den Anweisungen unter zsh-users / zsh-history-substring-search

brew install zsh-history-substring-search

# add the following to .zshrc
source /usr/local/share/zsh-history-substring-search/zsh-history-substring-search.zsh
bindkey '^[[A' history-substring-search-up
bindkey '^[[B' history-substring-search-down

Nun viel Spaß damit.

Merlin
quelle