Comment append uniquement au presse-papiers (sans écraser les données actuelles)?

J’ai un fichier assez volumineux, je dois copier tout le contenu quelque part, mais lorsque je fais défiler la page vers le bas, toutes les données que j’ai sélectionnées sont désélectionnées. Je pourrais simplement copier et coller bloc par bloc, mais je le trouverais beaucoup plus facile car il y a beaucoup de données, juste pour pouvoir append le contenu à la fin des données du presse-papier en cours. Est-ce possible?

C’est pour que je puisse avoir un raccourci clavier qui me permettra de le copier dans le presse-papier:

I am some nice new text. 

Quand c’est ce qui est déjà là:

 I am the old text. 

Et le faire ressembler à ceci quand collé:

 I am the old text. I am some nice new text. 

Donc il y a 3 choses que j’aimerais vraiment de ça (j’aurais 3 raccourcis clavier séparés pour le faire):

  1. Ajoutez les données à la fin du presse-papiers et faites-les précéder d' un RETOUR (comme dans l’exemple ci-dessus).

  2. Ajoute les données à la fin du presse-papiers, mais veillez à ce qu’il n’y ait pas de RETOUR devant lui pour qu’il continue sur la même ligne au départ.

  3. Avoir tout cela mais pour que les données soient placées au début du presse-papiers avant toutes les données qui y sont actuellement.

J’utilise Ubuntu GNOME 16.04 avec GNOME 3.20.

C’est simple, mais vous devez d’abord installer l’outil xsel :

 sudo apt-get install xsel 

TL; DR: Voici les commandes que vous voudrez probablement utiliser pour vos raccourcis à la fin. J’utilise les versions avec printf partout pour l’uniformité et une personnalisation plus facile, même si une variante plus simple aurait suffi:

  • Ajouter la sélection directement à la fin du presse-papiers:

     bash -c 'printf "%b%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c' 
  • Ajouter la sélection à la fin du presse-papiers après un saut de ligne:

     bash -c 'printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c' 
  • Ajouter la sélection au début du presse-papier directement:

     bash -c 'printf "%b%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c' 
  • Ajouter la sélection au début du presse-papiers après un saut de ligne:

     bash -c 'printf "%b\n%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c' 

Ils incluent tous la réinitialisation de la mémoire tampon principale après l’ajout au presse-papiers afin d’éviter une double ajout du même contenu. Si vous ne le souhaitez pas, supprimez le ; xsel -c ; xsel -c partir de la fin de chaque commande.


Longue explication:

Vous devez savoir que X contient 3 tampons, la sélection primaire , la sélection secondaire et le pressepapiers .

Vous connaissez le presse-papiers sous Ctrl + C , Ctrl + V, etc. C’est le tampon que vous utilisez normalement pour copier et coller des éléments.

La sélection principale est toutefois le tampon qui contient toujours automatiquement le texte que vous sélectionnez, quelle que soit la fenêtre dans laquelle il se trouve et sans aucune interaction utilisateur supplémentaire.
Nous avons juste un problème: le tampon est mis à jour dès que vous sélectionnez un extrait de texte, mais il n’est pas effacé lorsque vous cliquez n’importe où pour annuler la sélection. Il contiendra toujours le contenu de votre dernière sélection.

La sélection secondaire n’est utilisée que par peu de programmes et n’est pas intéressante pour nous ici.


Cela signifie que nous pouvons imiter le comportement de Ctrl + C avec cette commande ci-dessous, qui copie la sélection primaire (dernier texte mis en surbrillance) dans le presse-papiers:

 xsel | xsel -ib 

xsel sans aucun argument imprime le contenu de la sélection primaire dans STDOUT. xsel -ab écrit ( -i ) les données de STDIN dans le presse-papiers ( -b ).


Pour append directement des données au contenu actuel du presse-papiers (sans saut de ligne entre les deux) au lieu de les remplacer, nous utilisons l’option -a au lieu de -i . Cette commande appenda le dernier extrait de texte sélectionné au contenu actuel du presse-papiers:

 xsel | xsel -ab 

Si vous voulez vraiment un saut de ligne supplémentaire ou toute autre mise en forme, nous pouvons diriger les données via printf ou tout autre outil que vous souhaitez utiliser pour le traiter. Voici un exemple qui lit à la fois la dernière sélection et le contenu actuel du presse-papiers et les associe à l’aide d’une nouvelle ligne:

 printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib 

xsel -b renvoie le contenu actuel du presse-papiers. La chaîne de format de printf utilise %b comme espace réservé pour les arguments, \n représente un saut de ligne. Vous pouvez en savoir plus sur printf en tapant man printf .

En basculant les deux arguments à la fin de la chaîne, vous pouvez inverser leur ordre et append au début au lieu de la fin.


Si vous voulez éviter d’append deux fois accidentellement les mêmes données au Presse-papiers (vous devrez les sélectionner à nouveau si vous voulez les append deux fois!), Vous pouvez effacer manuellement le tampon de sélection primaire après l’exécution de la commande:

 xsel -c 

Exécutez simplement cela après la commande d’ajout de presse-papiers de base, comme ceci:

 printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c 

Sachant tout cela, vous pouvez écrire des commandes pour les raccourcis clavier qui font exactement ce que vous voulez, mais souvenez-vous que nos one-liners font tous un usage intensif des fonctionnalités de Bash, telles que la tuyauterie. Vous devez donc les exécuter avec Bash:

 bash -c 'COMMAND' 

