Durchsuchbarer Zwischenablage-Manager, wie Strg-R in Bash

7

Ich suche einen Zwischenablage-Manager mit Suchfunktion. Ich liebe CtrlRdie bashShell und möchte die gleiche Funktionalität wie im Zwischenablage-Manager für meinen Desktop haben.

Bisher habe ich verwendet diodon, aber diese Funktion ist in nicht vorhanden diodon. Siehe die entsprechende Frage dort https://answers.launchpad.net/diodon/+question/403507

Anwendungsfall:

  • Ich habe vorher "Internationalisierung" kopiert + eingefügt.
  • Ich tippe den nächsten Text.
  • Ich möchte noch einmal "Internationalisierung" einfügen.
  • Ich habe einen magischen Tastenanschlag gedrückt. Dann "inter" und dann möchte ich eine Liste aller Zeichenfolgen sehen, die ich in den letzten Tagen kopiert und eingefügt habe.
  • Ich wähle die, die ich will. Erledigt.

Mit diodoneiner langen Liste der letzten Spiele ist das gut, aber nicht perfekt.

guettli
quelle
Haben Sie copyq ausprobiert? Es hat einige leistungsstarke Befehlszeilenbefehle / Skripte
Mac
Ich bin mir ziemlich sicher, dass ich mit einer solchen Funktion einen Zwischenablage-Manager-Indikator erstellen kann. Haben Sie andere spezielle Anforderungen als das Hinzufügen der Suchfunktion?
Sergiy Kolodyazhnyy
Hallo @guettli, nur neugierig, aber hat dich eine der Antworten näher an das gebracht, was du dir vorgestellt hast?
Jacob Vlijm
@ JacobVlijm hat einen guten Punkt. Ihre Kopfgeld-Gnadenfrist endet in 1 Stunde ...
WinEunuuchs2Unix
1
....und es ist weg. Ich denke, wir hätten uns gefreut, wenn Sie mit denjenigen kommuniziert hätten, die sich die Mühe gemacht haben, Ihre Frage zu beantworten, und die Gelegenheit gegeben hätten, sich zu verbessern. Was nützt es, auf diese Weise ein Kopfgeld auf eine Frage zu setzen?
Jacob Vlijm

Antworten:

5

Einführung

Wie in den Kommentaren angegeben, habe ich mit Python 3 und einigen zenityDialogfeldern einen einfachen Indikator für den Zwischenablage-Manager geschrieben , der das Bearbeiten des Inhalts der Zwischenablage ermöglicht und über Suchfunktionen verfügt.

Insbesondere bei der Suchfunktion wird das Python- reModul verwendet. Dies bedeutet, dass Sie Regex-Ausdrücke für eine genauere Suche verwenden können. Jeder Texteintrag verfügt über 4 Optionen in seinem Untermenü: Text in die Zwischenablage einfügen, Text an das Ende des aktuellen Cliboards anhängen, Text an den Anfang des aktuellen Inhalts stellen und aus dem Verlauf entfernen.

Installation

Führen Sie im Terminal die folgenden Befehle aus:

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

Demo

In der folgenden Animation sehen Sie eine Demonstration des kopierten Texts, der mit dem Indikator angehängten Zwischenablage, und schließlich wird die Testzeichenfolge über einen einfachen Suchdialog durchsucht. Der gefundene Inhalt wird in einem einfachen Textansichtsdialog mit Zeitstempel im Gebietsschema des Benutzers angezeigt (falls festgelegt). Der gefundene Text kann dann durch Auswahl von Text und Verwendung von Standard Ctrl+ C Verknüpfung kopiert werden . Geben Sie hier die Bildbeschreibung ein

Falls sich jemand wundert:

  • Die Animation wird mit der Silentcast- App erstellt
  • Desktop- und Icon-Theme sind Ubuntu Kylin-Theme, Version 16.04
  • Ja, das ist Ubuntu (16.04) mit Launcher unten .

Weitere Entwicklung

Der Indikator wurde an einem Tag erstellt und ist daher derzeit recht minimalistisch. In Zukunft werden zusätzliche Funktionen hinzugefügt, z. B. das Dialogfeld "Einstellungen". Die Menülänge und die Textbreite sind derzeit auf 10 Elemente in der Anzeige und maximal 30 Zeichen für jeden Eintrag fest codiert.

