Question Puis-je obtenir un retour visuel de la copie avec Ctrl + C?


Beaucoup de fois je dois Ctrl+C (ou Ctrl+Insérer) plusieurs fois pour copier quelque chose. J'apprécierais un retour visuel qui dit "une nouvelle chose a été copiée" ou quelque chose comme ça. Y a-t-il une façon d'ajouter ceci à Ubuntu?


6
2017-09-30 20:58


origine


Vous pourriez peut-être mettre en place un raccourci clavier qui ne capture pas la combinaison de touches, envoie simplement une notification en utilisant notify-send (de libnotify-bin). - wjandrea
@ marko Je ne sais pas pourquoi vous avez supprimé votre réponse. Je l'ai signalé à l'attention du modérateur en demandant qu'il soit supprimé. - Elder Geek


Réponses:


J'ai adapté mon script pour réagir aux changements de presse-papiers depuis ici de sorte qu'il affiche une bulle de notification native lorsque vous copiez quelque chose:

enter image description here

#!/usr/bin/env python3

# Configuration:
APPNAME = "Clipboard Notifier"  # an arbitrary application name
TITLE = "Clipboard modified"    # the bold headline of each notification
ICON = "edit-paste"             # name of the icon to show
MAXLENGTH = 100                 # maximum message length

# Imports:
import gi
import signal
import notify2
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

# Set up signal handler for killing the script with Ctrl+C from terminal:
signal.signal(signal.SIGINT, signal.SIG_DFL)

# Initialize the notifications library:
notify2.init(APPNAME)

# Callback function to handle clipboard modification events:
def callback(*args):
    # Get new clipboard content:
    text = clip.wait_for_text()
    # Truncate long content to avoid huge notification bubbles:
    body = text if len(text) < MAXLENGTH else text[:MAXLENGTH] + "..."
    # Create and show notification bubble:
    notify2.Notification(TITLE, body, ICON).show()

# Set up clipboard and register callback for change events
clip = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
clip.connect("owner-change", callback)

# Start Gtk main loop and wait for events:
Gtk.main()

Enregistrez cela quelque part (par exemple, comme /usr/local/bin/clipboard-notifier - vous avez besoin sudo être autorisé à écrire à cet endroit bien, sinon mettez-le dans ~/bin) et le rendre exécutable en utilisant la commande chmod +x FILENAME.

Mon script utilise le package Python 3 notify2 pour afficher les bulles de notification natives. Ce paquet n'est normalement pas installé par défaut, vous devez d'abord l'ajouter avec la commande ci-dessous:

sudo apt install python3-notify2

Si vous le souhaitez, vous pouvez modifier les valeurs des variables capitalisées au début du script en fonction de vos besoins, en particulier TITLE et MAXLENGTH peut être utile de changer.

Alors simplement l'ajouter à vos applications de démarrage et il se lancera automatiquement lorsque vous vous connecterez la prochaine fois. Vous pouvez également lancer le script manuellement à partir, par exemple, de la Alt+F2 HUD dans l'unité.


5
2017-09-30 22:51



Je semble manquer une exigence. ImportError: Aucun module nommé 'notify2' - Elder Geek
@ElderGeek Oui, j'ai juste remarqué que j'ai oublié d'écrire que vous devez sudo apt install python3-notify2 premier. Ajout de cela maintenant, merci de faire attention. - Byte Commander
Cela a fait l'affaire. ;-) - Elder Geek


J'ai créé une solution plus standard utilisant le script bash uniquement sans bibliothèques supplémentaires:

Voici comment je l'ai fait:

Créez un fichier appelé: clp-notify et le rendre exécutable.

Enregistrez le fichier dans: /home/$USER/add-ons/scripts/clp-notify

#!/bin/bash

echo "Script $0 started..."
notify-send -u normal -t 3000 -i info 'Script Started!' $0

clip_command="xclip -selection clipboard -o"
current_value=`$clip_command`

