web-dev-qa-db-fra.com

Comment puis-je rechercher l'historique avec du texte déjà entré à l'invite dans zsh?

Dans zsh, je sais que je peux rechercher dans l'histoire avec Ctrl+r. Cependant, je commence souvent à taper une commande directement à l'invite, mais je réalise que je devrais rechercher l'historique. Quand je frappe Ctrl+r, il affiche une invite de recherche d'historique vide comme celle-ci:

history search Prompt not pre-filled

Remarquez comment il y a du texte dans mon invite mais pas dans l'invite de recherche d'historique. Comment démarrer la recherche d'historique avec le texte déjà dans l'invite, pour qu'il ressemble à ceci:

history search Prompt pre-filled

62
Sean Mackesey

Vous pouvez utiliser zle's history-search fonctionnalité:

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

Cela lie Up et Down (ajustez pour vos propres séquences d'échappement) à une recherche d'historique, en arrière et en avant, en fonction de ce qui a déjà été entré à l'invite.

Donc, si vous entrez "vim" et appuyez sur Up, zsh se déplacera en arrière dans votre historique uniquement pour les commandes commençant par "vim".

Vous pouvez également placer le curseur à la fin de la ligne une fois que vous avez sélectionné la commande souhaitée dans l'historique de zsh en utilisant la fonction history-search-end (généralement située dans /usr/share/zsh/functions/Zle/) et en ajoutant -end à la fin de chaque ligne, comme ceci:

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

Une autre option utile est history | grep

Attribuez un alias, par exemple.

alias hg='history | grep'

alors vous pouvez taper hg whatever pour rechercher les commandes que vous avez utilisées, par exemple.

$ 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 

J'ai mis cet alias dans mes fichiers dot.

21
Michael Durrant

Si vous utilisez oh-my-zsh , ajoutez history-substring-search À la ligne plugins=(...).

Puis ajouter

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

quelque part en dessous de la ligne qui lit source $ZSH/oh-my-zsh.sh. Enregistrez et lancez un nouveau terminal ou exécutez source ~/.zshrc Dans le terminal actuel.

Remarque: ^[[A Est la séquence d'échappement pour la flèche vers le haut dans le terminal que j'utilise (minou) et bien d'autres. Pour enregistrer le terminal de votre choix, saisissez showkey -a, Puis appuyez sur la touche pour laquelle vous souhaitez trouver la séquence d'échappement.

16
joelostblom

Vous voudrez peut-être utiliser le script à https://github.com/zsh-users/zsh-history-substring-search

Où vous pouvez saisir n'importe quelle partie d'une commande précédemment saisie et appuyer sur la touche Up et Down pour faire défiler les commandes correspondantes.

7
number5

Je recommande fortement d'utiliser "$terminfo[kcuu1]" ou "$key[Up]" plutôt que des trucs codés en dur comme "^[[A" qui peut ou non fonctionner sur un système particulier.

Check-out /etc/zsh/zshrc pour plus de touches. Voici à quoi cela ressemble sur mon système. Je pense que les touches terminfo sont plus susceptibles d'être définies.

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

Qu'en est-il de l'utilisation zsh-autosuggestions ?

Le fait est que, pour chaque commande que vous tapez, ce plugin vous montrera quelques suggestions qui pourraient être acceptées ou non. Essayez-le et faites-nous part de vos commentaires.

Sans plugins, nous pouvons appuyer Ctrlr pour effectuer une recherche inversée sur l'historique, dès que vous commencez à taper les commandes correspondantes apparaîtront sous forme de suggestions.

5
SergioAraujo

J'utilise le plugin vi-mode . Et puis dans mon ~/.zshrc j'ai les liaisons suivantes:

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

Cela me permet d'utiliser le ^P et ^N comme recherche normale en arrière et en avant si je n'entre pas de texte, et en recherche filtrée si je le fais.

2
Slobodan Ilic

Vous pouvez plutôt utiliser zaw , qui remplace complètement votre recherche par une bien meilleure recherche multi-mots clés, et résout également votre problème - l'historique de recherche n'est qu'une des choses que zaw peut rechercher.

Petit introduction/discussion ici

1
Brad Parks

Je suis d'accord avec cheflo que la recherche "sous-chaîne" est plus utile. Je ne peux pas commenter là-bas, j'ai donc commencé une nouvelle réponse. J'utilise oh-my-zsh et j'ajoute "history-substring-search" aux plugins = (...) de ~/.zshrc. Puis source ~/.zshrc. Vous n'avez pas besoin d'ajouter quelque chose de plus. Utilisez "bindkey" pour vérifier:

"^ [OA" historique-sous-chaîne-recherche-vers le haut 
 "^ [OB" historique-sous-chaîne-recherche-vers le bas

Plus tard, vous tapez "à" et la flèche vers le haut, "historique" apparaîtra et "à" mis en évidence (si vous avez utilisé la commande "historique" auparavant).

1
James

Réponse non Oh-My-Zsh

Cela a fonctionné pour moi (sur macOS) pour que l'historique des sous-chaînes soit facilement accessible via la flèche haut/bas. La reliure est à vous de décider.

L'historique de recherche de sous-chaîne est préférable à l'accès aux commandes commençant par une chaîne. Cela ressemble plus à ctrl-r dans la plupart des cas, ceux sans correspondance de globes ou d'expression régulière.

À partir des instructions sur 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

Profitant maintenant de cela à fond.

1
Merlin

Parce que j'utilise oh-my-zsh et j'utilise la solution de sous-chaîne de joelostblom, James, je modifie le .zshrc comme ceci: (qui à la ligne 13, trouvez la ligne "source $ ZSH/oh-my-zsh.sh" , puis modifiez le code autour.)

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