ZSH: historique de recherche sur les touches haut et bas?


22

Actuellement, j'ai ce qui suit dans mon .zshrc:

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

Cependant, cela ne semble correspondre au contenu de mon entrée actuelle avant qu'un caractère espace ne se produise. Par exemple, sudo ls /correspondra à chaque ligne de mon historique qui commence par sudo, alors que je voudrais qu'il ne corresponde qu'aux lignes qui correspondent à l'intégralité de mon entrée. (ie sudo ls /etccorrespondrait, mais pas sudo cat /var/log/messages)

Que dois-je changer pour obtenir le comportement souhaité?

Voici mon .zshrc entier au cas où il serait pertinent: https://gist.github.com/919566

Réponses:


9

Voici le comportement documenté :

down-line-or-search
Descendre d'une ligne dans le tampon ou, si déjà en bas, rechercher dans l'historique une ligne commençant par le premier mot du tampon.

Il ne semble pas y avoir de widget existant qui fasse exactement ce que vous voulez, vous devrez donc créer le vôtre. Voici comment définir un widget qui se comporte comme up-line-or-search, mais en utilisant le début de la ligne (jusqu'au curseur) plutôt que le premier mot comme chaîne de recherche. Pas vraiment testé, surtout pas sur une entrée multi-ligne.

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

Une approche alternative est à utiliser history-beginning-search-backward, mais n'appelez-la que si le curseur est sur la première ligne. Non testé.

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

Merci, Gilles, votre première solution fonctionne plutôt bien, mais il y a un problème et j'espère que vous pourrez m'aider à le résoudre. Lorsque j'appelle up-line-or-search-prefix sur une entrée vide, cela me donne la dernière commande d'exécution - le comportement souhaité. Cependant, lorsque je lance à nouveau up-line-or-search-prefix, il effectue une up-line-or-search sur le premier caractère de mon entrée. Est-il possible de changer les choses d'une manière ou d'une autre pour que le fait d'appuyer sur la flèche vers le haut avec une entrée vide fasse défiler mon historique?
rps

@rps Ah, gotcha, il récupérait le premier mot parce que l'argument était manquant (au lieu d'être vide comme il se doit). Utilisez ma version modifiée.
Gilles 'SO- arrête d'être méchant'

33

zsh fournit cette fonctionnalité en utilisant

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

Ex.

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

Trouvez le code clé exact par
ctrl+vKEY

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


1
Une alternative pour les codes clés qui pourraient fonctionner sur différents terminaux peut être trouvée dans zprezto [ 1 ]. <kbd> Up </kbd> est $terminfo[kcuu1], <kbd> Down </kbd> est $terminfo[kcud1].
Justin C

8

Ce billet de blog de 2013 recommande quelques raccourcis clavier qui correspondent à tous les mots avant le curseur.

# 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

(Dans une version antérieure de cette réponse, j'avais utilisé $terminfocomme recommandé dans l'un des commentaires sur le blog. Certaines valeurs terminfo sont répertoriées ici .)


1
zsh donne également ces alias plus conviviaux (au moins dans le paquet ubuntu) dans /etc/zsh/zshrc, tels que $key[Up].
zzxyz

Si $terminfovous utilisez, vous devrez changer les modes du terminal. Voyez ici .
Tom Hale

J'ai modifié la réponse à utiliser à la $key[]place de $terminfo[]. J'espère que cela fonctionne bien pour les lecteurs!
joeytwiddle

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.