Инструмент для вставки фрагментов текста в приложения

Инструмент для вставки фрагментов текста в приложения

В немецком языке письма и почтовые отправления начинаются со слов «Sehr geehrter Herr ....».

Я устал печатать это снова и снова. И я устал настраивать приложения так, чтобы они давали мне ярлыки для вставки текстовых блоков, подобных этому.

Есть ли способ вставлять текстовые блоки комментариев в среду рабочего стола?

Таким образом я мог вставлять текстовые блоки в vi, thunderbird, firefox, libreoffice...

Другой пример: мне часто нужно вставить куда-то свой ssh-pub-key. Я знаю, как использовать ssh-copy-id, но опять же, было бы здорово иметь настольное решение, которое дало бы мне доступ к настраиваемому списку текстовых блоков.

решение1

я используюАвтоКейустанавливается из Центра приложений Ubuntu

очень прост в использовании

Я добавил «фразы», ​​например, мой адрес электронной почты, [email protected]введя их gmи нажав Tab.<tab>

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

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

решение2

Скрипт ниже выполняет эту работус приложениями, которые используют Ctrl+V вставить текст. Важно знать, что это не будет работать в gnome-terminal* например.
Я проверил это на Firefox, Thunderbird, Libreoffice, Sublime Text и Gedit без каких-либо проблем.

Как это работает

При вызове скрипта появляется окно, в котором перечислены определенные вами фрагменты. Выберите элемент (или введите его номер), и фрагмент текста будет вставлен в самое переднее окно любого приложения, которое является Ctrl+ V"-совместимым":

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

Добавление/редактирование фрагментов

Когда вы выбираете manage snippets, папка скрипта ~/.config/snippet_pasteоткрывается в nautilus. Чтобы создать новый фрагмент, просто создайте текстовый файл с текстом вашего фрагмента. Не обращайте внимания на имя, которое вы даете файлу; если это простой текст, это нормально. Скрипт использует только содержимое файла и создает пронумерованный список всех файлов ('content), которые он находит.

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

Если каталог фрагментов ( ~/.config/snippet_paste) не существует, скрипт создаст его для вас.

Как использовать

  • сначала установите xdotoolи xclip, если он не установлен в вашей системе:

    sudo apt-get install xdotool
    

    и

    sudo apt-get install xclip
    
  • Скопируйте скрипт ниже, сохраните его как paste_snippets.py, запустите его командой:

    python3 /path/to/paste_snippets.py
    

Сценарий

#!/usr/bin/env python3

import os
import subprocess

home = os.environ["HOME"]
directory = home+"/.config/snippet_paste"
if not os.path.exists(directory):
    os.mkdir(directory)
# create file list with snippets
files = [
    directory+"/"+item for item in os.listdir(directory) \
         if not item.endswith("~") and not item.startswith(".")
    ]
# create string list
strings = []
for file in files:
    with open(file) as src:
        strings.append(src.read())
# create list to display in option menu
list_items = ["manage snippets"]+[
    (str(i+1)+". "+strings[i].replace("\n", " ").replace\
     ('"', "'")[:20]+"..") for i in range(len(strings))
    ]
# define (zenity) option menu
test= 'zenity --list '+'"'+('" "')\
      .join(list_items)+'"'\
      +' --column="text fragments" --title="Paste snippets"'
# process user input
try:
    choice = subprocess.check_output(["/bin/bash", "-c", test]).decode("utf-8")
    if "manage snippets" in choice:
        subprocess.call(["nautilus", directory])
    else:
        i = int(choice[:choice.find(".")])
        # copy the content of corresponding snippet
        copy = "xclip -in -selection c "+"'"+files[i-1]+"'"
        subprocess.call(["/bin/bash", "-c", copy])
        # paste into open frontmost file
        paste = "xdotool key Control_L+v"
        subprocess.Popen(["/bin/bash", "-c", paste])
except Exception:
    pass

Если вы не используете nautilus

Если вы используете другой файловый браузер, замените строку (29):

subprocess.Popen(["nautilus", directory])

к:

subprocess.Popen(["<your_filebrowser>", directory])

Размещение скрипта под комбинацией горячих клавиш

Для более удобного использования вы можете создать ярлык для вызова скрипта:

  • Системные настройки →КлавиатураЯрлыкиПользовательские сочетания клавиш

  • Нажмите +, чтобы добавить команду:

    python3 /path/to/paste_snippets.py
    

Сценарий также размещен наgist.gisthub.


*РЕДАКТИРОВАТЬ

Версия ниже автоматически проверяет, gnome-является ли терминал ( ) самым передовым приложением, и автоматически изменяет команду вставки на Ctrl+ Shift+ Vвместо Ctrl+V

Использование и настройка практически одинаковы.

Сценарий

#!/usr/bin/env python3

import os
import subprocess

home = os.environ["HOME"]
directory = home+"/.config/snippet_paste"
if not os.path.exists(directory):
    os.mkdir(directory)
# create file list with snippets
files = [
    directory+"/"+item for item in os.listdir(directory) \
         if not item.endswith("~") and not item.startswith(".")
    ]
# create string list
strings = []
for file in files:
    with open(file) as src:
        strings.append(src.read())
# create list to display in option menu
list_items = ["manage snippets"]+[
    (str(i+1)+". "+strings[i].replace("\n", " ").replace\
     ('"', "'")[:20]+"..") for i in range(len(strings))
    ]
# define (zenity) option menu
test= 'zenity --list '+'"'+('" "')\
      .join(list_items)+'"'\
      +' --column="text fragments" --title="Paste snippets" --height 450 --width 150'

def check_terminal():
    # function to check if terminal is frontmost
    try:
        get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
        get_terms = get(["xdotool", "search", "--class", "gnome-terminal"])
        term = [p for p in get(["xdotool", "search", "--class", "terminal"]).splitlines()]
        front = get(["xdotool", "getwindowfocus"])
        return True if front in term else False
    except:
        return False

# process user input
try:
    choice = subprocess.check_output(["/bin/bash", "-c", test]).decode("utf-8")
    if "manage snippets" in choice:
        subprocess.call(["nautilus", directory])
    else:
        i = int(choice[:choice.find(".")])
        # copy the content of corresponding snippet
        copy = "xclip -in -selection c "+"'"+files[i-1]+"'"
        subprocess.call(["/bin/bash", "-c", copy])
        # paste into open frontmost file
        paste = "xdotool key Control_L+v" if check_terminal() == False else "xdotool key Control_L+Shift_L+v"
        subprocess.Popen(["/bin/bash", "-c", paste])
except Exception:
    pass

Связанный контент