将文本片段插入应用程序的工具

将文本片段插入应用程序的工具

在德语中,邮件和信函的开头是“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 上进行了测试,没有任何问题。

怎么运行的

调用脚本时,会出现一个窗口,列出您定义的代码片段。选择一个项目(或输入其编号),文本片段将粘贴到任何“兼容”应用程序的最前面的窗口CtrlV

在此处输入图片描述

添加/编辑片段

当您选择 时manage snippets,脚本的文件夹会~/.config/snippet_paste在 nautilus 中打开。要创建新的代码片段,只需创建一个包含代码片段文本的文本文件即可。不必介意您为文件指定的名称;只要它是纯文本就可以了。该脚本仅使用文件的内容并创建它找到的所有文件(内容)的编号列表。

在此处输入图片描述

如果代码片段目录 ( ~/.config/snippet_paste) 不存在,脚本会为您创建该目录。

如何使用

  • 首先安装xdotoolxclip如果您的系统上尚未安装:

    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

相关内容