Как создать пользовательскую панель запуска приложений, которая копирует текст в буфер обмена?
Я хочу создать Custom Launcher, а затем добавить его в Panel, чтобы каждый раз, когда я нажимал на него, он копировал предварительно загруженную строку текста, но я не знаю, как написать команды для него.
Например, если предварительно загруженная строка текста - "Привет". Мне бы хотелось, чтобы каждый раз, когда я нажимал на него, он копировал слово "Hello" в мой буфер обмена, чтобы я мог вставить его в любое место.
1 ответ
Ниже приведен пример легко настраиваемой настройки. Он существует из сценария и .desktop
файл (лаунчер) для запуска скрипта с двумя вариантами. Вы можете:
- щелкните на панели запуска, чтобы скопировать предварительно заданную строку или строку в буфер обмена, или:
щелкните по нему правой кнопкой мыши, чтобы установить новую строку:
Как настроить
Чтобы иметь возможность копировать текст в буфер обмена, нам нужно установить xclip
:
sudo apt-get install xclip
Тогда нам нужны две вещи:
Сценарий:
#!/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
и сделать его исполняемым(!!).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
, как опция щелчка правой кнопкой мыши (быстрый список).