while true
do
   new_value=`$clip_command`

   if [[ ! ("$current_value" == "$new_value") ]];
   then      
      echo 'Clipboard Modified...'
      notify-send -u normal -t 3000 -i info 'Clipboard Modified!' 'Your clipboard has been modified.'

      current_value=$new_value
   else
      echo "Polliing..."
   fi

   sleep 1.5
done

Ensuite, j'ai créé un deuxième fichier appelé start-clipboard-polling qui invoque le script ci-dessus et c'est ce second fichier qui est ajouté au démarrage:

#!/bin/bash

script_path=/home/$USER/add-ons/scripts/clp-notify

function IsClipboardPollingRunning
{
   if (ps -A | grep -q "clp-notify")
   then
      return 1;
   else
      return 0;        
   fi
}

if (IsClipboardPollingRunning == 0)
then
   echo "Starting $script_path"   
   nohup $script_path &
else
   echo "$script_path is already running"
   notify-send -u normal -t 3000 -i info 'Clipboard Notify' "$script_path is already running."
fi

Le but de ce deuxième fichier est d'empêcher l'original clp-notify de commencer plusieurs fois parce que le clp-notify le script continuera à s'exécuter même si vous vous déconnectez et que vous redémarrez le serveur X.

Ensuite, vous devez ajouter ceci start-clipboard-polling à vos applications de démarrage.

Il n'y a qu'un problème avec cela. Bien que le deuxième script prenne en charge la prévention clp-notify de démarrer plusieurs fois lorsque vous vous déconnectez et que vous vous connectez (car l'instance d'origine est toujours en cours d'exécution à partir de la session précédente), la condition suivante échoue lors de la deuxième connexion:

if [[ ! ("$current_value" == "$new_value") ]];

et cela signifie que les notifications ne fonctionneront pas. Le travail autour de cela est de terminer l'instance originale de l'intérieur start-clipboard-polling et redémarrer clp-notify comme une nouvelle instance et c'est tout et alors vous pouvez supprimer la section qui vérifie si clp-notify est en cours d'exécution mais je ne veux pas utiliser le travail autour, je suis plus intéressé par pourquoi il échoue.

Sinon, il continuera à fonctionner correctement jusqu'à ce que vous vous déconnectiez.

BTW, vous devez:

sudo apt install xclip

3
2017-10-01 01:29



Tel que mis en œuvre, IsClipboardPollingRunning devrait être appelé IsClipboardPollingNotRunning, car dans les scripts shell (contrairement à la plupart des programmes) 1 signifie faux et 0 signifie vrai. Code comme if (IsClipboardPollingRunning == 0) dans bash est un bogue - il le fait ne pas comparer quoi que ce soit à 0 - et dans ce cas, ce bogue arrive à annuler le bogue dans IsClipboardPollingRunning. Quelle if (IsClipboardPollingRunning == 0) est d'utiliser un sous-shell ((  )) appeler IsClipboardPollingRunning et passer deux arguments, == et 0, qui sont ignorés. Dans ce script, if IsClipboardPollingRunning a le même effet. - Eliah Kagan
J'ai essayé votre script original quand il existait le 30 septembre 21:27. et l'a déposé dans mon répertoire ~ / bin, rendu exécutable. et testé. Certes c'est une boucle infinie, mais ça a fonctionné pour moi. Je n'ai pas tenté de me déconnecter car ce n'était pas quelque chose que je voulais personnellement automatiser. Il a notifié comme prévu la modification du presse-papiers. Je n'ai pas testé votre deuxième script. Vous pourriez trouver cette Q & R intéressante sur les variables basol boolean. stackoverflow.com/questions/2953646/… - Elder Geek
Merci, comme je l'ai dit, vous pouvez toujours terminer tous les processus clp-notify à partir du deuxième script (qui commencerait au démarrage) et simplement invoquer à nouveau le premier script pour résoudre le problème (il a déjà été testé). J'ai laissé l'ancienne version du script ici juste pour d'autres personnes pour voir comment je l'avais à l'origine. - marko