Менеджер буфера обмена с возможностью поиска, например ctrl-r в bash

Ищу менеджера буфера обмена с функцией поиска. Я люблю CtrlR в bash оболочки и хотел бы иметь такую ​​же функциональность, как в менеджере буфера обмена для моего рабочего стола.

До сих пор я использую diodon, но эта функция не существует в diodon, См. Соответствующий вопрос там https://answers.launchpad.net/diodon/+question/403507

Случай использования:

  • Я скопировал + вставил "интернационализация" раньше.
  • Я набираю следующий текст.
  • Я хочу вставить слова "интернационализация" еще раз.
  • Я ударил какой-то волшебный ключ. Затем "inter", а затем я хочу увидеть список всех строк, которые я скопировал + вставил за последние дни.
  • Я выбираю тот, который я хочу. Готово.

С diodon Я получаю длинный список последних матчей, это хорошо, но не идеально.

5 ответов

Вступление

Как указано в комментариях, я написал простой индикатор менеджера буфера обмена с использованием 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.

Если кому-то интересно

  • анимация сделана с приложением silentcast
  • тема рабочего стола и иконки - тема Ubuntu Kylin, версия 16.04
  • Да, это Ubuntu (16.04) с лаунчером внизу.

Дальнейшее развитие

Индикатор был сделан за один день, поэтому на данный момент он довольно минималистичен по своей природе. В будущем будут добавлены дополнительные функции, такие как диалог настроек. Длина меню и ширина текста в настоящее время жестко запрограммированы до 10 элементов в индикаторе и максимум 30 символов для каждой записи.

Если вы хотите сделать запрос на добавление функции, отправьте заявку на выпуск на странице проекта GitHub, где также доступен его исходный код.

Обновления:

14 февраля 2007 года:

  • Реализована функция файловых операций - загрузка текстового файла в буфер обмена и запись содержимого буфера обмена в файл.
  • Реализовано отображение диапазона записей по дате. Опция требует zenity диалог форм, который требует даты начала и окончания в YYYY/MM/DD/HH:SS формат. По сути, это чтение журнала в диапазоне дат, так же, как это
  • пара исправлений

Февраль 15,2017:

  • Добавлено редактирование подменю. Теперь пользователи могут преобразовывать содержимое буфера обмена в верхний / нижний регистр, обрезать слова / символы из начала или конца текста и заменять выражения (использует Python re регулярное выражение).

