copier et coller zsh comme emacs


10

J'ai remarqué que zsh a beaucoup de choses que je vois dans emacs. Je peux faire une sélection avec ctrl + espace et sélectionner une région. Je peux faire des copies comme dans emacs tout en restant dans zsh. Dans emacs, je peux utiliser le presse-papiers de mon système (auparavant, avec une configuration supplémentaire nécessaire, mais cela fonctionne maintenant dans emacs). Dans zsh, je n'arrive pas à coller à partir de mon presse-papiers à l'aide de Cy et la copie de zsh sur mon tableau système a le même problème. Y a-t-il un moyen de contourner ceci?

Réponses:


11

Zsh a un presse-papiers intégré qui ne communique pas avec d'autres applications. Comme il est très scriptable, vous pouvez le faire communiquer avec quelques lignes de votre ~/.zshrc. Vous aurez besoin de xclip ou xsel . Voir Collage du presse-papiers vers le shell zsh ou bash compatible vi pour une preuve de concept en mode vi. Voici le code correspondant pour le mode emacs (vous voudrez probablement faire quelque chose de similaire aux autres kill-*widgets).

x-copy-region-as-kill () {
  zle copy-region-as-kill
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-copy-region-as-kill
x-kill-region () {
  zle kill-region
  print -rn $CUTBUFFER | xsel -i -b
}
zle -N x-kill-region
x-yank () {
  CUTBUFFER=$(xsel -o -b </dev/null)
  zle yank
}
zle -N x-yank
bindkey -e '\ew' x-copy-region-as-kill
bindkey -e '^W' x-kill-region
bindkey -e '^Y' x-yank

Cela utilise le presse-papiers X11 (généralement accessible avec Ctrl+ C/ Ctrl+ V); supprimer l' -boption d'utiliser la sélection principale X11 à la place (copie automatique lors de la sélection et coller avec le bouton central de la souris).


Si vous utilisez le mode vi, remplacez simplement kill-regionpar vi-deleteet yankavec vi-put-afteretc. De même envelopper vi-yank, et d' autres. (Je n'ai pas trouvé de moyen de le faire de manière plus centralisée)
olejorgenb

4

J'avais voulu intégrer le tampon de coupe de Zsh au presse-papiers X. J'ai essayé ce qui précède http://stchaz.free.fr/mouse.zsh mais j'ai trouvé que je n'aimais pas que toutes mes opérations Zsh remplissent le presse-papiers. Par exemple, parfois je copiais quelque chose dans un navigateur, puis j'allais dans un shell et éditais la ligne de commande, puis je collais. Mais souvent, l'édition de la ligne de commande - la suppression d'un mot, par exemple - modifie le tampon de coupe Zsh. Pour le meilleur ou pour le pire, X a juste un presse-papiers, pas un kill ring, donc quand une opération d'édition Zsh écrase le presse-papiers, la chose que je voulais coller est perdue - je ne peux pas le tirer (Cy My) comme je le pouvais faire dans Zsh ou Emacs.

Donc, ce que j'ai fait à la place, c'est créer de nouvelles liaisons de touches spéciales pour interagir avec le presse-papiers X via zsh. Il s'avère que "^ Xw" et "^ Xy" ne sont pas utilisés dans Emacs et Zsh, donc je peux obtenir une interface cohérente en les liant dans les deux applications. De cette façon, les opérations d'édition normales, le cutbuffer et le kill ring sont laissés seuls. Si je veux copier quelque chose dans le presse-papiers, je définis la région et je fais "^ Xw" (ou si je l'ai déjà tué et que la région est inactive, je peux simplement faire "^ Xw" pour copier le tampon de coupe). Le collage à partir du presse-papiers se fait avec "^ Xy".

# define commands to copy and paste x clipboard

# ^Xw - copy region, or cut buffer
# ^Xy - paste x clipboard

# in both cases, modifies CUTBUFFER

copy-to-xclip() {
    [[ "$REGION_ACTIVE" -ne 0 ]] && zle copy-region-as-kill
    print -rn -- $CUTBUFFER | xclip -selection clipboard -i
}

zle -N copy-to-xclip
bindkey "^Xw" copy-to-xclip

paste-xclip() {
    killring=("$CUTBUFFER" "${(@)killring[1,-2]}")
    CUTBUFFER=$(xclip -selection clipboard -o)
    zle yank
}

zle -N paste-xclip
bindkey "^Xy" paste-xclip

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.