J'ai un fichier assez volumineux, je dois copier le contenu entier 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 ajouter 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):
Ajouter les données à la fin du presse-papiers et les mettre dans un RETURN avant (comme dans l'exemple ci-dessus).
Ajouter les données à la fin du presse-papiers mais les avoir pour qu’il n’y ait pas RETURN avant pour qu'il continue sur la même ligne au départ.
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 pour empêcher la double ajout du même contenu. Si vous ne le souhaitez pas, supprimez le ; xsel -c
de la fin de chaque commande.
Explication longue:
Vous devez savoir que X contient 3 tampons, la sélection primaire, la sélection secondaire et le presse-papiers.
Vous connaissez le presse-papiers de Ctrl+C, Ctrl+V etc. C'est le tampon que vous utilisez normalement pour copier et coller des choses.
La sélection principale est cependant 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 ajouter directement des données au contenu actuel du presse-papiers (sans saut de ligne entre les positions) au lieu de les remplacer, nous utilisons l'option -a
à la place de -i
. Cette commande ajoutera 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 ajouter au début au lieu de la fin.
Si vous voulez éviter d’ajouter deux fois accidentellement les mêmes données au Presse-papiers (vous devrez les sélectionner à nouveau si vous voulez les ajouter deux fois!), Vous pouvez effacer le tampon de sélection primaire manuellement après l’exécution de la commande:
xsel -c
Exécutez-le simplement 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 utilisent énormément les 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:
Vous pouvez également utiliser cette idée dans un script connecté à un raccourci clavier. En fait, j'ai écrit un script qui est affiché comme github Gist
L'idée de base est de le lier au raccourci clavier. Mettez en surbrillance ce que vous voulez ajouter, puis appuyez sur le raccourci. Par exemple, j'ai lié le mien à Ctrl+Alt+V . La commande exacte est python /path/to/file.py
I have a rather large file
de votre message et copiez-la avec Ctrl + CThat is so that I can have a keyboard shortcut
I have a rather large fileThat is so that I can have a keyboard shortcut
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)
xclip
doit être installé via Sudo apt-get install xclip
sed
et le style re
de python) pour ajouter une chaîne répétée au presse-papiers. Par exemple, si vous devez fréquemment ajouter la même chaîne plusieurs fois, vous pouvez utiliser les expressions pythonsuivantes _ re
regex:Voici une autre méthode très simple qui utilise un court script Bash. Assurez-vous d’abord 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 ceci par Paramètres du système >> Clavier et cliquez sur l'onglet Raccourcis. Cliquez sur Raccourcis personnalisés, puis sur le signe + pour ajouter 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 uniquement NON), puis appuyez sur la touche de raccourci (ATL + 3). Cela ajoutera 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:
strings ~/.local/share/clipit/history
Il imprimera l’historique du presse-papiers séparé par \n
.