web-dev-qa-db-fra.com

Gestionnaire de presse-papiers interrogeable, comme ctrl-r dans bash

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:

  • Je copie + collé "internationalisation" avant.
  • Je tape le texte suivant.
  • Je veux insérer "internationalisation" à nouveau.
  • Je frappe un coup de clé magique. Puis "inter" et ensuite je veux voir une liste de toutes les chaînes que j'ai copiées et collées au cours des derniers jours.
  • Je choisis celui que je veux. Terminé.

Avec diodon je reçois une longue liste des derniers matchs, c'est bien, mais pas parfait.

7
guettli

Introduction

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.

Installation

En terminal, lancez les commandes suivantes:

Sudo add-apt-repository ppa:1047481448-2/sergkolo
Sudo apt-get update
Sudo apt-get install indicator-bulletin

Démo

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. enter image description here

Au cas où quelqu'un se demanderait:

  • l'animation est faite avec silentcast app
  • thème de bureau et d'icônes sont le thème Ubuntu Kylin, version 16.04
  • Oui, c'est Ubuntu (16.04) avec lanceur en bas .

La poursuite du développement

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.

Mises à jour:

14 février 2017:

  • Fonctionnalité de fichiers implémentée - chargement d'un fichier texte dans le presse-papiers et écriture du contenu du presse-papiers dans un fichier.
  • Implémenté en affichant la plage d'entrées par date. L'option appelle la boîte de dialogue 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 à this
  • quelques corrections de bugs

15 février 2017:

  • Ajout du sous-menu d'édition. Les utilisateurs peuvent maintenant convertir le contenu du presse-papiers en majuscules/minuscules, couper les mots/caractères au début ou à la fin du texte et remplacer les expressions (utilise la syntaxe re de python).

17 février 2017:

  • Ajout d'une option pour ouvrir un élément d'historique dans un fichier texte (similaire à bash 'fcedit). Jusqu'ici, cela n'ouvre que les programmes par défaut définis pour le type de fichier en texte brut.
  • quelques améliorations et corrections de bugs.

19 février 2017:

  • Ajout des opérations base64 (encodage/décodage).

3 mars 2017:

  • Ajout du "sous-menu épinglé" et possibilité de "épingler" des éléments spécifiques de l'historique du presse-papiers. Code refactored, certaines parties réécrites pour une utilisation répétée.
5
Sergiy Kolodyazhnyy

1. Utilitaire de presse-papiers minimaliste pour rechercher rapidement l’historique du presse-papiers (mis à jour dynamiquement)

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.

Comment ça marche en pratique

  1. Appuyez sur un raccourci, une petite fenêtre apparaît:

    enter image description here

  2. Tapez un ou plusieurs caractères pour limiter la sélection:

    enter image description here

  3. Double-cliquez sur la chaîne que vous souhaitez insérer:

    enter image description here

  4. La chaîne est collée dans votre document, la fenêtre se ferme:

    enter image description here

Installer

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

  1. Le script a besoin de python3-pyperclip, python3-tkinter et xdotool:

    Sudo apt-get install xdotool python3-pyperclip python3-tkinter
    
  2. Copiez le script 1 dans un fichier vide, enregistrez-le sous le nom watch_clipboard.py
  3. Copiez le script 2 dans un fichier vide, enregistrez-le sous le nom paste_recent.py
  4. (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).

  5. 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.

  6. 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
    

Les options

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

Remarques

  • Actuellement, l'utilitaire fonctionne avec toutes les applications compatibles avec Ctrl+Alt+V. La version ci-dessous est également collée dans gnome-terminal.

2. Version de l'indicateur (script unique, configuration simple) avec facultatif raccourci clavier, également collé correctement dans gnome-terminal

enter image description here

#!/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()

Installer

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:

  1. 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
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom history_indicator.py

  3. 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
    
4
Jacob Vlijm

Recommandations de Ask Ubuntu

À partir de cela ( Clipboard Manager for Ubuntu 16.04 ), nous apprenons des utilisateurs:

  • Clipit est le meilleur parmi tous.
  • CopyQ est un gestionnaire de presse-papiers multiplate-forme, bien conçu et complet (mon préféré). Il comporte entre autres une interface de ligne de commande (très pratique).

À partir de cela ( buntu 14.04 Clipboard Manager? ), nous apprenons des utilisateurs:

  • Glipper est un gestionnaire de presse-papiers, il peut être installé à partir du Centre de logiciel.
  • J'utilise ClipIt est un fork de Parcelite avec intégration de menus Ubuntu. (Ce paquet a été listé dans la première section ci-dessus)
  • J'utilise GPaste
  • Vous pouvez essayer Keepboard . Il est facile à utiliser et semble stable et fiable.
  • Diodon est une autre bonne option disponible pour GTK et Unity. Fonctionne un peu comme les autres dans les réponses déjà données. Cependant, vous pouvez rechercher vos "clips" récents à l'aide de Dash. (Vous utilisez déjà cette version et ne l'aimez pas.)
  • J'utilise Clippy , un docklet qui fonctionne avec Plank (je n'utilise pas Unity). Je pense que Clippy vient aussi avec Docky.

Recommandations hors de Ask Ubuntu

Pour ne pas se laisser distancer par les utilisateurs Ubuntu, ce ( tecmint.com - 10 meilleurs gestionnaires de presse-papiers pour Linux ) recommande:

  • CopyQ est un gestionnaire de presse-papiers avancé disponible sur la plupart des plates-formes, voire toutes.
  • GPaste est un gestionnaire de presse-papiers puissant et performant pour les distributions basées sur GNOME, mais peut également fonctionner sur divers environnements de bureau.
  • Diodon est un gestionnaire de presse-papiers léger mais puissant conçu pour fonctionner de manière optimale lorsqu'il est intégré aux environnements de bureau Unity et GNOME. (Une fois encore, vous n'aimez pas ce paquet.)
  • Pastie est un simple gestionnaire de presse-papiers pour Ubuntu et utilise AppIndicator. Il a quelques fonctionnalités intéressantes.
  • Parcellite est un gestionnaire de presse-papiers GTK + 2 léger et allégé, doté de fonctions de base pour Linux.
  • Glipper est un outil de gestion du presse-papiers pour l’environnement de bureau GNOME. Les utilisateurs peuvent étendre ses fonctionnalités à l’aide de plugins. Il utilise désormais l’indicateur d’application pour prendre en charge les environnements de bureau Unity et Gnome Classic dans Ubuntu.
  • Clipit est un gestionnaire de presse-papiers GTK + léger. Il est riche en fonctionnalités et provient de Parcellite, mais inclut des fonctionnalités supplémentaires et des corrections de bugs.
  • Keepboard est un gestionnaire de presse-papiers multiplate-forme qui permet aux utilisateurs de sauvegarder l'historique du presse-papiers.
  • J'ai enlevé certains de la liste ceux qui ne fonctionnent pas avec Ubuntu. Donc, le total de l'article n'est pas égal à 10.

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 =).

Sommaire

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?

4
WinEunuuchs2Unix

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

0
Viktor Kruglikov

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.

0
guettli