Séparation de la flèche vers le haut pour l'historique ZSH local et mondial

25

Est-ce possible de...

  • Intensifiez l'historique du shell ZSH local (les actions ne se sont produites que dans cette invite)

  • Intensifier l'historique mondial ZSH (l'historique partagé est activé) - ce qui se produit par défaut lorsque vous appuyez sur la flèche HAUT lorsque l'historique partagé est activé

... séparément.

Par exemple, on peut lier CTRL + pour l'historique global, normal pour l'historique local. En même temps, il est logique d'utiliser l'historique global pour une recherche en arrière (c'est-à-dire CTRL+ R).

Cela pourrait accélérer certaines opérations shell, car certaines opérations sont spécifiques à cette fenêtre shell et vous souhaitez y revenir.

Mikko Ohtamaa
la source

Réponses:

25

Copiez et collez ceci sur votre .zshrc:

Les curseurs utilisent l'histoire locale:

bindkey "${key[Up]}" up-line-or-local-history
bindkey "${key[Down]}" down-line-or-local-history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

Si vous avez également besoin de raccourcis clavier ( CTRL+ curseurs) pour parcourir l'historique global, ajoutez-le également à votre .zshrc:

bindkey "^[[1;5A" up-line-or-history    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-history  # [CTRL] + Cursor down

Pour que cela fonctionne, l'option SHARE_HISTORY (voir 16.2.4 Historique ) doit être activée. Exécutez setoptet vérifiez si "sharehistory" est répertorié. Si ce n'est pas ajouter setopt sharehistoryà votre .zshrc. Ensuite, on peut utiliser set-local-history comme nous l'avons fait ci-dessus. La documentation dit:

Par défaut, les commandes de déplacement d'historique visitent les lignes importées ainsi que les lignes locales, mais vous pouvez les activer et les désactiver avec la liaison zle set-local-history. Il est également possible de créer un widget zle qui fera en sorte que certaines commandes ignorent les commandes importées, et certaines les incluent.

Notez que par défaut, l'historique global est utilisé (et toutes les fonctions se terminent par "zle set-local-history 0", c'est-à-dire que l'historique local est désactivé). Donc, appuyer sur CTRL+ Rrecherchera l'historique global par défaut (ce qui est logique dans la plupart des cas).

Ceci est assez similaire à la solution de @mpy, mais prêt pour le copier-coller. Il écrase les touches du curseur de haut en bas. J'ai utilisé cette entrée de liste de diffusion .

Voir également:

lumbric
la source
1
Sur zsh 5.0.2, j'obtiens une erreur indiquant qu'il ne peut pas se lier à une séquence de touches vide. Même si je le remplace par les touches d'une autre réponse ci-dessous, les touches haut / bas et Ctrl + haut / bas parcourent simplement l'historique global. Quelque chose que je fais mal ici?
rjh
1
@rjh: Essayez ceci: dans un éditeur comme vim, supprimez le ${key[Up]}. Ensuite (en mode édition), tapez Ctrl + V suivi de la flèche vers le haut. Cela devrait insérer le code clé correct. Faites de même pour la flèche vers le bas.
robinst
J'ai utilisé cette méthode et cela fonctionne, mais j'ai perdu la possibilité de rechercher l'historique en écrivant la première partie d'une commande, puis Flèche haut. Il passe par toutes les commandes comme Bash, donc je dois contourner l'utilisation Ctrl+R.
Melebius
5

Vous pouvez configurer un widget zle spécial pour afficher uniquement les éléments de l'historique local:

function only-local-history () {
        zle set-local-history 1
        zle up-history
        zle set-local-history 0
}
zle -N only-local-history

En supposant que cela soit lié à up-line-or-history(je pense que c'est par défaut), vous pouvez lier ce widget à un autre coup de clé, comme CTRL+ :

 bindkey "^[Oa" only-local-history

Si cela fonctionne, cela dépend probablement de votre terminal. La ligne ci-dessus fonctionne URxvt/Screen. Avec xtermvous aurez besoin

 bindkey "^[[1;5A" only-local-history

pour CTRL+ .

Une autre variante pourrait être

function peek-history () {
        zle set-local-history
        zle up-history
        zle set-local-history
}
zle -N peek-history

ainsi, si vous avez activé l'historique local, vous pouvez jeter un œil à l'historique global ou vice versa.

mpy
la source
4

La réponse de @ lumbic n'a fonctionné pour moi qu'avec quelques modifications:

setopt share_history

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-history
    zle set-local-history 0
}
zle -N up-line-or-local-history
down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-history
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey '^[OA' up-line-or-history     # Cursor up
bindkey '^[OB' down-line-or-history   # Cursor down
bindkey '^[[1;5A' up-line-or-local-history    # [CTRL] + Cursor up
bindkey '^[[1;5B' down-line-or-local-history  # [CTRL] + Cursor down

Ce code définit l'historique global par défaut et utilise la flèche CTRL pour l'historique local.

Remarque: j'utilise zsh 5.0.2 avec oh-my-zsh.

arnuschky
la source
Cela ressemble à l'opposé de ce qu'OP a demandé - Ctrl+arrowspour l'histoire locale.
Melebius
1

J'ai essayé les options énumérées dans d'autres réponses ici, mais je n'étais pas satisfait avec elles. Les widgets 1 up-history ou up-line-or-historyn'incluent pas le début de la recherche et le widget 1 up-line-or-beginning-search semble ne pas fonctionner correctement lors de la modification des préférences d'historique local lors de son utilisation. 2

Je suis donc arrivé aux paramètres suivants. Il permet Ctrl+ les flèches pour parcourir l'historique global, Alt+ les flèches pour parcourir uniquement l'historique local (similaire à Bash) et les flèches autonomes pour utiliser la recherche de début intelligente (par défaut dans Oh My Zsh ).

up-line-or-local-history() {
    zle set-local-history 1
    zle up-line-or-search
    zle set-local-history 0
}
zle -N up-line-or-local-history

down-line-or-local-history() {
    zle set-local-history 1
    zle down-line-or-search
    zle set-local-history 0
}
zle -N down-line-or-local-history

bindkey "${key[Up]}" up-line-or-beginning-search
bindkey "${key[Down]}" down-line-or-beginning-search
bindkey "^[[1;5A" up-line-or-search    # [CTRL] + Cursor up
bindkey "^[[1;5B" down-line-or-search  # [CTRL] + Cursor down
bindkey "^[[1;3A" up-line-or-local-history    # [ALT] + Cursor up
bindkey "^[[1;3B" down-line-or-local-history  # [ALT] + Cursor up

1 Leurs downhomologues sont également implicites.

2 Le début utilisé pour la recherche est redéfini après avoir modifié les préférences d'historique local, de sorte que toute la première commande trouvée est utilisée comme début à rechercher dans la deuxième recherche.

Melebius
la source
1

Sur la base des différentes réponses ici, j'ai pu faire une version condensée:

function up-line-or-history() {
    zle set-local-history 1
    zle .up-line-or-history
    zle set-local-history 0
}

function down-line-or-history() {
    zle set-local-history 1
    zle .down-line-or-history
    zle set-local-history 0
}

# Overwrite existing {up,down}-line-or-history widgets with the functions above.
zle -N up-line-or-history
zle -N down-line-or-history

Cette version remplacera les widgets existants up-line-or-historyet les down-line-or-historynouveaux widgets définis par l'utilisateur. Ce widget active l'historique local et appellera ensuite les widgets d' origine , qui sont disponibles sous les .noms préfixés. Voir la documentation du widget zle pour plus de détails.

Cela signifie que vous pouvez conserver les raccourcis clavier existants. Vous pouvez donc éviter d'avoir à comprendre quelle est la séquence d'échappement pour taper une flèche vers le haut dans votre terminal actuel.

Martin Geisler
la source
-1
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 "^[[A" up-line-or-beginning-search # Up
bindkey "^[[B" down-line-or-beginning-search # Down

La réponse ci-dessus a fonctionné pour moi.

Référence: https://coderwall.com/p/jpj_6q/zsh-better-history-searching-with-arrow-keys

maddy10
la source
Pourriez-vous expliquer en quoi cela distingue l'histoire locale et mondiale? À mon humble avis, votre code ne le fait pas du tout. De plus, cela semble être déjà défini dans Oh My Zsh .
Melebius