如何仅附加到剪贴板(但不覆盖当前数据)?

如何仅附加到剪贴板(但不覆盖当前数据)?

我有一个相当大的文件,我需要将所有内容复制到某个地方,但当我向下滚动页面时,我选择的所有数据都变为未选中状态。我可以逐块复制和粘贴,但由于数据量很大,我发现将内容附加到当前剪贴板数据的末尾会更容易。这样可以吗?

这样我就可以有一个键盘快捷键,使我能够将其复制到剪贴板:

I am some nice new text.

当它已经存在时:

I am the old text.

粘贴后看起来像这样:

I am the old text.
I am some nice new text.

因此,我真正想要的是以下 3 点(我会使用 3 个单独的键盘快捷键来实现这一点):

  1. 将数据附加到剪贴板的末尾并将其放在前面RETURN(如上例所示)。

  2. 将数据附加到剪贴板的末尾,但其前面不要有任何内容,RETURN以便它最初在同一行上继续。

  3. 拥有这一切,但是为了将数据放在剪贴板的开头,放在当前存在的所有数据之前。

我正在运行带有 GNOME 3.20 的 Ubuntu GNOME 16.04。

答案1

它很简单,但是你需要xsel先安装该工具:

sudo apt-get install xsel

总结:以下是您最终可能想要用作快捷方式的命令。我使用带有printf所有版本的命令来保持一致性和更易于自定义,即使更简单的版本就足够了:

  • 将选择内容直接附加到剪贴板末尾:

    bash -c 'printf "%b%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • 将选择内容附加到剪贴板末尾的换行符后:

    bash -c 'printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c'
    
  • 将选择内容直接附加到剪贴板的开头:

    bash -c 'printf "%b%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    
  • 将选择内容附加到剪贴板的开始处换行后:

    bash -c 'printf "%b\n%b" "$(xsel)" "$(xsel -b)" | xsel -ib ; xsel -c'
    

它们都包括在附加到剪贴板后重置主缓冲区,以防止重复附加相同的内容。如果您不想这样,请; xsel -c从每个命令的末尾删除。


详细解释:

你必须知道 X 包含 3 个缓冲区,基本的选择,次要的选择和剪贴板

Ctrl您从+ CCtrl+等了解剪贴板V。它是您通常用来复制和粘贴内容的缓冲区。

然而,主要选择是缓冲区,它始终自动包含您选择的文本,无论它位于哪个窗口,也无需任何额外的用户交互。
我们只有一个问题:当您选择文本片段时,缓冲区会更新,但当您单击其他任何地方取消选择时,它不会被清除。它仍将包含您上次选择的内容。

二次选择仅被少数程序使用,并且对我们来说并不重要。


Ctrl这意味着我们可以使用下面的命令模仿+的行为C,将主要选择(最后突出显示的文本)复制到剪贴板:

xsel | xsel -ib

xsel不带任何参数将主要选择的内容打印到 STDOUT。将数据从 STDINxsel -ab写入(-i)到剪贴板(-b)。


要直接将数据附加到当前剪贴板内容(中间没有换行符)而不是替换它,我们使用 选项-a而不是-i。此命令将最后选定的文本片段附加到当前剪贴板内容:

xsel | xsel -ab

如果您确实需要额外的换行符或任何其他格式,我们可以通过管道传输数据printf或使用您想要使用的任何其他工具来处理它。以下是读取最后一个选择和当前剪贴板内容并使用换行符将它们连接在一起的示例:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib

xsel -b返回当前剪贴板内容。格式字符串printf用作%b参数的占位符,\n表示换行符。您可以printf通过输入来了解更多信息man printf

通过交换字符串末尾的两个参数,您可以反转它们的顺序并附加到开头而不是结尾。


如果您想避免意外地将相同的数据附加到剪贴板两次(如果您想附加两次,则必须再次选择它!),您可以在执行以下命令后手动清除主选择缓冲区:

xsel -c

只需在基本剪贴板附加命令之后运行该命令即可,如下所示:

printf "%b\n%b" "$(xsel -b)" "$(xsel)" | xsel -ib ; xsel -c

了解了所有这些之后,您就可以为键盘快捷键编写执行您想要的操作的命令,但请记住,我们的单行命令都大量使用了管道等 Bash 功能,因此您需要使用 Bash 运行它们:

bash -c 'COMMAND'

请参阅答案顶部的 TL;DR 部分,了解适合创建快捷方式的命令列表。

答案2

