Как создать пользовательскую панель запуска приложений, которая копирует текст в буфер обмена?

Я хочу создать Custom Launcher, а затем добавить его в Panel, чтобы каждый раз, когда я нажимал на него, он копировал предварительно загруженную строку текста, но я не знаю, как написать команды для него.

Например, если предварительно загруженная строка текста - "Привет". Мне бы хотелось, чтобы каждый раз, когда я нажимал на него, он копировал слово "Hello" в мой буфер обмена, чтобы я мог вставить его в любое место.

1 ответ

Решение

Ниже приведен пример легко настраиваемой настройки. Он существует из сценария и .desktop файл (лаунчер) для запуска скрипта с двумя вариантами. Вы можете:

  • щелкните на панели запуска, чтобы скопировать предварительно заданную строку или строку в буфер обмена, или:
  • щелкните по нему правой кнопкой мыши, чтобы установить новую строку:

    введите описание изображения здесь
    введите описание изображения здесь

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

Чтобы иметь возможность копировать текст в буфер обмена, нам нужно установить xclip:

sudo apt-get install xclip

Тогда нам нужны две вещи:

  1. Сценарий:

    #!/usr/bin/env python3
    import subprocess
    import os
    import sys
    
    wordfile = os.environ["HOME"]+"/.word_file"
    
    def get_word():
        try:
            copy = "xclip -in -selection c "+"'"+wordfile+"'"
            subprocess.Popen(["/bin/bash", "-c", copy])
        except FileNotFoundError:
            pass
    
    def set_word():
        try:
            word = "zenity --entry --title='Change the word' --text='Set a new string or line'"
            new_word = subprocess.check_output(["/bin/bash", "-c", word]).decode("utf-8").strip()
            open(wordfile, "wt").write(new_word)
        except subprocess.CalledProcessError:
            pass
    
    arg = sys.argv[1]
    if arg == "-set":
       set_word()
    elif arg == "-get":
        get_word()
    

    Скопируйте его в пустой файл, сохраните как copy_text.py и сделать его исполняемым(!!)

  2. .desktop file, чтобы запустить скрипт с двумя вариантами

    [Desktop Entry]
    Name=Paste a string
    Exec=/path/to/copy_text.py -get
    Type=Application
    Icon=/path/to/your/icon.png
    
    Actions=Set a new string;
    
    [Desktop Action Set a new string]
    Name=Set a new string
    Exec=/path/to/copy_text.py -set
    OnlyShowIn=Unity;
    

    Скопируйте его в пустой файл, сохраните как paste_text.desktop в ~/.local/share/applicationsзаменить в обеих строках, начиная с Exec=:

    /path/to/copy_text.py
    

    по фактическому пути к сценарию, и заменить в строке, начиная с Icon=

    /path/to/your/icon.png
    

    фактическим путем к действительному значку (например, .png значок 64x64 px)

Теперь перетащите .desktop подать в Unity Launcher, и вы получите легко настраиваемую настройку.

объяснение

Использование xclip в файле.desktop

xclip утилита, которая может использоваться для управления буфером обмена из командной строки
Чтобы скопировать строку в буфер обмена, вы можете использовать команду:

echo <string> | xclip -sel clip

Чтобы скопировать содержимое файла в буфер обмена:

xclip -in -selection c <file>

Если бы это была фиксированная строка, которая вам нужна, вы могли бы действительно, как упомянул Серг, сделать с .desktop файл с однострочником:

[Desktop Entry]
Name=Paste a string
Exec=/bin/bash -c "echo Hello World | xclip -sel clip"
Type=Application
Icon=/path/to/icon.png

или, если вы хотите использовать только ограниченное количество (фиксированных) строк:

[Desktop Entry]
Name=Paste a string
Exec=/bin/bash -c "echo Monkey | xclip -sel clip"
Type=Application
Icon=/opt/lswitcher/icon/lsw_64.png

Actions=Monkey;eats;banana;

[Desktop Action Monkey]
Name=Copy Monkey
Exec=/bin/bash -c "echo Monkey | xclip -sel clip"
OnlyShowIn=Unity;

[Desktop Action eats]
Name=Copy eats
Exec=/bin/bash -c "echo eats | xclip -sel clip"
OnlyShowIn=Unity;

[Desktop Action banana]
Name=Copy banana
Exec=/bin/bash -c "echo banana | xclip -sel clip"
OnlyShowIn=Unity;

затем создайте файл, как описано в ответе, и перетащите его на Unity Ракета-носитель:

введите описание изображения здесь

Если строка для копирования будет непредсказуемой, это будет означать, что вам придется отредактировать .desktop файл вручную каждый раз, когда вы хотите изменить строку, что не очень удобно для пользователя.

Для чего предназначен скрипт

Поэтому скрипт создает внешний файл, ~/.word_fileс содержанием строки, которую вы хотите скопировать в буфер обмена. Скрипт имеет две функции:

def get_word():
    try:
        copy = "xclip -in -selection c "+"'"+wordfile+"'"
        subprocess.Popen(["/bin/bash", "-c", copy])
    except FileNotFoundError:
        pass

(попытаться) прочитать текст, который будет скопирован в буфер обмена из файла, pass если файл не существует

а также:

def set_word():
    try:
        word = "zenity --entry --title='Change the word' --text='Set a new string or line'"
        new_word = subprocess.check_output(["/bin/bash", "-c", word]).decode("utf-8").strip()
        open(wordfile, "wt").write(new_word)
    except subprocess.CalledProcessError:
        pass

открыть zenity окно, в котором вы можете ввести новую строку или строку для записи в файл:

введите описание изображения здесь

.desktopфайл

наконец, вызывает две функции скрипта двумя командами:

Exec=/path/to/copy_text.py -get

вызвать скрипт с опцией -getв качестве основной команды в .desktop файл, который будет выполнен простым нажатием на Unity значок запуска и:

Exec=/path/to/copy_text.py -set

вызвать скрипт с опцией -set, как опция щелчка правой кнопкой мыши (быстрый список).

введите описание изображения здесь

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