我正在寻找具有搜索功能的剪贴板管理器。我喜欢CtrlRshell bash
,并希望我的桌面上也有与剪贴板管理器相同的功能。
到目前为止,我一直在使用diodon
,但此功能在 中不存在diodon
。请参阅那里的相关问题https://answers.launchpad.net/diodon/+question/403507
用例:
- 我之前复制粘贴了“国际化”。
- 我输入下一段文字。
- 我想再次插入“国际化”。
- 我按下了一些神奇的按键。然后“inter”,然后我想查看过去几天我复制粘贴的所有字符串的列表。
- 我选择我想要的那个。完成。
我diodon
得到了一长串的最近比赛列表,这很好,但并不完美。
更新:CopyQ
我使用 CopyQ 已有几个月了,我非常高兴。
答案1
介绍
正如评论中所述,我使用 Python 3 和一些zenity
对话框编写了一个简单的剪贴板管理器指示器,它允许操作剪贴板内容,并且具有搜索功能。
尤其是搜索功能,它利用了 Python 的re
模块,这意味着您可以使用正则表达式进行更细粒度的搜索。每个文本条目在其子菜单中都有 4 个选项:将文本插入剪贴板、将文本附加到当前剪贴板内容的末尾、将文本添加到当前内容的开头以及将其从历史记录中删除。
安装
在终端中,运行以下命令:
sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-bulletin
演示
在下面的动画中,您可以看到文本被复制、使用指示器附加到剪贴板以及最后通过简单搜索对话框搜索测试字符串的演示。找到的内容显示在一个简单的文本视图对话框中,并带有用户区域设置的时间戳(如果已设置)。然后可以通过选择文本并使用标准Ctrl+C 快捷方式复制找到的文本。
如果有人想知道:
进一步的发展
该指示器是在一天内制作完成的,因此目前它本质上相当简约。将来会添加其他功能,例如首选项对话框。菜单长度和文本宽度目前硬编码为指示器中的 10 个项目,每个条目最多 30 个字符。
如果您想提出功能请求,请在项目的GitHub 页面,其源代码也可供下载。
更新:
2017年2月14日:
- 实现了文件操作功能 - 将文本文件加载到剪贴板并将剪贴板内容写入文件。
- 实现了按日期显示条目范围。该选项要求使用
zenity
表单对话框,该对话框要求YYYY/MM/DD/HH:SS
格式为开始和结束日期。实际上,这是在日期范围内读取日志,与这 - 修复了一些错误
2017年2月15日:
- 添加了编辑子菜单。用户现在可以将剪贴板内容转换为大写/小写,从文本的开头或结尾修剪单词/字符,以及替换表达式(使用 python 的
re
正则表达式)。
2017年2月17日:
- 添加了在文本文件中打开历史项目的选项(类似于
bash
)fcedit
。到目前为止,这只会打开纯文本文件类型的默认程序集。 - 一些改进和错误修复。
2017年2月19日:
- 添加了 base64 操作(编码/解码)。
2017年3月3日:
- 添加了“固定子菜单”和“固定”剪贴板历史记录中特定项目的功能。代码已重构,某些部分已重写以供重复使用。
答案2
Ask Ubuntu 内部的建议
由此 (Ubuntu 16.04 的剪贴板管理器)我们从用户那里了解到:
- 剪辑是其中最好的。
- 复制Q是一款跨平台、设计精良、功能齐全的剪贴板管理器(我最喜欢的)。它有一个(非常方便的)命令行界面。
由此 (Ubuntu 14.04 剪贴板管理器?)我们从用户那里了解到:
- 滑行者是一个剪贴板管理器,可以从软件中心安装。
- 我用ClipIt是与 Ubuntu 菜单集成的 Parcelite 分支。(此包在上面的第一部分中列出)
- 我在用着格氏膏
- 你可以试试守卫板。它使用起来很方便,而且看起来稳定可靠。
- 牛齿鱼是 GTK 和 Unity 的另一个不错的选择。其工作原理与已经给出的答案中的其他方法非常相似。但是,您可以使用 Dash 搜索最近的“剪辑”。(但您已在使用此版本,并且不喜欢它。)
- 我用夹子,一个与 Plank 配合使用的 docklet(我不使用 Unity)。我认为 Clippy 也附带 Docky。
Ask Ubuntu 之外的建议
这次 Ubuntu 用户也不甘示弱(tecmint.com - 10 个最佳 Linux 剪贴板管理器)建议:
- 复制Q是一款先进的剪贴板管理器,可在大多数(如果不是全部)平台上使用。
- 格氏膏是一款功能强大且出色的剪贴板管理器,适用于基于 GNOME 的发行版,但也可以在各种桌面环境中使用
- 牛齿鱼是一款轻量但功能强大的剪贴板管理器,旨在与 Unity 和 GNOME 桌面环境集成时发挥最佳效果。(再次说明您不喜欢这个包)
- 帕斯蒂是一款适用于 Ubuntu 的简单剪贴板管理器,利用了 AppIndicator。它有一些很酷的功能。
- 帕塞利特是一款精简、轻量级 GTK+2、具有基本功能的 Linux 剪贴板管理器。
- 滑行者是 GNOME 桌面环境的剪贴板管理工具,用户可以使用插件扩展其功能。它现在使用 App Indicator 支持 Ubuntu 中的 Unity 和 Gnome Classic 桌面环境。
- 剪辑是一款轻量级 GTK+ 剪贴板管理器。它功能丰富,实际上是从 Parcellite 派生而来,但包含一些额外功能和错误修复。
- 守卫板是一个跨平台的剪贴板管理器,允许用户保存剪贴板历史记录。
- 我从列表中删除了一些不适用于 Ubuntu 的版本。因此文章标题中的数字加起来并不等于 10。
上面列出的相同软件包的其他评论可以在以下网址找到(makeuseof.com - 6 个管理 Linux 剪贴板的工具) 和 (maketecheasier.com - 使用剪贴板管理器增强 Linux 剪贴板)。
概括
最终,您选择的软件包是您最满意的软件包。没有人能肯定地说哪个软件包会是最适合您的。几乎所有软件包都提供您想要的可搜索历史记录,但哪一个的界面最符合您的思维方式?
答案3
1. 简约剪贴板实用程序,可快速搜索(动态更新)剪贴板历史记录
使用下面的设置,可以非常轻松地搜索最近复制的文本(字符串),然后双击将其粘贴到文档中。设置并不是最简单的(目前),但使用非常简单。
实践中如何运作
设置
该设置包括两个小脚本
脚本 1;用于监视剪贴板变化的后台脚本
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
脚本 2;通过快捷键调用
#!/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()
如何设置
该脚本需要
python3-pyperclip
,python3-tkinter
和xdotool
:sudo apt-get install xdotool python3-pyperclip python3-tkinter
- 将脚本1复制到一个空文件中,保存为
watch_clipboard.py
- 将脚本2复制到一个空文件中,另存为
paste_recent.py
(测试)使用以下命令将脚本 1 作为后台脚本运行:
python3 /path/to/watch_clipboard.py
开始复制文本,它会自动记住(最多可记住任意数量的字符串,记住最后 n 个字符串)。
将脚本2添加到快捷方式:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。单击“+”,添加命令:
python3 /path/to/paste_recent.py
打开一个
gedit
窗口并使用快捷方式调用小窗口,然后按照介绍中的说明使用该实用程序。如果一切正常,请将脚本 1 添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
python3 /path/to/watch_clipboard.py
选项
在脚本的头部,您可以设置剪贴板历史记录中列出的字符串的最小长度(字符数):
minlength = 1
另外,您还可以设置在历史记录中应保留多少个字符串(数据库的大小):
size = 500
笔记
- 目前,该实用程序适用于所有与 ++Ctrl兼容的应用程序。以下版本也粘贴了。AltV
gnome-terminal
2. 指标版本(单脚本,简单设置)选修的键盘快捷键,也可以在 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()
设置
此版本的功能与中的脚本几乎相同[1]
,但作为指示器,设置更简单:
与选项 1 类似,脚本需要
python3-pyperclip
、python3-tkinter
和xdotool
:sudo apt-get install xdotool python3-pyperclip python3-tkinter
将脚本复制到一个空文件中,另存为
history_indicator.py
通过命令运行:
python3 /path/to/history_indicator.py run
启动指标+背景脚本。Search clipboard history从菜单中选择调出小窗口。
或者
要以其他方式调用窗口,请运行
python3 /path/to/history_indicator.py search
答案4
CopyQ 是一款非常出色的高级 Linux 剪贴板管理器。它拥有大量有价值的功能(包括类似 Ctrl-R 的搜索)。
安装:
$ sudo add-apt-repository ppa:hluk/copyq
$ sudo apt update
$ sudo apt install copyq
并添加插入的全局快捷方式:
托盘图标 > 首选项 > 快捷方式选项卡 > 自定义操作和全局快捷方式.. > 添加 > 显示/隐藏主窗口