Comment puis-je rechercher l'historique avec le texte déjà saisi à l'invite de zsh?

59

En zsh, je sais que je peux rechercher l'historique avec Ctrl+ r. Cependant, souvent, je commence à taper une commande directement à l'invite, mais je réalise alors que je devrais chercher dans l'historique. Lorsque je frappe sur Ctrl+ r, une invite de recherche d'historique vierge comme celle-ci s'affiche:

invite de recherche d'historique non préremplie

Notez qu'il y a du texte à mon invite mais pas à l'invite de recherche d'historique. Comment lancer la recherche dans l'historique avec le texte déjà présent dans l'invite, qui ressemble à ceci:

invite de recherche d'historique pré-remplie

Sean Mackesey
la source

Réponses:

44

Vous pouvez utiliser leshistory-search fonctionnalités de zle :

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

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

Donc, si vous deviez entrer "vim" et taper Up, zsh reviendra en arrière dans votre historique pour seulement 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 (située généralement dans /usr/share/zsh/functions/Zle/) et en ajoutant -endà la fin de chaque ligne, comme suit:

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
la source
Super merci. Je devais enlever le "-end" pour les deux commandes bindkey pour les faire fonctionner. Je n'ai pas révisé votre réponse car il existe peut-être une situation dans laquelle cela est nécessaire.
Sean Mackesey
Pas de problème: mis à jour la réponse avec le détail que vous vouliez clarifier.
jasonwryan
Cela fonctionnait pour moi jusqu'à la fin novembre, décembre 2015, lorsque j'ai mis à niveau vers la dernière version de oh my zsh. Des idées? suggestion? Quelqu'un d'autre a vu ça? comment déboguer?
hani élabed
2
@hanielabed Oh-my-Zsh est un clusterfsck; Je ne suis pas du tout surpris que cela casserait quelque chose d'aussi fondamental que la recherche dans l'histoire ...
jasonwryan
1
Existe-t-il un moyen pour le curseur de sauter à la fin d'une recherche d'historique vide, tout en conservant la même position pour une recherche partielle? C'est ce qui se passe actuellement à Bash.
CMCDragonkai
19

Une autre option utile est history | grep

Attribuer un alias, par exemple

alias hg='history | grep'

alors vous pouvez taper hg whateverpour 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 

Je mets cet alias dans mes fichiers de points.

Michael Durrant
la source
17
Qu'est-ce qui hgme rappelle ... Oh ouais, Mercurial!
12

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

Puis ajouter

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

quelque part en dessous de la ligne qui a lu source $ZSH/oh-my-zsh.sh. Enregistrez et démarrez un nouveau terminal ou exécutez-le source ~/.zshrcdans le terminal actuel.

Remarque: ^[[A est la séquence d'échappement pour la flèche vers le haut dans le terminal que j'utilise (chat) et beaucoup d'autres. Pour enregistrer le terminal de votre choix, tapez showkey -a-le puis appuyez sur la touche pour laquelle vous souhaitez rechercher la séquence d'échappement.

joelostblom
la source
La réponse ci-dessus explique: "Cela lie Haut et Bas (ajustez pour vos propres séquences d'échappement) à une recherche dans l'historique, en arrière et en avant, sur la base de ce qui a déjà été entré à l'invite."
Colin D
@ColinD Ajouté une note pour clarifier
joelostblom le
1
La recherche par sous-chaîne est préférable, c’est un sur-ensemble de commandes qui commence par. mettre en œuvre sans être un utilisateur de oh-my-zsh, j'ai brew install zsh-history-substring-searchvérifié les instructions dans le fichier Lisez-moi pour le repo, je vais continuer et créer une réponse. Je suis vraiment satisfait du résultat.
Merlin
4

Je recommande fortement d'utiliser "$terminfo[kcuu1]"ou "$key[Up]"plutôt des éléments codés en dur, tels "^[[A"que ceux qui peuvent ou ne peuvent pas fonctionner sur un système particulier.

Départ /etc/zsh/zshrcpour plus de clés. Voici à quoi cela ressemble sur mon système. Je pense que les terminfoclés 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]}"
)
zzxyz
la source
4

Qu'en est-il d'utiliser zsh-autosuggestions?

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

En l'absence de plug-ins, nous pouvons appuyer sur Ctrlrpour effectuer une recherche inversée dans l'historique. Dès que vous commencez à saisir les commandes correspondantes, elles apparaissent sous forme de suggestions.

SergioAraujo
la source
2

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 la ^Pet ^Ncomme recherche normale en arrière si je ne saisis pas de texte et comme recherche filtrée si je le fais.

Slobodan Ilic
la source
1

Je suis d'accord avec cheflo que la recherche "sous-chaîne" est plus utile. Je ne peux pas commenter là-bas alors j'ai 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 rien à ajouter. Utilisez "bindkey" pour vérifier:

"^ [OA" history-substring-search-up
"^ [OB" historique-sous-chaîne-recherche-bas

Plus tard, vous tapez "to" et la flèche vers le haut, "history" apparaîtra et "to" sera en surbrillance (si vous avez utilisé la commande "history" auparavant).

James
la source
1

Vous pouvez également utiliser zaw , qui remplace complètement votre recherche par une meilleure recherche sur plusieurs mots clés et corrige votre problème. L'historique de la recherche n'est qu'un des éléments que zaw peut rechercher.

Petite introduction / discussion ici

Brad Parks
la source
0

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

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
utilisateur3633852
la source
bindkey -vva casser ctrl-a, ctrl-e. Très probablement toutes les commandes ctrl.
Michael Ozeryansky
0

Réponse Non-Oh-My-Zsh

Cela a fonctionné pour moi (sur macOS) pour obtenir l'historique des sous-chaînes facilement accessible via les flèches haut / bas. La liaison de clé est à vous.

L’historique de recherche de sous-chaîne est préférable au simple accès à des commandes commençant par une chaîne. Cela ressemble plus à ctrl-r dans la plupart des cas, ceux sans globs ni correspondance de regex.

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

Maintenant, profitant de cela à fond.

Merlin
la source