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
Drücken Sie eine Verknüpfung, ein kleines Fenster wird angezeigt:
Geben Sie ein oder mehrere Zeichen ein, um die Auswahl einzuschränken:
Doppelklicken Sie auf die Zeichenfolge, die Sie einfügen möchten:
Die Zeichenfolge wird in Ihr Dokument eingefügt, das Fenster schließt sich von selbst:
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
Das Skript muss python3-pyperclip
, python3-tkinter
und xdotool
:
sudo apt-get install xdotool python3-pyperclip python3-tkinter
- Kopieren Sie Skript 1 in eine leere Datei und speichern Sie es unter
watch_clipboard.py
- Kopieren Sie Skript 2 in eine leere Datei und speichern Sie sie unter
paste_recent.py
(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).
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 gedit
Fenster, rufen Sie das kleine Fenster mit Ihrer Verknüpfung auf und verwenden Sie das in der Einführung erläuterte Dienstprogramm.
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
#!/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:
Wie in Option 1, muss das Skript python3-pyperclip
, python3-tkinter
und xdotool
:
sudo apt-get install xdotool python3-pyperclip python3-tkinter
Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter history_indicator.py
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