it-swarm.com.de

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

In zsh weiß ich, dass ich mit dem Verlauf suchen kann Ctrl+r. Oft beginne ich jedoch, einen Befehl direkt an der Eingabeaufforderung einzugeben, merke dann aber, dass ich den Verlauf durchsuchen sollte. Wenn ich treffe Ctrl+rEs wird eine leere Verlaufssuche angezeigt. Eingabeaufforderung wie folgt:

history search Prompt not pre-filled

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? So sieht es aus:

history search Prompt pre-filled

62
Sean Mackesey

Sie können zles history-search Funktionalität verwenden:

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

Das bindet Up und Down (an Ihre eigenen Escape-Sequenzen anpassen) zu einer Verlaufssuche, vorwärts und rückwärts, basierend auf dem, was bereits an der Eingabeaufforderung eingegeben wurde.

Also, wenn Sie "vim" eingeben und drücken würden Up, zsh durchläuft Ihren Verlauf nur für die Befehle, die mit "vim" beginnen, rückwärts.

Sie können den Cursor zusätzlich am Ende der Zeile platzieren, nachdem Sie den gewünschten Befehl aus dem Verlauf von zsh ausgewählt haben, indem Sie die Funktion Verlaufssuche-Ende verwenden (normalerweise in /usr/share/zsh/functions/Zle/). und Anhängen von -end an das Ende jeder Zeile wie folgt:

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
49
jasonwryan

Eine weitere nützliche Option ist history | grep

Weisen Sie einen Alias ​​zu, z.

alias hg='history | grep'

dann können Sie hg whatever, 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.

21
Michael Durrant

Wenn Sie oh-my-zsh verwenden, fügen Sie history-substring-search Zur Zeile plugins=(...) hinzu.

Dann füge hinzu

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

irgendwo unterhalb der Zeile mit der Aufschrift source $ZSH/oh-my-zsh.sh. Speichern und starten Sie ein neues Terminal oder führen Sie source ~/.zshrc Im aktuellen 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 showkey -a Ein und drücken Sie die Taste, für die Sie die Escape-Sequenz suchen möchten.

16
joelostblom

Möglicherweise möchten Sie das Skript unter https://github.com/zsh-users/zsh-history-substring-search verwenden

Hier können Sie einen beliebigen Teil eines zuvor eingegebenen Befehls eingeben und die Taste drücken Up und Down Tasten zum Durchlaufen der übereinstimmenden Befehle.

7
number5

Ich würde dringend empfehlen, "$terminfo[kcuu1]" Oder "$key[Up]" Zu verwenden, anstatt fest codierte Dinge wie "^[[A" Zu verwenden, die auf einem bestimmten System funktionieren oder nicht.

Weitere Schlüssel finden Sie unter /etc/zsh/zshrc. So sieht es auf meinem System aus. Ich denke, die terminfo Schlü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]}"
)
6
zzxyz

Was ist mit zsh-autosuggestions ?

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

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

5
SergioAraujo

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

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

Dadurch kann ich das ^P und ^N als normale Rückwärts- und Vorwärtssuche, wenn ich keinen Text eingebe, und als gefilterte Suche, wenn ich dies tue.

2
Slobodan Ilic

Sie können stattdessen zaw verwenden, das Ihre Suche vollständig durch eine viel bessere Super-Suche mit mehreren Schlüsselwörtern ersetzt und auch Ihr Problem behebt. Der Suchverlauf ist nur eines der Dinge, nach denen zaw suchen kann.

Klein Intro/Diskussion hier

1
Brad Parks

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

"^ [OA" Verlaufssubstringsuche nach oben 
 "^ [OB" Verlaufssubstringsuche 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).

1
James

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.

Das Durchsuchen des Suchverlaufs ist besser als nur auf Befehle zuzugreifen, die mit einer Zeichenfolge beginnen. Dies ähnelt in den meisten Fällen eher Strg-R, ohne Globs oder Regex-Matching.

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 genieße das gründlich.

1
Merlin

Da ich oh-my-zsh und die Teilstring-Lösung von joelostblom, James, verwende, ändere ich die .zshrc folgendermaßen: (in Zeile 13 finden Sie die Zeile "source $ ZSH/oh-my-zsh.sh" , dann ändern Sie den Code darum 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
0
user3633852