Je cherche un gestionnaire de presse-papiers avec une fonctionnalité de recherche. J'adore CtrlR dans le shell bash
et aimerait avoir la même fonctionnalité que celle du gestionnaire de Presse-papiers pour mon bureau.
Jusqu'à présent, j'utilisais diodon
, mais cette fonctionnalité n'existe pas dans diodon
. Voir la question connexe ici https://answers.launchpad.net/diodon/+question/403507
Cas d'utilisation:
Avec diodon
je reçois une longue liste des derniers matchs, c'est bien, mais pas parfait.
Comme indiqué dans les commentaires, j'ai écrit un simple indicateur de gestionnaire de presse-papiers avec l'utilisation de Python 3 et de quelques dialogues zenity
, qui permettent de manipuler le contenu du presse-papiers, ainsi que la fonctionnalité de recherche.
La fonctionnalité de recherche, en particulier, utilise le module re
de Python, ce qui signifie que vous pouvez utiliser des expressions rationnelles pour une recherche plus fine. Chaque entrée de texte a 4 options dans son sous-menu: insérer du texte dans le presse-papiers, ajouter du texte à la fin de ce qui est actuellement dans cliboard, ajouter du texte au début du contenu actuel et le supprimer de l'historique.
En terminal, lancez les commandes suivantes:
Sudo add-apt-repository ppa:1047481448-2/sergkolo
Sudo apt-get update
Sudo apt-get install indicator-bulletin
Dans l'animation ci-dessous, vous pouvez voir une démonstration du texte en cours de copie, le presse-papiers ajouté avec l'indicateur, et enfin la chaîne de test est recherchée via une simple boîte de dialogue de recherche. Le contenu trouvé est affiché dans une simple boîte de dialogue d'affichage de texte avec un horodatage dans les paramètres régionaux de l'utilisateur (s'il est défini). Le texte trouvé peut ensuite être copié en sélectionnant du texte et en utilisant des Ctrl+C raccourci.
Au cas où quelqu'un se demanderait:
L’indicateur a été créé en un jour, il est donc plutôt minimaliste à l’heure actuelle. À l'avenir, des fonctionnalités supplémentaires seront ajoutées, telles que la boîte de dialogue des préférences. La longueur du menu et la largeur du texte sont actuellement codées en dur: 10 éléments dans l'indicateur et 30 caractères maximum pour chaque entrée.
Si vous souhaitez faire une demande de fonctionnalité, veuillez soumettre un ticket de problème sur le projet page GitHub , où son code source est également disponible.
14 février 2017:
zenity
formulaires qui requiert une date de début et de fin au format YYYY/MM/DD/HH:SS
. Effectivement, c’est la lecture du journal dans la plage de dates, identique à this15 février 2017:
re
de python).17 février 2017:
bash
'fcedit
). Jusqu'ici, cela n'ouvre que les programmes par défaut définis pour le type de fichier en texte brut.19 février 2017:
3 mars 2017:
Avec la configuration ci-dessous, il est extrêmement facile de rechercher du texte récemment copié (chaînes de) et de le coller en un double-clic dans vos documents. La configuration n’est pas la plus simple de toutes (à l’heure actuelle), mais son utilisation est extrêmement simple.
Appuyez sur un raccourci, une petite fenêtre apparaît:
Tapez un ou plusieurs caractères pour limiter la sélection:
Double-cliquez sur la chaîne que vous souhaitez insérer:
La chaîne est collée dans votre document, la fenêtre se ferme:
La configuration comprend deux petits scripts
script 1; un script d'arrière-plan pour surveiller les modifications dans le presse-papiers
import time
import pyperclip
import os
# set the minimum length of a string to be listed
minlength = 3
# set the number of recently copied strings to be remembered
size = 500
clipdb = os.path.join(os.environ["HOME"], ".wordlist")
def update_words(words):
try:
currwords = open(clipdb).read().splitlines()
except FileNotFoundError:
currwords = []
add = list(set(words.split()))
newwords = [s for s in add+currwords if len(s) >= minlength][:size]
open(clipdb, "wt").write("\n".join(newwords))
clp1 = ""
while True:
time.sleep(0.2)
clp2 = pyperclip.paste()
if clp2 != clp1:
update_words(clp2)
clp1 = clp2
script 2; appeler depuis une touche de raccourci
#!/usr/bin/env python3
import subprocess
import os
import sys
from tkinter import*
from operator import itemgetter
import pyperclip
import time
def sortlist(l):
low = sorted(list(enumerate([s.lower() for s in set(l)])), key=itemgetter(1))
return [l[i] for i in [item[0] for item in low]]
def limit(*args):
listbox.delete(0, END)
for w in [s for s in show if s.lower().startswith(insert.get())]:
listbox.insert(END, w)
def getpaste(*args):
test = listbox.get(ACTIVE)
pyperclip.copy(test)
master.destroy()
subprocess.Popen(["xdotool", "key", "Control_L+v"])
clipdb = os.path.join(os.environ["HOME"], ".wordlist")
try:
currwords = open(clipdb).read().splitlines()
except FileNotFoundError:
pass
else:
show = sortlist(currwords)
master = Tk()
master.resizable(False, False)
master.title("Insert")
listbox = Listbox(
master,
highlightbackground = "white",
highlightthickness=0,
highlightcolor="blue",
relief=FLAT,
)
listbox.bind(
"<Double-Button-1>",
getpaste,
)
listbox.pack()
insert = Entry(
master,
highlightbackground = "white",
highlightthickness=1,
highlightcolor="#C8C8C8",
relief=FLAT,
)
insert.pack()
insert.bind("<KeyRelease>", limit)
insert.focus_set()
for item in show:
listbox.insert(END, item)
mainloop()
Comment configurer
Le script a besoin de python3-pyperclip
, python3-tkinter
et xdotool
:
Sudo apt-get install xdotool python3-pyperclip python3-tkinter
watch_clipboard.py
paste_recent.py
(Test-) exécuter le script 1 en tant que script d'arrière-plan avec la commande:
python3 /path/to/watch_clipboard.py
Commencez à copier tekst, qui est automatiquement rappelé (jusqu’à un nombre arbitraire de chaînes, en mémorisant les dernières chaînes).
Ajoutez le script 2 à un raccourci: choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Raccourcis personnalisés". Cliquez sur le "+" et ajoutez la commande:
python3 /path/to/paste_recent.py
Ouvrez une fenêtre gedit
et appelez la petite fenêtre avec votre raccourci, puis utilisez l’utilitaire comme expliqué dans l’introduction.
Si tout fonctionne correctement, ajoutez le script 1 dans Applications de démarrage: Tableau de bord> Applications de démarrage> Ajouter. Ajoutez la commande:
python3 /path/to/watch_clipboard.py
Dans la section head du script, vous pouvez définir la longueur minimale d'une chaîne à répertorier dans l'historique du presse-papiers (nombre de caractères):
minlength = 1
En outre, vous pouvez définir le nombre de chaînes à conserver dans l'historique (taille de la base de données):
size = 500
gnome-terminal
.#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3
from threading import Thread
import pyperclip
import sys
from tkinter import*
from operator import itemgetter
#---
clipdb = os.path.join(os.environ["HOME"], ".wordlist")
minlength = 5
size = 500
arg = sys.argv[1]
pyperclip.copy("")
def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip()
def check_terminal():
return get(["xdotool", "getwindowfocus"]) in get(["xdotool", "search", "--class", "terminal"])
def getfromfile():
try:
return open(clipdb).read().splitlines()
except FileNotFoundError:
return []
def update_words(words):
currwords = getfromfile()
add = list(set(words.split()))
newwords = [s for s in add+currwords if len(s) >= minlength][:size]
open(clipdb, "wt").write("\n".join(newwords))
class SearchClip():
def __init__(self):
self.currwords = list(set(getfromfile()))
self.showwin()
def sortlist(self, l):
low = sorted(list(enumerate([s.lower() for s in set(l)])), key=itemgetter(1))
return [l[i] for i in [item[0] for item in low]]
def limit(self, *args):
self.listbox.delete(0, END)
for w in [s for s in self.show if s.lower().startswith(self.insert.get())]:
self.listbox.insert(END, w)
def getpaste(self, *args):
test = self.listbox.get(ACTIVE)
pyperclip.copy(test)
self.master.destroy()
time.sleep(0.2)
cmd = ["xdotool", "key", "Control_L+Shift+v"] if\
check_terminal() else ["xdotool", "key", "Control_L+v"]
subprocess.Popen(cmd)
def showwin(self):
self.show = self.sortlist(self.currwords)
self.master = Tk()
self.master.resizable(False, False)
self.master.title("Insert")
self.listbox = Listbox(
self.master,
highlightbackground = "white",
highlightthickness=0,
highlightcolor="blue",
relief=FLAT,
)
self.listbox.bind(
"<Double-Button-1>",
self.getpaste,
)
self.listbox.pack()
self.insert = Entry(
self.master,
highlightbackground = "white",
highlightthickness=1,
highlightcolor="#C8C8C8",
relief=FLAT,
)
self.insert.pack()
self.insert.bind("<KeyRelease>", self.limit)
self.insert.focus_set()
for item in self.show:
self.listbox.insert(END, item)
mainloop()
class ClipTrip():
def __init__(self):
self.app = "ClipTrip"
iconpath = "mail-attachment"
self.indicator = AppIndicator3.Indicator.new(
self.app, iconpath,
AppIndicator3.IndicatorCategory.OTHER)
self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
self.indicator.set_menu(self.create_menu())
self.watchclip = Thread(target=self.clipwatch)
self.watchclip.setDaemon(True)
self.watchclip.start()
def clipwatch(self):
clp1 = ""
while True:
time.sleep(0.2)
clp2 = pyperclip.paste()
if clp2 != clp1:
update_words(clp2)
clp1 = clp2
def create_menu(self):
self.menu = Gtk.Menu()
self.item_search = Gtk.MenuItem('Search clipboard history')
self.item_search.connect('activate', run_search)
self.menu.append(self.item_search)
menu_sep = Gtk.SeparatorMenuItem()
self.menu.append(menu_sep)
self.item_quit = Gtk.MenuItem('Quit')
self.item_quit.connect('activate', self.stop)
self.menu.append(self.item_quit)
self.menu.show_all()
return self.menu
def stop(self, source):
Gtk.main_quit()
def run_search(*args):
SearchClip()
if arg == "run":
ClipTrip()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
Elif arg == "search":
run_search()
Cette version a à peu près les mêmes fonctionnalités que les scripts de [1]
, mais en tant qu'indicateur et plus simple à configurer:
Comme dans l'option 1, le script a besoin de python3-pyperclip
, python3-tkinter
et xdotool
:
Sudo apt-get install xdotool python3-pyperclip python3-tkinter
Copiez le script dans un fichier vide, enregistrez-le sous le nom history_indicator.py
Exécutez-le à l'aide de la commande:
python3 /path/to/history_indicator.py run
pour démarrer l'indicateur + le script d'arrière-plan. Choisir Search clipboard history depuis le menu pour appeler la petite fenêtre.
o
Pour appeler la fenêtre autrement, lancez
python3 /path/to/history_indicator.py search
À partir de cela ( Clipboard Manager for Ubuntu 16.04 ), nous apprenons des utilisateurs:
À partir de cela ( buntu 14.04 Clipboard Manager? ), nous apprenons des utilisateurs:
Pour ne pas se laisser distancer par les utilisateurs Ubuntu, ce ( tecmint.com - 10 meilleurs gestionnaires de presse-papiers pour Linux ) recommande:
Il existe d'autres critiques des mêmes packages énumérés ci-dessus, trouvées dans ( makeuseof.com - 6 outils permettant de gérer le presse-papiers Linux ) et dans ( maketecheasier.com - Améliorer le presse-papiers Linux avec le gestionnaire de presse-papiers =).
En fin de journée, le forfait que vous choisissez est celui avec lequel vous êtes le plus à l'aise. Personne ne peut dire avec certitude quel sera le package. Presque tous offrent une histoire consultable comme vous le souhaitez, mais laquelle possède l'interface la mieux adaptée à votre façon de penser?
CopyQ est un gestionnaire de presse-papiers avancé et génial pour Linux. Il a des tonnes de fonctionnalités précieuses (y compris Ctrl-R comme la recherche).
Installer:
$ Sudo add-apt-repository ppa:hluk/copyq
$ Sudo apt update
$ Sudo apt install copyq
Et ajoutez un raccourci global pour l'insertion:
Icône de barre des tâches> Préférences> Onglet Raccourcis> Actions personnalisées et raccourcis globaux ..> Ajouter> Afficher/masquer la fenêtre principale
L'application unity-scope-diodon
le prend en charge.
Mais l'interface n'est pas la façon dont je l'aime:
Si je frappe super-b, mes yeux voient 12 * 7 = 84 fois la même grande icône, qui ne m'intéresse pas du tout.
Ce serait bien si Diodon lui-même soutenait cela.