17 февраля 2007 года:

  • Добавлена ​​опция для открытия элемента истории в текстовом файле (аналогично bash "s fcedit). Пока это только открывает программу по умолчанию, установленную для простого текстового типа файла.
  • пара улучшений и исправлений ошибок.

Февраль 19,2017:

  • Добавлены операции base64 (кодирование / декодирование).

3 марта 2017 г.:

  • Добавлено "закрепленное подменю" и возможность "закреплять" определенные элементы из истории буфера обмена. Код переработан, некоторые части переписаны для повторного использования.

Рекомендации изнутри Ask Ubuntu

Из этого ( Менеджер буфера обмена для Ubuntu 16.04) мы узнаем от пользователей:

  • Clipit - лучший среди всех.
  • CopyQ - это кроссплатформенный, хорошо продуманный и полнофункциональный менеджер буфера обмена (мой любимый). Среди прочего он имеет (очень удобный) интерфейс командной строки.

Из этого ( Ubuntu 14.04 Clipboard Manager?) Мы узнаем от пользователей:

  • Glipper - менеджер буфера обмена, его можно установить из Центра программного обеспечения.
  • Я использую ClipIt - это Parcelite форк с интеграцией меню Ubuntu. (Этот пакет был указан в первом разделе выше)
  • Я использую GPaste
  • Вы можете попробовать Keepboard. Он прост в использовании и выглядит стабильным и надежным.
  • Диодон - еще один хороший вариант, доступный как для GTK, так и для Unity. Работает так же, как другие в ответах уже дано. Тем не менее, вы можете искать ваши последние "клипы" с помощью Dash. (Вы уже используете эту версию и вам не нравится.)
  • Я использую Clippy, доклет, который работает с Plank (я не использую Unity). Я думаю, что Clippy также поставляется с Docky.

Рекомендации вне Ask Ubuntu

Для того, чтобы пользователи Ubuntu не отстали, этот ( tecmint.com - 10 лучших менеджеров буфера обмена для Linux) рекомендует:

  • CopyQ - это расширенный менеджер буфера обмена, который доступен на большинстве, если не на всех платформах.
  • GPaste является мощным и отличным менеджером буфера обмена для дистрибутивов на основе GNOME, но может также работать в различных средах рабочего стола
  • Diodon - это легкий, но мощный менеджер буфера обмена, разработанный для наилучшей работы при интеграции с рабочими средами Unity и GNOME. (Еще раз вам не нравится этот пакет)
  • Pastie - простой менеджер буфера обмена для Ubuntu, использующий AppIndicator. У него есть несколько интересных функций.
  • Parcellite - это урезанный, легкий GTK+2, менеджер основных функций буфера обмена для Linux.
  • Glipper - это инструмент управления буфером обмена для среды рабочего стола GNOME, пользователи могут расширять его функциональность с помощью плагинов. Теперь он использует индикатор приложения для поддержки настольных сред Unity и Gnome Classic в Ubuntu.
  • Clipit - это легкий менеджер буфера обмена GTK +. Он многофункциональный и на самом деле разветвленный от Parcellite, но включает в себя некоторые дополнительные функции и исправления ошибок.
  • Keepboard - это кроссплатформенный менеджер буфера обмена, который позволяет пользователям сохранять историю буфера обмена.
  • Я удалил некоторые из списка те, которые не работают с Ubuntu. Таким образом, это не добавляет до 10 в названии статьи.

Есть и другие обзоры тех же пакетов, перечисленных выше, которые можно найти в ( makeuseof.com - 6 Инструменты для управления буфером обмена Linux) и в ( maketecheasier.com - Расширение буфера обмена Linux с помощью менеджера буфера обмена).

Резюме

В конце дня вы выбираете тот пакет, который вам наиболее удобен. Никто не может сказать наверняка, какой пакет это будет. Почти все из них предлагают доступную для поиска историю, как вы этого хотите, но какой из них имеет интерфейс, наиболее подходящий для вашего мышления?

1. Минималистичная утилита буфера обмена для быстрого поиска (динамически обновляемого) истории буфера обмена.

С помощью приведенной ниже настройки чрезвычайно легко найти недавно скопированный (строки из) текст и вставить его двойным щелчком мыши в свои документы. Настройка не является самой простой (в настоящее время), но использование чрезвычайно простое.

Как это работает на практике

  1. Нажмите на ярлык, появится небольшое окно:

  2. Введите один или несколько символов, чтобы ограничить выбор:

  3. Дважды щелкните строку, которую вы хотите вставить:

  4. Строка вставляется в ваш документ, окно закрывается само по себе:

Настроить

Установка включает в себя два небольших скрипта

сценарий 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()

Как настроить

  1. Скрипт нужен python3-pyperclip, python3-tkinter а также xdotool:

    sudo apt-get install xdotool python3-pyperclip python3-tkinter
    
  2. Скопируйте скрипт 1 в пустой файл, сохраните его как watch_clipboard.py
  3. Скопируйте скрипт 2 в пустой файл, сохраните его как paste_recent.py
  4. (Test-) запустить скрипт 1 как фоновый скрипт с помощью команды:

    python3 /path/to/watch_clipboard.py
    

    Начните копировать текст, который автоматически запоминается (до произвольного числа строк, запоминание последних n-строк).

  5. Добавьте сценарий 2 к ярлыку: выберите: "Системные настройки" > "Клавиатура" > "Ярлыки" > "Пользовательские ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/paste_recent.py
    

    Открыть gedit окна и вызовите маленькое окно с вашим ярлыком, и используйте утилиту, как объяснено во введении.

  6. Если все работает нормально, добавьте сценарий 1 в "Автозагрузка приложений": "Тире" > "Автозагрузка приложений" > "Добавить". Добавьте команду:

    python3 /path/to/watch_clipboard.py
    

Опции

В разделе заголовка скрипта вы можете установить минимальную длину строки, которая будет отображаться в истории буфера обмена (количество символов):

minlength = 1

Также вы можете указать, сколько строк должно храниться в истории (размер базы данных):

size = 500

Заметки

  • В настоящее время утилита работает со всеми приложениями, совместимыми с Ctrl + Alt + V. Версия ниже также вставляется в gnome-terminal,

2. Версия индикатора (простой скрипт, простая настройка) с дополнительным сочетанием клавиш, также корректно вставляется в gnome-терминал

#!/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. Как и в варианте 1, скрипт нуждается в python3-pyperclip, python3-tkinter а также xdotool:

    sudo apt-get install xdotool python3-pyperclip python3-tkinter
    
  2. Скопируйте скрипт в пустой файл, сохраните как history_indicator.py

  3. Запустите его командой:

    python3 /path/to/history_indicator.py run
    

    запустить индикатор + фоновый скрипт. Выберите Поиск истории буфера обмена из меню, чтобы вызвать маленькое окно.

    или же

    Чтобы вызвать окно альтернативным способом, запустите

    python3 /path/to/history_indicator.py search
    

Приложение unity-scope-diodon поддерживает это.

Но интерфейс мне не нравится

Если я нажму super-b, мои глаза увидят в 12*7 = 84 раза одну и ту же большую иконку, которая меня совсем не интересует.

Было бы хорошо, если бы сам диодон поддержал это.

CopyQ - потрясающий продвинутый менеджер буфера обмена Linux. Он имеет множество ценных функций (в том числе Ctrl-R, как поиск).

Установка:

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

И добавьте глобальный ярлык для вставки:

Значок на панели задач> "Установки"> вкладка "Ярлыки"> "Пользовательские действия" и "Глобальные ярлыки"..> Добавить> Показать / скрыть главное окно

Другие вопросы по тегам