web-dev-qa-db-fra.com

Traitement du texte du presse-papiers via un script entre copier et coller

Je veux intercepter l'événement Coller et exécuter n'importe quel texte dans mon script. Le cas d'utilisation est le suivant (supposons que j'ai un script quelque part qui accepte le texte sur stdin et transforme "monde" en "pomme de terre", écrivant sur stdout).

  1. Mettez en surbrillance du texte 'Bonjour tout le monde!' avec le curseur
  2. Cliquez avec le bouton central de la souris pour coller dans le tampon de sélection, puis "hello Potato! apparaît

Il ne devrait y avoir aucune étape manuelle entre 1 et 2, c’est-à-dire que je veux un crochet sur l’événement de collage (ou peut-être sur l’événement de copie) afin que le texte soit traité automatiquement. Je n'ai rien de malin en tête; il s’agit simplement de formater automatiquement du code source lors du copier/coller depuis/vers le Web.

Ma question concerne le tampon de sélection (presse-papiers du milieu de la souris), mais je suppose que la question s’applique aussi au texte des autres presse-papiers en général.

5
wim

Vous pouvez utiliser la fonction Bash suivante. Copiez-le dans votre _~/.bashrc_ et sourcez-le sous la forme _. ~/.bashrc_ à partir d'un terminal.

_cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
}
_

Usage

  • Mettez en surbrillance n'importe quel texte en le sélectionnant avec la souris. Comme d'habitude, le texte sélectionné peut être collé en utilisant le clic du milieu de la souris.
  • Run in terminal:

    _$ cngstr "string" "replacement"
    _
  • Ensuite, lorsque vous collez en utilisant le clic du milieu, les mots "chaîne" de votre sélection seront remplacés par "remplacement".

Exemple

Dites que votre sélection est "bonjour le monde!". Ensuite, vous courez dans le terminal,

_cngstr world potato
_

Utilisez _""_ pour une chaîne composée de plusieurs mots . Ensuite, lorsque vous collez à l’aide du clip central de la souris, "hello patato!" apparaîtra. Voir les captures d'écran.

Enter image description here

Comment ça fonctionne

  1. _xclip -o_ imprime la sélection sur la sortie standard qui est acheminée vers sed ici.
  2. Next sed remplace les chaînes en prenant une entrée de l'utilisateur.
  3. Enfin, le contenu modifié est passé à xclip qui le met dans la sélection primaire et devient disponible pour le collage par un clic du milieu.

Je pense que xclip est fourni avec la distribution Ubuntu par défaut. Sinon, installez-le avec _apt-get_:

_Sudo apt-get install xclip
_

Informations supplémentaires

Rend le contenu modifié disponible dans le presse-papier également

Si vous souhaitez que le contenu modifié soit également disponible dans le presse-papiers, de sorte que Ctrl+V fonctionne également, ajoutez la ligne suivante dans le script ci-dessus.

_echo `xclip -o` | xclip -selection c
_

La ligne ci-dessus transmettra le contenu de la sélection primaire au presse-papiers. La fonction modifiée ressemblera à:

_cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}
_

Fonction Bash pouvant modifier le contenu du presse-papiers (c'est-à-dire copiée à l'aide de Ctrl+C ou dans le menu contextuel) et rendre la chaîne modifiée disponible pour la sélection primaire ainsi que pour le presse-papiers.

_cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}
_

_xclip -o_ imprime le contenu de la sélection principale par défaut. Utilisez _-selection c_ pour imprimer le contenu du presse-papiers. Voir man xclip pour plus d'informations.


Vous pouvez combiner ces deux fonctions dans un script en utilisant un cas de commutation,

_#!/bin/sh
string="$2"
replacement="$3"

cngstr(){
    echo `xclip -o` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

cngstr1(){
    echo `xclip -o -selection c` | sed -e "s#$1#$2#g" | xclip
    echo `xclip -o` | xclip -selection c
}

if [ $# -lt 2 ]
then
    echo "Usage : $0 [c|p] \"string\" \"replacement\" "
    exit
fi

case "$1" in

    c)  cngstr1 "$string" "$replacement"
        ;;
    p)  cngstr "$string" "$replacement"
        ;;
    *) echo "Usage : $0 [c|p] \"string\" \"replacement\" "
        ;;
esac
_

Utilisation

_./script.sh [c|p] "string" "replacement"
_
  • Utilisez l'option c pour modifier le contenu copié à l'aide du presse-papiers, c'est-à-dire le contenu copié à l'aide de Ctrl+C ou dans le menu contextuel.

  • Utilisez l'option p pour modifier le contenu copié à l'aide de la sélection principale.

3
souravc