Wenn Sie eine Funktionsanfrage stellen möchten, senden Sie bitte ein Issue-Ticket auf der GitHub-Seite des Projekts , auf der auch der Quellcode verfügbar ist.

Aktualisierung:

14. Februar 2017:

  • Implementierte Dateioperationsfunktion - Laden einer Textdatei in die Zwischenablage und Schreiben des Inhalts der Zwischenablage in die Datei.
  • Anzeigebereich von Einträgen nach Datum implementiert. Die Option ruft den zenityFormulardialog auf, für den das Start- und Enddatum im YYYY/MM/DD/HH:SSFormat erforderlich ist . Effektiv ist dieses Protokoll Lesung im Datumsbereich, gleich wie diese
  • paar Bugfixes

15. Februar 2017:

  • Bearbeitungs-Untermenü hinzugefügt. Benutzer können jetzt den Inhalt der Zwischenablage in Groß- / Kleinbuchstaben konvertieren, Wörter / Zeichen vom Anfang oder Ende des Textes reabschneiden und Ausdrücke ersetzen (verwendet den regulären Ausdruck von Python ).

17. Februar 2017:

  • Option zum Öffnen eines Verlaufselements in einer Textdatei hinzugefügt (ähnlich wie bei bash's fcedit). Bisher wird nur das Standardprogramm geöffnet, das für den Nur-Text-Dateityp festgelegt wurde.
  • paar Verbesserungen und Bugfixes.

19. Februar 2017:

  • Base64-Operationen hinzugefügt (codieren / decodieren).

3. März 2017:

  • Untermenü "Gepinnt" und die Möglichkeit, bestimmte Elemente aus dem Verlauf der Zwischenablage zu "pinnen". Code überarbeitet, bestimmte Teile für die wiederholte Verwendung neu geschrieben.
Sergiy Kolodyazhnyy
quelle
Haha, ich mag "jemand wundert sich" Abschnitt;)
Mac
Ich habe das geliebt, als ich Ubuntu benutzt habe. Gibt es eine Möglichkeit, dies in KDE zum Laufen zu bringen?
Adam
@Adam Ich habe den Indikator noch nie auf KDE getestet, einfach weil KDE ein Qt-Desktop ist und der Indikator mit Gtk geschrieben wurde. Ich würde also sagen, dass er in KDE nicht funktioniert.
Sergiy Kolodyazhnyy
4

Empfehlungen aus Ask Ubuntu

Daraus ( Clipboard Manager für Ubuntu 16.04 ) lernen wir von Benutzern:

  • Clipit ist das beste unter allen.
  • CopyQ ist ein plattformübergreifender, gut gestalteter und voll ausgestatteter Zwischenablage-Manager (mein Favorit). Es verfügt unter anderem über eine (sehr praktische) Kommandozeilenschnittstelle.

Daraus ( Ubuntu 14.04 Clipboard Manager? ) Lernen wir von Benutzern:

  • Glipper ist ein Zwischenablage-Manager, der über das Software Center installiert werden kann.
  • Ich benutze ClipIt ist eine Parcelite-Gabel mit Ubuntu-Menü-Integration. (Dieses Paket wurde im ersten Abschnitt oben aufgeführt)
  • Ich benutze GPaste
  • Sie können Keepboard ausprobieren . Es ist einfach zu bedienen und scheint stabil und zuverlässig zu sein.
  • Diodon ist eine weitere gute Option für GTK und Unity. Funktioniert ziemlich genau wie die anderen in den bereits gegebenen Antworten. Sie können jedoch Ihre letzten "Clips" mit Dash durchsuchen. (Sie verwenden diese Version jedoch bereits und mögen sie nicht.)
  • Ich benutze Clippy , ein Docklet, das mit Plank funktioniert (ich benutze Unity nicht). Ich denke, Clippy kommt auch mit Docky.

Empfehlungen außerhalb von Ask Ubuntu

