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

rps
la source

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
Gilles 'SO- arrête d'être méchant'
la source
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.

mudrii
la source
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 .)

joeytwiddle
la source
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
1

Jetez également un œil au projet zsh-history-substring-search .

Il offre ce que vous recherchez, et il peut même être utilisé comme plugin oh-my-zsh.

Matthieu Napoli
la source