Voir la section TL; DR en haut de la réponse pour une liste de commandes appropriée pour la création de raccourcis.

Le serveur X a plusieurs presse-papiers. Celui avec Ctrl + C est appelé presse-papiers, celui où vous mettez en surbrillance quelque chose est appelé primaire. xclip permet de coller la sortie de l’un ou l’autre. Par exemple, j’ai copié une partie de votre question, mais j’ai mis en évidence un autre texte dans Terminal:

entrez la description de l'image ici

Vous pouvez également utiliser cette idée dans un script connecté à un raccourci clavier. En fait, j’ai écrit un script, qui est posté comme github gist

L’idée de base est de le lier au raccourci clavier. Mettez en surbrillance ce que vous voulez append, puis appuyez sur le raccourci. Par exemple, j’ai lié le mien à Ctrl + Alt + V. La commande exacte est python /path/to/file.py

Exemple d’utilisation:

  1. Mettez en surbrillance la partie du I have a rather large file et copiez-la avec Ctrl + C
  2. Mettez en surbrillance quelque chose d’autre, par exemple That is so that I can have a keyboard shortcut
  3. Appuyez sur votre raccourci (le mien était Ctrl + Alt + V )
  4. Libérez le presse-papiers ajouté quelque part avec Ctrl + V. Le résultat I have a rather large fileThat is so that I can have a keyboard shortcut est: I have a rather large fileThat is so that I can have a keyboard shortcut

Source du script

  import gi gi.require_version('Notify', '0.7') from gi.repository import Notify import subprocess import os import sys # This script is meant to be bound to keyboard shortcut def send_notification(title, text): Notify.init(sys.argv[0]) n = Notify.Notification.new(title, text) n.show() def run_cmd(cmdlist): # function for running try: stdout = subprocess.check_output(cmdlist) except subprocess.CalledProcessError: send_notification(sys.argv[0],"Clipboard error") sys.exit(1) else: if stdout: return stdout # get contents of both clipboards clip = run_cmd("xclip -o -sel clip".split()) primary = run_cmd("xclip -o -sel primary".split()) # write to temp file contents # of both clipboards appended temp_file = "/tmp/append.clip" f = open(temp_file, "w") f.write( clip + primary ) f.close() # Read the new contents into clipboard run_cmd(("xclip -sel clip " + temp_file).split()) # clean up os.remove(temp_file) 

Remarques:

  • xclip doit être installé via sudo apt-get install xclip
  • J’ai écrit un indicateur de gestionnaire de presse – papiers pour Ubuntu avec le bureau Unity , qui peut utiliser des expressions régulières (style re de sed et python) pour append une chaîne répétée au presse-papiers. Par exemple, si vous devez fréquemment append la même chaîne à plusieurs resockets, vous pouvez utiliser le re rex re Python suivant:

entrez la description de l'image ici

Voici une autre méthode très simple qui utilise un court script Bash. Tout d’abord, assurez-vous que xclip est installé. Ensuite, créez votre script bash comme suit:

 #!bin/bash p=$(xclip -selection primary -o) c=$(xclip -selection clipboard -o) new=$'\n' echo "$c$new$p" | xclip -selection clip 

Appelons ce fichier apndpc.sh et plaçons-le dans un dossier, par exemple ~ / myscripts. Associez-le à une clé définie par l’utilisateur. Faites-le par Paramètres système >> Clavier et cliquez sur l’onglet Raccourcis. Cliquez sur Raccourcis personnalisés, puis sur le signe + pour append la combinaison de touches souhaitée. Dans la boîte de commande, mettez:

bash -c ‘bash ~ / myscripts / apndclp.sh’

Définissez ensuite votre combinaison de touches. J’utilise ALT + 3 pour déclencher l’action.

C’est ça. Vous êtes prêt pour votre opération de copie à grande échelle. Utilisez la combinaison normale de touches Ctrl + c (ou un clic droit et sélectionnez Copier) pour copier le premier bloc de texte. Sélectionnez le morceau suivant (sélectionnez seulement NON), puis appuyez sur la touche de raccourci (ATL + 3). Ceci appenda le texte sélectionné au presse-papiers. Continuez comme ça jusqu’à ce que vous ayez fini. Puis collez comme d’habitude, c’est à dire. CTRL + v (ou cliquez et choisissez coller) pour vider le texte final accumulé.

Si vous n’aimez pas la manipulation de chaîne dans le script ci-dessus, utilisez plutôt ce script:

 #!bin/bash # this is another version of clipboard append tool # here we use a temporary file to append highlighted text to the clipboard # the temporary file is deleted at the end of the operation tmpfile="file111000111" xclip -selection clipboard -o > $tmpfile # first dump the current clipboard to the tmpfile printf '\n' >> $tmpfile # then add new line xclip -selection primary -o >> $tmpfile # and finally add the highlighted text cat $tmpfile | xclip -selection clip # now read the file back into the clipboard rm $tmpfile # and remove the tempfile 

J’utilise un gestionnaire de presse-papiers appelé clipit.

Ensuite, chaque fois que je veux voir les dernières choses sur le clavier, je le fais sur console:

 ssortingngs ~/.local/share/clipit/history 

Il imprimera l’historique du presse-papiers séparé par \n .