Um nicht von Ubuntu-Benutzern übertroffen zu werden, empfiehlt dies ( tecmint.com - 10 beste Zwischenablage-Manager für Linux ):

  • CopyQ ist ein erweiterter Zwischenablage-Manager, der auf den meisten, wenn nicht allen Plattformen verfügbar ist.
  • GPaste ist ein leistungsstarker und großartiger Zwischenablage-Manager für GNOME-basierte Distributionen, kann aber auch in einer Vielzahl von Desktop-Umgebungen verwendet werden
  • Diodon ist ein leichter, aber dennoch leistungsstarker Zwischenablage-Manager, der in Integration in Unity- und GNOME-Desktop-Umgebungen am besten funktioniert. (Wieder einmal gefällt Ihnen dieses Paket nicht)
  • Pastie ist ein einfacher Zwischenablage-Manager für Ubuntu und verwendet den AppIndicator. Es hat einige coole Funktionen.
  • Parcellite ist ein abgespeckter, leichter GTK + 2-Manager für die Zwischenablage mit grundlegenden Funktionen für Linux.
  • Glipper ist ein Tool zur Verwaltung der Zwischenablage für die GNOME-Desktopumgebung. Benutzer können seine Funktionalität mithilfe von Plugins erweitern. Es verwendet jetzt den App Indicator, um Unity- und Gnome Classic-Desktopumgebungen in Ubuntu zu unterstützen.
  • Clipit ist ein leichter GTK + Zwischenablage-Manager. Es ist reich an Funktionen und wurde von Parcellite entwickelt, enthält jedoch einige zusätzliche Funktionen und Fehlerbehebungen.
  • Keepboard ist ein plattformübergreifender Zwischenablage-Manager, mit dem Benutzer den Verlauf der Zwischenablage speichern können.
  • Ich habe einige von denen aus der Liste entfernt, die mit Ubuntu nicht funktionieren. Der Artikeltitel ergibt also nicht 10.

Weitere Bewertungen der oben aufgeführten Pakete finden Sie in ( makeuseof.com - 6 Tools zum Verwalten der Linux-Zwischenablage ) und in ( maketecheasier.com - Erweitern der Linux-Zwischenablage mit dem Zwischenablage-Manager ).

Zusammenfassung

Am Ende des Tages ist das Paket, das Sie wählen, dasjenige, mit dem Sie sich am wohlsten fühlen. Niemand kann mit Sicherheit sagen, welches Paket das sein wird. Fast alle bieten eine durchsuchbare Historie, wie Sie sie möchten, aber welche hat die Oberfläche, die am besten auf Ihre Denkweise abgestimmt ist?

WinEunuuchs2Unix
quelle
4

1. Dienstprogramm für minimalistische Zwischenablage zum schnellen Durchsuchen des (dynamisch aktualisierten) Verlaufs der Zwischenablage

Mit dem folgenden Setup ist es extrem einfach, kürzlich kopierten (Zeichenfolgen aus) Text zu suchen und ihn mit einem Doppelklick in Ihre Dokumente einzufügen. Das Einrichten ist (derzeit) nicht das einfachste von allen, die Verwendung ist jedoch äußerst unkompliziert.

Wie es in der Praxis funktioniert

  1. Drücken Sie eine Verknüpfung, ein kleines Fenster wird angezeigt:

    Geben Sie hier die Bildbeschreibung ein

  2. Geben Sie ein oder mehrere Zeichen ein, um die Auswahl einzuschränken:

    Geben Sie hier die Bildbeschreibung ein

  3. Doppelklicken Sie auf die Zeichenfolge, die Sie einfügen möchten:

    Geben Sie hier die Bildbeschreibung ein

  4. Die Zeichenfolge wird in Ihr Dokument eingefügt, das Fenster schließt sich von selbst:

    Geben Sie hier die Bildbeschreibung ein

Installieren

Das Setup enthält zwei kleine Skripte

Skript 1; Ein Hintergrundskript, um nach Änderungen in der Zwischenablage zu suchen

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

Skript 2; über eine Tastenkombination aufrufen

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

Wie stellt man das ein

  1. Das Skript muss python3-pyperclip, python3-tkinterund xdotool:

    sudo apt-get install xdotool python3-pyperclip python3-tkinter
    
  2. Kopieren Sie Skript 1 in eine leere Datei und speichern Sie es unter watch_clipboard.py
  3. Kopieren Sie Skript 2 in eine leere Datei und speichern Sie sie unter paste_recent.py
  4. (Test-) Führen Sie Skript 1 als Hintergrundskript mit dem folgenden Befehl aus:

    python3 /path/to/watch_clipboard.py
    

    Beginnen Sie mit dem Kopieren von tekst, das automatisch gespeichert wird (bis zu einer beliebigen Anzahl von Zeichenfolgen, wobei die letzten n Zeichenfolgen gespeichert werden).

  5. Fügen Sie Skript 2 zu einer Verknüpfung hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

    python3 /path/to/paste_recent.py
    

    Öffnen Sie ein geditFenster, rufen Sie das kleine Fenster mit Ihrer Verknüpfung auf und verwenden Sie das in der Einführung erläuterte Dienstprogramm.

  6. Wenn alles einwandfrei funktioniert, fügen Sie Skript 1 zu Startanwendungen hinzu: Dash> Startanwendungen> Hinzufügen. Fügen Sie den Befehl hinzu:

    python3 /path/to/watch_clipboard.py
    