X 服务器有多个剪贴板。带有Ctrl+ 的C剪贴板称为剪贴板,突出显示某些内容xclip的剪贴板称为主剪贴板。允许粘贴任一输出。例如,我复制了问题的一部分,但在终端中突出显示了其他一些文本:

在此处输入图片描述

您可以在与键盘快捷键连接的脚本中进一步使用该想法。事实上,我已经编写了一个脚本,发布为github要点

基本思路是将其绑定到键盘快捷键。突出显示要附加的内容,然后按快捷键。例如,我将我的快捷键绑定到Ctrl+ Alt+ V。确切的命令是python /path/to/file.py

使用示例:

  1. 突出显示I have a rather large file帖子中的部分内容,然后使用 Ctrl+复制C
  2. 例如突出显示其他内容That is so that I can have a keyboard shortcut
  3. 按下你的快捷键(我的是Ctrl+ Alt+ V
  4. Ctrl使用+将附加的剪贴板释放到某处V。结果输出为:I have a rather large fileThat is so that I can have a keyboard shortcut

脚本源

 import gi
    gi.require_version('Notify', '0.7')
    from gi.repository import Notify
    import subprocess
    import os
    import sys

    # This script is meant to be bound to keyboard shortcut

    def send_notification(title, text):
        Notify.init(sys.argv[0])
        n = Notify.Notification.new(title, text)
        n.show()


    def run_cmd(cmdlist):
        # function for running 
        try:
            stdout = subprocess.check_output(cmdlist)
        except subprocess.CalledProcessError:
              send_notification(sys.argv[0],"Clipboard error")
              sys.exit(1)
        else:
            if stdout:
                return  stdout



    # get contents of both clipboards
    clip = run_cmd("xclip -o -sel clip".split())
    primary = run_cmd("xclip -o -sel primary".split())

    # write to temp file contents
    # of both clipboards appended
    temp_file = "/tmp/append.clip"
    f = open(temp_file, "w")
    f.write( clip + primary  )
    f.close()

    # Read the new contents into clipboard
    run_cmd(("xclip -sel clip " + temp_file).split())

    # clean up
    os.remove(temp_file)

笔记:

  • xclip必须通过安装sudo apt-get install xclip
  • 我写过适用于 Unity 的 Ubuntu 剪贴板管理器指示器桌面,可以使用正则表达式(sed和 Pythonre风格)将重复的字符串附加到剪贴板。例如,如果您经常需要一遍又一遍地附加相同的字符串,则可以使用以下 Pythonre正则表达式:

在此处输入图片描述

答案3

这是另一种非常简单的方法,使用简短的 Bash 脚本。首先确保已安装 xclip。然后按如下方式创建您的 bash 脚本:

#!bin/bash
p=$(xclip -selection primary -o)
c=$(xclip -selection clipboard -o)
new=$'\n'
echo "$c$new$p" | xclip -selection clip

我们将此文件命名为 apndpc.sh 并将其放在某个文件夹中,例如 ~/myscripts 现在将用户定义的键绑定到此。通过系统设置>>键盘执行此操作,然后单击快捷方式选项卡。单击自定义快捷方式,然后单击 + 号以添加所需的组合键。在命令框中输入:

bash -c'bash〜/ myscripts / apndclp.sh'

然后定义您的组合键。我使用 ALT+3 来触发操作。

就是这样。您已准备好进行大规模复制操作。使用常规 Ctrl+c(或右键单击并选择复制)复制第一段文本。选择下一段(仅选择不复制),然后按快捷键(ATL+3)。这会将选定的文本附加到剪贴板。继续执行此操作,直到完成。然后像往常一样粘贴,即 CTRL+v(或右键单击并选择粘贴)以转储最终累积的文本。

如果您不喜欢上述脚本中的字符串操作,那么请使用此脚本:

#!bin/bash
# this is another version of clipboard append tool
# here we use a temporary file to append highlighted text to the clipboard
# the temporary file is deleted at the end of the operation

tmpfile="file111000111"
xclip -selection clipboard -o  > $tmpfile   # first dump the current clipboard to the tmpfile
printf '\n' >> $tmpfile                     # then add new line
xclip -selection primary -o >> $tmpfile     # and finally add the highlighted text
cat $tmpfile | xclip -selection clip        # now read the file back into the clipboard
rm $tmpfile             # and remove the tempfile

答案4

我使用一个名为 clipit 的剪贴板管理器。

然后,每当我想查看键盘上的最后内容时,我都会在控制台上执行此操作:

strings ~/.local/share/clipit/history

它将打印以 分隔的剪贴板历史记录\n

相关内容