Optionen

Im Kopfbereich des Skripts können Sie die Mindestlänge einer Zeichenfolge festlegen, die im Verlauf der Zwischenablage aufgeführt werden soll (Anzahl der Zeichen):

minlength = 1

Außerdem können Sie festlegen, wie viele Zeichenfolgen im Verlauf beibehalten werden sollen (Größe der Datenbank):

size = 500

Anmerkungen

  • Derzeit arbeitet das Dienstprogramm mit allen Anwendungen , die kompatibel sind mit Ctrl+ Alt+ V. Die folgende Version wird ebenfalls eingefügt gnome-terminal.

2. Indikatorversion (Einzelskript, einfache Einrichtung) mit optionaler Tastenkombination, die ebenfalls korrekt in das Gnome-Terminal eingefügt wird

Geben Sie hier die Bildbeschreibung ein

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

Installieren

Diese Version hat fast die gleiche Funktionalität wie die Skripte [1], ist jedoch ein Indikator und einfacher einzurichten:

  1. Wie in Option 1, muss das Skript python3-pyperclip, python3-tkinterund xdotool:

    sudo apt-get install xdotool python3-pyperclip python3-tkinter
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter history_indicator.py

  3. Führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/history_indicator.py run
    

    um das Indikator + Hintergrundskript zu starten. Wählen Sie Search clipboard historyaus dem Menü, um das kleine Fenster aufzurufen.

    oder

    Führen Sie das Fenster aus, um es alternativ aufzurufen

    python3 /path/to/history_indicator.py search
    
Jacob Vlijm
quelle
Sieht interessant aus :) Wenn Sie daran interessiert sind, das Verhalten zu erweitern, muss ich noch eine Anfrage stellen. Können Sie die primäre Funktionalität von jumpcut (in Mac) implementieren? Angenommen, Sie drücken eine Taste, erhalten Sie den ersten Eintrag in der Zwischenablage. Wenn Sie dieselbe Taste erneut drücken oder die Pfeilmarkierungen drücken, wird der nächste Eintrag in der Zwischenablage angezeigt. Sehr nützlich. Vielen Dank!
Mac
@mac das ist toll! Ich werde definitiv weiter darauf aufbauen. Danke für den Tipp!
Jacob Vlijm
Genial. Das ist es, worüber ich spreche - youtube.com/watch?v=PKOb0HIyAOQ . Es fehlt in Linux Clipboard Managern.
Mac
1
@mac Das ist sehr elegant. Inspirierend und ganz anders als das, was wir bisher hier haben.
Jacob Vlijm
Wow, mir war nicht bewusst, dass Sie nur wenige Zeilen Python-Code benötigen, um dies zu implementieren. Vielen Dank für das Teilen Ihres Wissens.
Guettli
0

Die App unity-scope-diodonunterstützt dies.

Aber die Benutzeroberfläche gefällt mir nicht so:

Wenn ich Super-B drücke, sehen meine Augen 12 * 7 = 84 mal das gleiche große Symbol, an dem ich überhaupt nicht interessiert bin.

Es wäre schön, wenn Diodon dies unterstützen würde.

guettli
quelle
0

CopyQ ist ein fantastischer fortgeschrittener Linux-Zwischenablage-Manager. Es hat Tonnen von wertvollen Funktionen (einschließlich Strg-R-ähnliche Suche).

Installieren:

$ sudo add-apt-repository ppa:hluk/copyq
$ sudo apt update
$ sudo apt install copyq

Und fügen Sie eine globale Verknüpfung zum Einfügen hinzu:

Taskleistensymbol> Einstellungen> Registerkarte Verknüpfungen> Benutzerdefinierte Aktionen und globale Verknüpfungen.> Hinzufügen> Hauptfenster ein- / ausblenden

Viktor Kruglikov
quelle